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

Merge branch 'dev' into master_cart

# Conflicts:
#	src/main/vue/src/router.js
wangqifan 2 лет назад
Родитель
Сommit
beeaeaac9f
100 измененных файлов с 2424 добавлено и 909 удалено
  1. 3 0
      package-lock.json
  2. 7 0
      src/main/java/com/izouma/nineth/config/CacheConfig.java
  3. 8 8
      src/main/java/com/izouma/nineth/config/RiceScheduledTasksConfig.java
  4. 5 2
      src/main/java/com/izouma/nineth/domain/Collection.java
  5. 15 0
      src/main/java/com/izouma/nineth/domain/DomainOrder.java
  6. 94 0
      src/main/java/com/izouma/nineth/domain/Hyperlink.java
  7. 17 4
      src/main/java/com/izouma/nineth/domain/Order.java
  8. 6 0
      src/main/java/com/izouma/nineth/domain/Rice.java
  9. 8 0
      src/main/java/com/izouma/nineth/domain/WithdrawApply.java
  10. 23 11
      src/main/java/com/izouma/nineth/domain/nftdomain/Cart.java
  11. 55 0
      src/main/java/com/izouma/nineth/domain/nftdomain/DomainAsk.java
  12. 30 0
      src/main/java/com/izouma/nineth/dto/nftdomain/DomainAskGroup.java
  13. 18 0
      src/main/java/com/izouma/nineth/dto/nftdomain/DomainTop.java
  14. 2 2
      src/main/java/com/izouma/nineth/enums/BalanceType.java
  15. 22 0
      src/main/java/com/izouma/nineth/enums/DomainAskStatus.java
  16. 18 0
      src/main/java/com/izouma/nineth/enums/HyperLinkType.java
  17. 17 0
      src/main/java/com/izouma/nineth/enums/OrderType.java
  18. 2 1
      src/main/java/com/izouma/nineth/enums/TransferReason.java
  19. 14 3
      src/main/java/com/izouma/nineth/enums/WithdrawStatus.java
  20. 14 9
      src/main/java/com/izouma/nineth/event/CreateOrderEvent.java
  21. 65 7
      src/main/java/com/izouma/nineth/listener/CreateOrderListener.java
  22. 12 1
      src/main/java/com/izouma/nineth/repo/AssetRepo.java
  23. 2 0
      src/main/java/com/izouma/nineth/repo/CollectionRepo.java
  24. 5 0
      src/main/java/com/izouma/nineth/repo/DomainOrderRepo.java
  25. 16 0
      src/main/java/com/izouma/nineth/repo/HyperlinkRepo.java
  26. 5 1
      src/main/java/com/izouma/nineth/repo/OrderRepo.java
  27. 10 0
      src/main/java/com/izouma/nineth/repo/RiceInviteRepo.java
  28. 10 0
      src/main/java/com/izouma/nineth/repo/RiceOperationRecordRepo.java
  29. 4 0
      src/main/java/com/izouma/nineth/repo/nftdomain/CartRepo.java
  30. 37 0
      src/main/java/com/izouma/nineth/repo/nftdomain/DomainAskRepo.java
  31. 237 232
      src/main/java/com/izouma/nineth/service/AssetService.java
  32. 4 0
      src/main/java/com/izouma/nineth/service/CacheService.java
  33. 13 0
      src/main/java/com/izouma/nineth/service/CollectionService.java
  34. 49 11
      src/main/java/com/izouma/nineth/service/DomainOrderService.java
  35. 25 0
      src/main/java/com/izouma/nineth/service/HyperlinkService.java
  36. 15 3
      src/main/java/com/izouma/nineth/service/MintActivityService.java
  37. 22 0
      src/main/java/com/izouma/nineth/service/OrderCancelService.java
  38. 57 42
      src/main/java/com/izouma/nineth/service/OrderPayService.java
  39. 481 327
      src/main/java/com/izouma/nineth/service/OrderService.java
  40. 175 61
      src/main/java/com/izouma/nineth/service/RiceService.java
  41. 195 153
      src/main/java/com/izouma/nineth/service/UserBalanceService.java
  42. 32 2
      src/main/java/com/izouma/nineth/service/nftdomain/CartService.java
  43. 160 0
      src/main/java/com/izouma/nineth/service/nftdomain/DomainAskService.java
  44. 1 0
      src/main/java/com/izouma/nineth/utils/excel/ExcelUtils.java
  45. 43 0
      src/main/java/com/izouma/nineth/utils/excel/WithdrawStatusConverter.java
  46. 19 0
      src/main/java/com/izouma/nineth/web/CollectionController.java
  47. 42 1
      src/main/java/com/izouma/nineth/web/DomainOrderController.java
  48. 62 0
      src/main/java/com/izouma/nineth/web/HyperlinkController.java
  49. 15 3
      src/main/java/com/izouma/nineth/web/MintActivityController.java
  50. 30 13
      src/main/java/com/izouma/nineth/web/OrderController.java
  51. 6 0
      src/main/java/com/izouma/nineth/web/OrderPayControllerV2.java
  52. 1 1
      src/main/java/com/izouma/nineth/web/RiceController.java
  53. 9 0
      src/main/java/com/izouma/nineth/web/RiceInviteController.java
  54. 73 7
      src/main/java/com/izouma/nineth/web/nftdomain/CartController.java
  55. 112 0
      src/main/java/com/izouma/nineth/web/nftdomain/DomainAskController.java
  56. 1 1
      src/main/nine-space/.env.app_raex
  57. 0 0
      src/main/resources/static/web-mobile/assets/internal/config.json
  58. 0 0
      src/main/resources/static/web-mobile/assets/internal/import/02/02229b71c.json
  59. 0 0
      src/main/resources/static/web-mobile/assets/internal/import/0e/0e59a4145.json
  60. 0 0
      src/main/resources/static/web-mobile/assets/main/config.json
  61. 0 0
      src/main/resources/static/web-mobile/assets/main/import/04/047fd44c3.json
  62. 0 1
      src/main/resources/static/web-mobile/assets/main/import/05/0540da930.json
  63. 0 1
      src/main/resources/static/web-mobile/assets/main/import/05/05ec77bf4.json
  64. 0 0
      src/main/resources/static/web-mobile/assets/main/import/06/06c153673.json
  65. 0 0
      src/main/resources/static/web-mobile/assets/main/import/08/08997832d.json
  66. 0 0
      src/main/resources/static/web-mobile/assets/main/import/0e/0eb5cd0fc.json
  67. 0 0
      src/main/resources/static/web-mobile/assets/main/import/0f/0fd2db246.json
  68. BIN
      src/main/resources/static/web-mobile/assets/main/import/56/56c49332-afff-453f-92cf-4a474f92bce9@9f0d6.cconb
  69. BIN
      src/main/resources/static/web-mobile/assets/main/import/ac/ac5e989e-666e-45d7-a349-b66da3ed049c@48976.cconb
  70. 1 0
      src/main/resources/static/web-mobile/assets/main/import/ba/ba21476f-2866-4f81-9c4d-6e359316e448.json
  71. 0 1
      src/main/resources/static/web-mobile/assets/main/index.js
  72. BIN
      src/main/resources/static/web-mobile/assets/main/native/09/0957b052-9e15-4390-90e5-dec587a22d6a.jpg
  73. BIN
      src/main/resources/static/web-mobile/assets/main/native/0f/0f8a440e-1fca-4d0c-85ab-f6683f4bb81d.png
  74. BIN
      src/main/resources/static/web-mobile/assets/main/native/12/1263d74c-8167-4928-91a6-4e2672411f47@2e76e.bin
  75. BIN
      src/main/resources/static/web-mobile/assets/main/native/12/1263d74c-8167-4928-91a6-4e2672411f47@fc873.bin
  76. BIN
      src/main/resources/static/web-mobile/assets/main/native/16/16385755-58cc-41c6-b460-34c9a66f7f80.jpg
  77. BIN
      src/main/resources/static/web-mobile/assets/main/native/1a/1a17e585-f41e-4064-80cc-caa340be9a55.jpg
  78. BIN
      src/main/resources/static/web-mobile/assets/main/native/1d/1d613f5d-0d3c-49fd-95f0-45ada8f340b0.png
  79. BIN
      src/main/resources/static/web-mobile/assets/main/native/1d/1dfc770d-f5bd-4e81-be18-e7ff20933fc3.jpg
  80. BIN
      src/main/resources/static/web-mobile/assets/main/native/2d/2d4f1c99-a696-48fd-9799-7361abd09c54.png
  81. BIN
      src/main/resources/static/web-mobile/assets/main/native/2e/2eb6a0cb-8303-4823-9309-f517a7566c02.png
  82. BIN
      src/main/resources/static/web-mobile/assets/main/native/39/390f2482-37b1-4b15-8663-b14a91817067.png
  83. BIN
      src/main/resources/static/web-mobile/assets/main/native/39/39a35d57-a25a-4ed7-8d1a-10ff68704eb3.jpg
  84. BIN
      src/main/resources/static/web-mobile/assets/main/native/3b/3bce75d8-370e-4d49-939f-6188ebd60c15@b47c0@40c10.png
  85. BIN
      src/main/resources/static/web-mobile/assets/main/native/3b/3bce75d8-370e-4d49-939f-6188ebd60c15@b47c0@74afd.png
  86. BIN
      src/main/resources/static/web-mobile/assets/main/native/3b/3bce75d8-370e-4d49-939f-6188ebd60c15@b47c0@7d38f.png
  87. BIN
      src/main/resources/static/web-mobile/assets/main/native/3b/3bce75d8-370e-4d49-939f-6188ebd60c15@b47c0@8fd34.png
  88. BIN
      src/main/resources/static/web-mobile/assets/main/native/3b/3bce75d8-370e-4d49-939f-6188ebd60c15@b47c0@bb97f.png
  89. BIN
      src/main/resources/static/web-mobile/assets/main/native/3b/3bce75d8-370e-4d49-939f-6188ebd60c15@b47c0@e9a6d.png
  90. BIN
      src/main/resources/static/web-mobile/assets/main/native/3d/3d8bf198-fdd5-4fad-8364-bb9c79c3af10.jpg
  91. BIN
      src/main/resources/static/web-mobile/assets/main/native/46/4668b013-2ed9-4731-b896-d7ea3b296493.jpg
  92. BIN
      src/main/resources/static/web-mobile/assets/main/native/46/468525b9-cc53-4d1d-82f0-b6fd624eb41c.png
  93. BIN
      src/main/resources/static/web-mobile/assets/main/native/4a/4a72b62d-eb28-4c22-95f3-82316579bc39.png
  94. BIN
      src/main/resources/static/web-mobile/assets/main/native/4a/4a9f5563-7f98-4d63-b316-802ec2f7f39b.png
  95. BIN
      src/main/resources/static/web-mobile/assets/main/native/4b/4bc944d6-0cff-464f-beeb-1c9e38ec4309.png
  96. BIN
      src/main/resources/static/web-mobile/assets/main/native/52/526c4afc-c5d9-4e49-a54b-576b5808f755.png
  97. BIN
      src/main/resources/static/web-mobile/assets/main/native/57/57520716-48c8-4a19-8acf-41c9f8777fb0.png
  98. BIN
      src/main/resources/static/web-mobile/assets/main/native/5a/5a2cef41-7638-4ded-b393-10b3da99927c.jpg
  99. BIN
      src/main/resources/static/web-mobile/assets/main/native/5c/5cde21b9-66fe-4055-ac40-350562ecf807.mp4
  100. BIN
      src/main/resources/static/web-mobile/assets/main/native/61/6195e3c3-218b-4721-8c5c-0b37c2b39924.jpg

+ 3 - 0
package-lock.json

@@ -0,0 +1,3 @@
+{
+  "lockfileVersion": 1
+}

+ 7 - 0
src/main/java/com/izouma/nineth/config/CacheConfig.java

@@ -168,6 +168,13 @@ public class CacheConfig {
         cacheNamesConfigurationMap.put("newestOrder", RedisCacheConfiguration.defaultCacheConfig()
                 .entryTtl(Duration.ofMinutes(15))
                 .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer())));
+        cacheNamesConfigurationMap.put("domainBuyerTop", RedisCacheConfiguration.defaultCacheConfig()
+                .entryTtl(Duration.ofDays(7))
+                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer())));
+        cacheNamesConfigurationMap.put("countByPrefix", RedisCacheConfiguration.defaultCacheConfig()
+                .entryTtl(Duration.ofMinutes(15))
+                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer())));
+
         RedisCacheManager redisCacheManager = RedisCacheManager.builder()
                 .cacheWriter(RedisCacheWriter.nonLockingRedisCacheWriter(redisTemplate.getConnectionFactory()))
                 .withInitialCacheConfigurations(cacheNamesConfigurationMap)

+ 8 - 8
src/main/java/com/izouma/nineth/config/RiceScheduledTasksConfig.java

@@ -21,14 +21,14 @@ public class RiceScheduledTasksConfig {
     @Autowired
     private RiceInviteRepo riceInviteRepo;
 
-    @Scheduled(cron = "0 0 0 * * ?")
-    public void InviteExchangeCount() {
-        List<Rice> riceList = riceRepo.findAll();
-        for (Rice rice : riceList) {
-            rice.setInviteCount(0);
-        }
-        riceRepo.saveAll(riceList);
-    }
+//    @Scheduled(cron = "0 0 0 * * ?")
+//    public void InviteExchangeCount() {
+//        List<Rice> riceList = riceRepo.findAll();
+//        for (Rice rice : riceList) {
+//            rice.setInviteCount(0);
+//        }
+//        riceRepo.saveAll(riceList);
+//    }
 
     @Scheduled(cron = "0 0 0 * * ?")
     public void resetExchangeCount() {

+ 5 - 2
src/main/java/com/izouma/nineth/domain/Collection.java

@@ -272,10 +272,10 @@ public class Collection extends CollectionBaseEntity {
     @Column(columnDefinition = "TEXT")
     private String rule;
 
-    private String hcTxHash;
+    private String     hcTxHash;
     private BigInteger hcBlockNumber;
     private BigInteger hcGasUsed;
-    private String hcTokenId;
+    private String     hcTokenId;
 
     @ApiModelProperty("系列名称")
     @Column(length = 100)
@@ -309,4 +309,7 @@ public class Collection extends CollectionBaseEntity {
     @ApiModelProperty("元宇宙尺寸")
     @Enumerated(EnumType.STRING)
     private MetaSize metaSize;
+
+    @Transient
+    private Long transferringCount;
 }

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

@@ -6,6 +6,7 @@ import com.izouma.nineth.annotations.Searchable;
 import com.izouma.nineth.converter.FileObjectConverter;
 import com.izouma.nineth.converter.FileObjectListConverter;
 import com.izouma.nineth.enums.CollectionStatus;
+import com.izouma.nineth.enums.HyperLinkType;
 import com.izouma.nineth.enums.OrderStatus;
 import com.izouma.nineth.enums.PayMethod;
 import io.swagger.annotations.ApiModelProperty;
@@ -78,4 +79,18 @@ public class DomainOrder extends BaseEntity {
     private LocalDateTime endTime;
 
     private String result;
+
+    @ApiModelProperty("是否打开超链")
+    private boolean openHyperLink = false;
+
+    @ApiModelProperty("超链类型")
+    @Enumerated(EnumType.STRING)
+    private HyperLinkType hyperLinkType;
+
+    @ApiModelProperty("超链地址")
+    private String address;
+
+    @Column(name = "current_owner_id")
+    @ApiModelProperty("当前使用nft域名的人的id")
+    private Long CurrentOwnerId;
 }

+ 94 - 0
src/main/java/com/izouma/nineth/domain/Hyperlink.java

@@ -0,0 +1,94 @@
+package com.izouma.nineth.domain;
+
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.izouma.nineth.annotations.Searchable;
+import com.izouma.nineth.converter.FileObjectListConverter;
+import com.izouma.nineth.enums.CollectionStatus;
+import com.izouma.nineth.enums.HyperLinkType;
+import com.izouma.nineth.enums.OrderStatus;
+import com.izouma.nineth.enums.PayMethod;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class Hyperlink extends UserBaseEntity {
+
+    @ApiModelProperty("用户id")
+    @ExcelProperty("用户id")
+    private Long             userId;
+    @ApiModelProperty("用户名")
+    @ExcelProperty("用户名")
+    private String           userName;
+    @ApiModelProperty("用户头像")
+    private String           userAvatar;
+    @ApiModelProperty("图片")
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = FileObjectListConverter.class)
+    private List<FileObject> pic;
+    @ApiModelProperty("图片名称")
+    @ExcelProperty("图片名称")
+    private String           picName;
+    @ApiModelProperty("图片名称")
+    @ExcelProperty("图片名称")
+    private String           domainName;
+    @ApiModelProperty("状态")
+    @Enumerated(EnumType.STRING)
+    private CollectionStatus status;
+
+    private String auditResult;
+
+    @ExcelProperty("创建藏品id")
+    private Long createAssetId;
+
+    @ExcelProperty("拥有者id")
+    private Long ownerId;
+
+    private boolean gifted;
+
+    @ApiModelProperty("交易ID")
+    @ExcelProperty("交易id")
+    @Searchable
+    @Column(length = 90)
+    private String transactionId;
+
+    @Enumerated(EnumType.STRING)
+    private OrderStatus orderStatus;
+
+    @Enumerated(EnumType.STRING)
+    private PayMethod payMethod;
+
+    private boolean destroyed;
+
+    @ExcelProperty("价格")
+    private BigDecimal price;
+
+    private Long years;
+
+    private LocalDateTime endTime;
+
+    private String result;
+
+    @ApiModelProperty("是否打开超链")
+    private boolean openHyperLink;
+
+    @ApiModelProperty("超链类型")
+    @Enumerated(EnumType.STRING)
+    private HyperLinkType hyperLinkType;
+
+    @ApiModelProperty("超链地址")
+    private String address;
+
+}

+ 17 - 4
src/main/java/com/izouma/nineth/domain/Order.java

@@ -7,10 +7,7 @@ import com.izouma.nineth.annotations.SearchableOne;
 import com.izouma.nineth.converter.FileObjectListConverter;
 import com.izouma.nineth.converter.PrivilegeListConverter;
 import com.izouma.nineth.converter.PropertyListConverter;
-import com.izouma.nineth.enums.CollectionSource;
-import com.izouma.nineth.enums.CollectionType;
-import com.izouma.nineth.enums.OrderStatus;
-import com.izouma.nineth.enums.PayMethod;
+import com.izouma.nineth.enums.*;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -222,4 +219,20 @@ public class Order extends BaseEntityNoID {
 
     @Column(columnDefinition = "bigint default 1 not null")
     private Long companyId;
+
+    @ApiModelProperty("类型")
+    @Enumerated(EnumType.STRING)
+    private OrderType orderType;
+
+    private Long parentOrderId;
+
+    private String collectionIds;
+
+    private String subOrderIds;
+
+    @Transient
+    private List<Order> subOrders;
+
+    @Transient
+    private List<Collection> collections;
 }

+ 6 - 0
src/main/java/com/izouma/nineth/domain/Rice.java

@@ -1,6 +1,8 @@
 package com.izouma.nineth.domain;
 
 
+import com.izouma.nineth.annotations.Searchable;
+import com.izouma.nineth.enums.SearchMode;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -29,6 +31,10 @@ public class Rice extends BaseEntity {
     @ApiModelProperty("昵称")
     private String nickname;
 
+    @Searchable(mode = SearchMode.EXACT)
+    private String phone;
+
+
     @ApiModelProperty("等级")
     private Long level;
 

+ 8 - 0
src/main/java/com/izouma/nineth/domain/WithdrawApply.java

@@ -1,5 +1,6 @@
 package com.izouma.nineth.domain;
 
+import com.alibaba.excel.annotation.ExcelProperty;
 import com.izouma.nineth.annotations.Searchable;
 import com.izouma.nineth.enums.WithdrawStatus;
 import lombok.AllArgsConstructor;
@@ -22,19 +23,26 @@ import java.time.LocalDateTime;
 public class WithdrawApply extends BaseEntity {
 
     @Searchable
+    @ExcelProperty("用户ID")
     private Long userId;
 
+    @ExcelProperty("金额")
     private BigDecimal amount;
 
     @Enumerated(EnumType.STRING)
     @Column(length = 20)
+    @ExcelProperty("状态")
     private WithdrawStatus status;
 
+    @ExcelProperty("原因")
     private String reason;
 
+    @ExcelProperty("提现id")
     private String withdrawId;
 
+    @ExcelProperty("提现方式")
     private String channel;
 
+    @ExcelProperty("时间")
     private LocalDateTime finishTime;
 }

+ 23 - 11
src/main/java/com/izouma/nineth/domain/nftdomain/Cart.java

@@ -1,6 +1,8 @@
 package com.izouma.nineth.domain.nftdomain;
 
+import com.izouma.nineth.converter.FileObjectListConverter;
 import com.izouma.nineth.domain.BaseEntity;
+import com.izouma.nineth.domain.FileObject;
 import com.izouma.nineth.enums.CollectionType;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -9,11 +11,10 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
+import javax.persistence.*;
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
 
 @Data
 @Entity
@@ -22,14 +23,25 @@ import java.math.BigDecimal;
 @Builder
 @ApiModel("系列活动")
 public class Cart extends BaseEntity {
-    private Long           userId;
-    private Long           collectionId;
-    private String         collectionName;
-    private String         pic;
-    private BigDecimal     price;
-    private boolean        enabled = false;
+    private Long             userId;
+    private Long             collectionId;
+    private String           collectionName;
+    private String           pic;
+    @ApiModelProperty("图片")
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = FileObjectListConverter.class)
+    private List<FileObject> picFile;
+    private BigDecimal       price;
+    private boolean          enabled  = false;
+    private Long             ownerId;
+    private String           owner;
+    private String           ownerAvatar;
     @ApiModelProperty("类型")
     @Enumerated(EnumType.STRING)
     @Column(length = 20)
-    private CollectionType type;
+    private CollectionType   type;
+    @Transient
+    private LocalDateTime    endTime;
+    @Transient
+    private boolean          inPaying = false;
 }

+ 55 - 0
src/main/java/com/izouma/nineth/domain/nftdomain/DomainAsk.java

@@ -0,0 +1,55 @@
+package com.izouma.nineth.domain.nftdomain;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.izouma.nineth.converter.FileObjectListConverter;
+import com.izouma.nineth.domain.BaseEntity;
+import com.izouma.nineth.domain.FileObject;
+import com.izouma.nineth.enums.DomainAskStatus;
+import com.izouma.nineth.enums.PayMethod;
+import com.izouma.nineth.enums.PaybackStatus;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("系列活动")
+public class DomainAsk extends BaseEntity {
+    private Long             userId;
+    private Long             domainOrderId;
+    private Long             assetId;
+    private Long             ownerId;
+    private BigDecimal       price;
+    @ApiModelProperty("图片")
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = FileObjectListConverter.class)
+    private List<FileObject> pic;
+    private String           picUrl;
+    private String           nickname;
+    private String           avatar;
+    private String           name;
+    private String           ownerName;
+    private String           ownerAvatar;
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty("空投类型")
+    private DomainAskStatus  status;
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty("空投类型")
+    private PayMethod        payMethod;
+    private String           transactionId;
+    private double           royalties;
+    private double           serviceCharge;
+    private LocalDateTime    endTime;
+
+}

+ 30 - 0
src/main/java/com/izouma/nineth/dto/nftdomain/DomainAskGroup.java

@@ -0,0 +1,30 @@
+package com.izouma.nineth.dto.nftdomain;
+
+import com.izouma.nineth.converter.FileObjectListConverter;
+import com.izouma.nineth.domain.Asset;
+import com.izouma.nineth.domain.FileObject;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Convert;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DomainAskGroup {
+    @Convert(converter = FileObjectListConverter.class)
+    private String pic;
+
+    private Long domainOrderId;
+
+    private Long assetId;
+
+    private Long picName;
+
+    private int countNum;
+
+    private LocalDateTime endTime;
+}

+ 18 - 0
src/main/java/com/izouma/nineth/dto/nftdomain/DomainTop.java

@@ -0,0 +1,18 @@
+package com.izouma.nineth.dto.nftdomain;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DomainTop {
+    private Long       userId;
+    private String     avatar;
+    private String     nickname;
+    private BigDecimal amount;
+    private Long       countNum;
+}

+ 2 - 2
src/main/java/com/izouma/nineth/enums/BalanceType.java

@@ -14,8 +14,8 @@ public enum BalanceType {
     BONUS("奖励"),
     REFUND("退款"),
     TRADE("易拍补偿"),
-    COMMISSION("分销奖励")
-    ;
+    COMMISSION("分销奖励"),
+    ASK("叫价收益");
 
     private final String description;
 

+ 22 - 0
src/main/java/com/izouma/nineth/enums/DomainAskStatus.java

@@ -0,0 +1,22 @@
+package com.izouma.nineth.enums;
+
+public enum DomainAskStatus {
+    NOT_PAID("未支付"),
+    PROCESSING("已支付,处理中"),
+    FINISH("已完成"),
+    CANCELLED("取消"),
+    REFUNDED("已退款"),
+    ASKING("叫价中"),
+    SUCCESS("成功"),
+    FAILURE("失败");
+
+    private final String description;
+
+    DomainAskStatus(String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}

+ 18 - 0
src/main/java/com/izouma/nineth/enums/HyperLinkType.java

@@ -0,0 +1,18 @@
+package com.izouma.nineth.enums;
+
+public enum HyperLinkType {
+    HOMEPAGE("个人主页"),
+    EXTERNALLINK("外部链接"),
+    COLLECTION(" 藏品");
+
+    private final String description;
+
+    HyperLinkType(String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}
+

+ 17 - 0
src/main/java/com/izouma/nineth/enums/OrderType.java

@@ -0,0 +1,17 @@
+package com.izouma.nineth.enums;
+
+public enum OrderType {
+    NORMAL("单个藏品"),
+    MIX("合并订单"),
+    SUB("子订单");
+
+    private final String description;
+
+    OrderType(String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}

+ 2 - 1
src/main/java/com/izouma/nineth/enums/TransferReason.java

@@ -4,7 +4,8 @@ public enum TransferReason {
     TRANSFER("转让"),
     GIFT("转赠"),
     DESTROY("销毁"),
-    AUCTION("拍卖")
+    AUCTION("拍卖"),
+    ASK("叫价")
     ;
 
     TransferReason(String description) {

+ 14 - 3
src/main/java/com/izouma/nineth/enums/WithdrawStatus.java

@@ -1,7 +1,18 @@
 package com.izouma.nineth.enums;
 
 public enum WithdrawStatus {
-    PENDING,
-    SUCCESS,
-    FAIL
+
+    PENDING("待提现"),
+    SUCCESS("成功"),
+    FAIL("失败");
+
+    private final String description;
+
+    WithdrawStatus(String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
 }

+ 14 - 9
src/main/java/com/izouma/nineth/event/CreateOrderEvent.java

@@ -2,6 +2,7 @@ package com.izouma.nineth.event;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.izouma.nineth.enums.OrderType;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -13,19 +14,23 @@ import java.io.Serializable;
 @NoArgsConstructor
 public class CreateOrderEvent implements Serializable {
     @JsonSerialize(using = ToStringSerializer.class)
-    private Long    id;
+    private Long      id;
     @JsonSerialize(using = ToStringSerializer.class)
-    private Long    userId;
+    private Long      userId;
     @JsonSerialize(using = ToStringSerializer.class)
-    private Long    collectionId;
-    private int     qty;
+    private Long      collectionId;
+    private int       qty;
     @JsonSerialize(using = ToStringSerializer.class)
-    private Long    addressId;
+    private Long      addressId;
     @JsonSerialize(using = ToStringSerializer.class)
-    private Long    userCouponId;
+    private Long      userCouponId;
     @JsonSerialize(using = ToStringSerializer.class)
-    private Long    invitor;
-    private boolean vip;
+    private Long      invitor;
+    private boolean   vip;
     @JsonSerialize(using = ToStringSerializer.class)
-    private Long    showroomId;
+    private Long      showroomId;
+    @JsonSerialize(using = ToStringSerializer.class)
+    private OrderType orderType;
+    @JsonSerialize(using = ToStringSerializer.class)
+    private String    collectionIds;
 }

+ 65 - 7
src/main/java/com/izouma/nineth/listener/CreateOrderListener.java

@@ -1,12 +1,17 @@
 package com.izouma.nineth.listener;
 
 import com.izouma.nineth.config.RedisKeys;
+import com.izouma.nineth.domain.FileObject;
 import com.izouma.nineth.domain.Order;
+import com.izouma.nineth.enums.OrderType;
 import com.izouma.nineth.event.CreateOrderEvent;
 import com.izouma.nineth.exception.BusinessException;
+import com.izouma.nineth.repo.OrderRepo;
 import com.izouma.nineth.service.OrderService;
+import com.izouma.nineth.utils.SnowflakeIdWorker;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.rocketmq.spring.annotation.ConsumeMode;
 import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
 import org.apache.rocketmq.spring.core.RocketMQListener;
@@ -14,9 +19,10 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
-import java.util.HashMap;
-import java.util.Map;
+import java.math.BigDecimal;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 @Service
 @Slf4j
@@ -35,11 +41,63 @@ public class CreateOrderListener implements RocketMQListener<CreateOrderEvent> {
         log.info("收到订单创建消息: {}", event.getId());
         Map<String, Object> map = new HashMap<>();
         try {
-            Order order = orderService.create(event.getUserId(), event.getCollectionId(), event.getQty(),
-                    event.getAddressId(), event.getUserCouponId(), event.getInvitor(), event.getId(),
-                    event.isVip(), event.getShowroomId());
-            map.put("success", true);
-            map.put("data", order);
+            if (event.getOrderType().equals(OrderType.NORMAL)) {
+                Order order = orderService.create(event.getUserId(), event.getCollectionId(), event.getQty(),
+                        event.getAddressId(), event.getUserCouponId(), event.getInvitor(), event.getId(),
+                        event.isVip(), event.getShowroomId(), OrderType.NORMAL, null, null, null);
+                map.put("success", true);
+                map.put("data", order);
+            } else {
+                List<String> collectionIds = Arrays.asList(event.getCollectionIds().split(","));
+                Order order = orderService.create(event.getUserId(), Long.valueOf(collectionIds.get(0)), event.getQty(),
+                        event.getAddressId(), event.getUserCouponId(), event.getInvitor(), event.getId(),
+                        event.isVip(), event.getShowroomId(), event.getOrderType(), null, event
+                                .getCollectionIds(), null);
+                List<Order> subOrders = new ArrayList<>();
+                List<Long> successOrderIds = new ArrayList<>();
+                collectionIds.forEach(id -> {
+                    try {
+                        log.info("收到子订单创建消息: {}", event.getId());
+                        Order subOrder = orderService.create(event.getUserId(), Long.valueOf(id), event.getQty(),
+                                event.getAddressId(), event.getUserCouponId(), event.getInvitor(), event.getId(),
+                                event.isVip(), event.getShowroomId(), OrderType.SUB, order.getId(), null, order
+                                        .getId() + Long.parseLong(id));
+                        subOrders.add(subOrder);
+                        successOrderIds.add(Long.parseLong(id));
+                    } catch (Exception e) {
+                        if (e instanceof BusinessException) {
+                            log.error("订单创建失败,id={},{}", event.getId() + "collectionId:" + id, e.getMessage());
+                        } else {
+                            log.error("订单创建失败", e);
+                        }
+//                        log.info("创建子订单出错: {}", event.getId() + "collectionId:" + id);
+////                        collectionIds.remove(id);
+                    }
+                });
+                if (successOrderIds.size() < 1) {
+                    map.put("success", false);
+                    map.put("data", "所有购物车商品已售罄!");
+                    log.info("未创建子订单,取消合并订单: {}", order);
+                    orderService.cancel(order);
+                } else {
+                    BigDecimal total = subOrders.stream().map(Order::getTotalPrice).reduce(BigDecimal::add)
+                                                .orElse(BigDecimal.ZERO);
+                    BigDecimal gas = subOrders.stream().map(Order::getGasPrice).reduce(BigDecimal::add)
+                                              .orElse(BigDecimal.ZERO);
+                    BigDecimal price = subOrders.stream().map(Order::getPrice).reduce(BigDecimal::add)
+                                                .orElse(BigDecimal.ZERO);
+                    List<FileObject> fileObjects = subOrders.get(0).getPic();
+                    String collectionIdSt = StringUtils.join(successOrderIds, ",");
+                    Order newOrder = orderService
+                            .fixMainOrder(order, total, gas, price, fileObjects, collectionIdSt, StringUtils
+                                    .join(subOrders.stream().map(Order::getId).collect(Collectors
+                                            .toList()), ","));
+                    newOrder.setSubOrders(subOrders);
+                    map.put("success", true);
+                    map.put("data", newOrder);
+                    log.info("收到订单创建消息: {}", newOrder);
+                }
+            }
         } catch (Exception e) {
             if (e instanceof BusinessException) {
                 log.error("订单创建失败,id={},{}", event.getId(), e.getMessage());

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

@@ -33,10 +33,14 @@ public interface AssetRepo extends JpaRepository<Asset, Long>, JpaSpecificationE
 
     List<Asset> findAllByCollectionIdInAndStatusIn(List<Long> collectionId, Iterable<AssetStatus> statuses);
 
-    List<Asset> findAllByCollectionIdAndStatusInAndUserId(Long collectionId, Iterable<AssetStatus> statuses,Long userId);
+    List<Asset> findAllByCollectionIdAndStatusInAndUserId(Long collectionId, Iterable<AssetStatus> statuses, Long userId);
 
     List<Asset> findByCreatedAtBefore(LocalDateTime localDateTime);
 
+    Optional<Asset> findByCollectionIdAndStatus(Long collectionId,AssetStatus statuses );
+
+    Optional<Asset> findByIdAndStatus(Long collectionId,AssetStatus statuses );
+
     List<Asset> findByConsignmentTrue();
 
     List<Asset> findByTokenIdIn(Iterable<String> tokenId);
@@ -153,6 +157,9 @@ public interface AssetRepo extends JpaRepository<Asset, Long>, JpaSpecificationE
     @Query("select count(id) from Asset where name like ?1 and status in ('NORMAL','TRADING','GIFTING','MINTING','AUCTIONING','AUCTION_TRADING','DESTROYING') and ownerId <> 1435297")
     Long countNameLikeNotDestroyed(String name);
 
+    @Query("select count(id) from Asset where prefixName like ?1 and status in ('NORMAL','TRADING','GIFTING','MINTING','AUCTIONING','AUCTION_TRADING','DESTROYING') and ownerId <> 1435297")
+    String countPrefixNameLikeNotDestroyed(String name);
+
     @Query(value = "SELECT count(a.id) from asset a where a.name LIKE ?1 and status = 'NORMAL' and owner_id = ?2", nativeQuery = true)
     Long countNameLikeNotDestroyedAndOwner(String name, Long ownerId);
 
@@ -169,6 +176,10 @@ public interface AssetRepo extends JpaRepository<Asset, Long>, JpaSpecificationE
     @Query(nativeQuery = true, value = "select count(a.id) countNum,a.user_Id userId,a.owner_avatar avatar,a.`owner` nickname from asset a inner join `user` u on u.id = a.user_id where a.status = 'NORMAL' and a.type = 'DOMAIN' GROUP BY a.user_id ORDER BY count(a.id) desc limit 60")
     List<Map<String, Object>> domainTop20();
 
+    @Query(nativeQuery = true, value = "select count(a.id) countNum,sum(price) amount,a.user_Id userId,u.avatar avatar,u.nickname nickname from order_info a inner join `user` u on u.id = a.user_id where a.status = 'FINISH' and a.type = 'DOMAIN'\n" +
+            " and a.created_at <= ?2 and a.created_at >= ?1 GROUP BY a.user_id ORDER BY sum(price) desc limit 60")
+    List<Map<String, Object>> domainBuyerTop60(LocalDateTime start, LocalDateTime end);
+
     @Query(nativeQuery = true, value = "update asset a set a.hold_days = null,a.old_hold_days = null where a.name like ?1")
     @Modifying
     @Transactional

+ 2 - 0
src/main/java/com/izouma/nineth/repo/CollectionRepo.java

@@ -223,4 +223,6 @@ public interface CollectionRepo extends JpaRepository<Collection, Long>, JpaSpec
     @Modifying
     @Transactional
     void openTrade(String name);
+
+    Integer countByPrefixNameAndOnShelfAndDelAndSalable(String prefixName, boolean onShelf, boolean del, boolean salable);
 }

+ 5 - 0
src/main/java/com/izouma/nineth/repo/DomainOrderRepo.java

@@ -22,6 +22,11 @@ public interface DomainOrderRepo extends JpaRepository<DomainOrder, Long>, JpaSp
     @Transactional
     void softDelete(Long id);
 
+    @Query(value="SELECT * FROM domain_order WHERE current_owner_id = :currentOwnerId AND open_hyper_link = true", nativeQuery = true)
+    List<DomainOrder> findAllByCurrentOwnerIdAndOpenHyperLinkIsTrue(Long currentOwnerId);
+
+    DomainOrder findByDomainNameAndOrderStatus(String domainName,OrderStatus orderStatus);
+
     List<DomainOrder> findAllByUserIdAndOrderStatus(Long userId, OrderStatus status);
 
     Page<DomainOrder> findAllByOrderStatusOrderByCreatedAtDesc(OrderStatus status, Pageable pageable);

+ 16 - 0
src/main/java/com/izouma/nineth/repo/HyperlinkRepo.java

@@ -0,0 +1,16 @@
+package com.izouma.nineth.repo;
+
+import com.izouma.nineth.domain.Hyperlink;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+
+public interface HyperlinkRepo extends JpaRepository<Hyperlink, Long>, JpaSpecificationExecutor<Hyperlink> {
+    @Query("update Hyperlink t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+}

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

@@ -31,6 +31,8 @@ public interface OrderRepo extends JpaRepository<Order, Long>, JpaSpecificationE
 
     List<Order> findByCollectionId(Long collectionId);
 
+    int countByCollectionIdAndUserIdAndStatus(Long collectionId, Long userId, OrderStatus orderStatus);
+
     int countByUserIdAndCollectionIdAndStatusIn(Long userId, Long collectionId, Iterable<OrderStatus> orderStatuses);
 
     int countByUserIdAndCountIdAndStatusIn(Long userId, String countId, Iterable<OrderStatus> orderStatuses);
@@ -123,5 +125,7 @@ public interface OrderRepo extends JpaRepository<Order, Long>, JpaSpecificationE
     BigDecimal sumSaas(LocalDateTime start, LocalDateTime end);
 
     @Query(nativeQuery = true, value = "select O.`name` domainName,u.nickname nickname from order_info o inner join asset a on o.asset_id = a.id inner join user u on u.id = o.user_id where o.status = 'FINISH' and (a.prefix_name = 'RID3' or prefix_name = 'RIDN3') order by o.pay_time desc LIMIT 50")
-    List<Map<String,Object>> newestDomainOrder();
+    List<Map<String, Object>> newestDomainOrder();
+
+    List<Order> findAllByParentOrderId(Long id);
 }

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

@@ -6,6 +6,7 @@ import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 
 import javax.transaction.Transactional;
 import java.util.Optional;
@@ -27,4 +28,13 @@ public interface RiceInviteRepo extends JpaRepository<RiceInvite, Long>, JpaSpec
     Optional<RiceInvite> findByHelperIdAndCreateTimeBetween(Long helperId, Long todayStartTime, Long todayEndTime);
 
     Optional<RiceInvite> findByHelpeeIdAndDelIsFalseAndCreateTimeBetween(Long helpeeId, Long todayStartTime, Long todayEndTime);
+
+
+
+
+    @Query("SELECT COUNT(r) FROM RiceInvite r WHERE r.helpeeId = :helpeeId AND r.createTime >= :todayStartTime AND r.createTime < :todayEndTime")
+    int countRiceInviteBy(@Param("helpeeId") Long helpeeId, @Param("todayStartTime") Long todayStartTime, @Param("todayEndTime") Long todayEndTime);
+
+
+
 }

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

@@ -1,16 +1,26 @@
 package com.izouma.nineth.repo;
 
+import com.alipay.mychain.sdk.vm.abi.datatype.Int;
 import com.izouma.nineth.domain.RiceOperationRecord;
+import com.izouma.nineth.enums.RiceOperationType;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 
 import javax.transaction.Transactional;
+import java.time.LocalDateTime;
 
 public interface RiceOperationRecordRepo extends JpaRepository<RiceOperationRecord, Long>, JpaSpecificationExecutor<RiceOperationRecord> {
     @Query("update RiceOperationRecord t set t.del = true where t.id = ?1")
     @Modifying
     @Transactional
     void softDelete(Long id);
+
+
+//    @Query(value = "SELECT COUNT(*) FROM rice_operation_record AS r WHERE r.user_id = ?1 AND r.type = ?2 AND r.modified_at >= ?3 AND r.modified_at <= ?4", nativeQuery = true)
+//    Int countTodayRiceOperationType(Long userId, RiceOperationType type, LocalDateTime todayStartTime, LocalDateTime todayEndTime);
+
+    @Query("SELECT COUNT(r) FROM RiceOperationRecord r WHERE r.userId = :userId AND r.type = :type AND r.modifiedAt >= :todayStartTime AND r.modifiedAt <= :todayEndTime")
+    int countTodayRiceOperationType(Long userId, RiceOperationType type, LocalDateTime todayStartTime, LocalDateTime todayEndTime);
 }

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

@@ -17,4 +17,8 @@ public interface CartRepo extends JpaRepository<Cart, Long>, JpaSpecificationExe
     Long countAllByUserIdAndCollectionIdAndDel(Long userId, Long collectionId, boolean del);
 
     Long countAllByUserIdAndDel(Long userId, boolean del);
+
+    Long countAllByUserIdAndDelAndEnabled(Long userId, boolean del, boolean enabled);
+
+    Cart findFirstByCollectionIdAndUserIdAndDel(Long collectionId,Long userId,boolean del);
 }

+ 37 - 0
src/main/java/com/izouma/nineth/repo/nftdomain/DomainAskRepo.java

@@ -0,0 +1,37 @@
+package com.izouma.nineth.repo.nftdomain;
+
+import com.izouma.nineth.domain.nftdomain.DomainAsk;
+import com.izouma.nineth.dto.nftdomain.DomainAskGroup;
+import com.izouma.nineth.enums.DomainAskStatus;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public interface DomainAskRepo extends JpaRepository<DomainAsk, Long>, JpaSpecificationExecutor<DomainAsk> {
+    @Query("update DomainAsk t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    List<DomainAsk> findByStatusAndCreatedAtBeforeAndDelFalse(DomainAskStatus domainAskStatus, LocalDateTime end);
+
+    @Query(nativeQuery = true, value = "select price from domain_ask where domain_order_id = ?1 and status = 'ASKING' order by price desc limit 1")
+    BigDecimal findMaxPrice(Long domainOrderId);
+
+    @Query(nativeQuery = true, value = "select count(da.id) count,da.pic_url pic,da.domain_order_id domainOrderId,a.id assetId,da.`name` picName,da.end_time endTime from domain_ask da inner join asset a on a.id = da.asset_id where da.status = 'ASKING' and da.owner_id = ?1 and a.status = 'NORMAL' group by da.asset_id order by a.created_at desc ")
+    List<Map<String, Object>> askGroup(Long userId);
+
+    int countByAssetIdAndUserIdAndStatusInAndDelFalse(Long assetId, Long userId, Set<DomainAskStatus> statuses);
+
+    int countByAssetIdAndOwnerIdAndStatusInAndDelFalse(Long assetId, Long userId, Set<DomainAskStatus> statuses);
+
+    List<DomainAsk> findByAssetIdAndStatusAndDelFalse(Long assetId, DomainAskStatus domainAskStatus);
+}

+ 237 - 232
src/main/java/com/izouma/nineth/service/AssetService.java

@@ -121,8 +121,9 @@ public class AssetService {
         }
         // 取出资产中未开启盲盒数据
         List<Asset> blindBoxClosedAssets = assets.stream()
-                .filter(asset -> !asset.isOpened() && CollectionType.BLIND_BOX.equals(asset.getType()))
-                .collect(Collectors.toList());
+                                                 .filter(asset -> !asset.isOpened() && CollectionType.BLIND_BOX
+                                                         .equals(asset.getType()))
+                                                 .collect(Collectors.toList());
         if (CollectionUtils.isNotEmpty(blindBoxClosedAssets)) {
             blindBoxClosedAssets.forEach(asset -> {
                 assetDTOs.add(AssetDTO.create(Lists.newArrayList(asset)));
@@ -132,8 +133,8 @@ public class AssetService {
         }
         // 取出资产中所有未设置prefixName的值
         List<Asset> prefixNameIsNullAssets = assets.stream()
-                .filter(asset -> StringUtils.isBlank(asset.getPrefixName()))
-                .collect(Collectors.toList());
+                                                   .filter(asset -> StringUtils.isBlank(asset.getPrefixName()))
+                                                   .collect(Collectors.toList());
         if (CollectionUtils.isNotEmpty(prefixNameIsNullAssets)) {
             prefixNameIsNullAssets.forEach(asset -> {
                 assetDTOs.add(AssetDTO.create(Lists.newArrayList(asset)));
@@ -143,14 +144,14 @@ public class AssetService {
         if (CollectionUtils.isNotEmpty(assets)) {
             // 取出资产中所有prefixName
             List<String> prefixNames = assets.stream()
-                    .map(Asset::getPrefixName)
-                    .distinct()
-                    .collect(Collectors.toList());
+                                             .map(Asset::getPrefixName)
+                                             .distinct()
+                                             .collect(Collectors.toList());
             // 将资产中相同prefixName归类(除未开启盲盒和未设置prefixName)
             prefixNames.forEach(str -> {
                 List<Asset> collect = assets.stream()
-                        .filter(asset -> str.equals(asset.getPrefixName()))
-                        .collect(Collectors.toList());
+                                            .filter(asset -> str.equals(asset.getPrefixName()))
+                                            .collect(Collectors.toList());
                 assetDTOs.add(AssetDTO.create(collect));
             });
         }
@@ -182,17 +183,17 @@ public class AssetService {
         }
         assetRepo.saveAndFlush(asset);
         tokenHistoryRepo.save(TokenHistory.builder()
-                .tokenId(asset.getTokenId())
-                .fromUser(collection.getMinter())
-                .fromUserId(collection.getMinterId())
-                .fromAvatar(collection.getMinterAvatar())
-                .toUser((safeFlag ? fakeUser : user).getNickname())
-                .toUserId((safeFlag ? fakeUser : user).getId())
-                .toAvatar((safeFlag ? fakeUser : user).getAvatar())
-                .operation(type)
-                .price(price)
-                .companyId(asset.getCompanyId())
-                .build());
+                                          .tokenId(asset.getTokenId())
+                                          .fromUser(collection.getMinter())
+                                          .fromUserId(collection.getMinterId())
+                                          .fromAvatar(collection.getMinterAvatar())
+                                          .toUser((safeFlag ? fakeUser : user).getNickname())
+                                          .toUserId((safeFlag ? fakeUser : user).getId())
+                                          .toAvatar((safeFlag ? fakeUser : user).getAvatar())
+                                          .operation(type)
+                                          .price(price)
+                                          .companyId(asset.getCompanyId())
+                                          .build());
 
         //绿洲石
         rockRecordService.addRock(user.getId(), price, "购买");
@@ -241,17 +242,17 @@ public class AssetService {
         }
         assetRepo.saveAndFlush(asset);
         tokenHistoryRepo.save(TokenHistory.builder()
-                .tokenId(asset.getTokenId())
-                .fromUser(photoAsset.getUserName())
-                .fromUserId(photoAsset.getUserId())
-                .fromAvatar(photoAsset.getUserAvatar())
-                .toUser((safeFlag ? fakeUser : user).getNickname())
-                .toUserId((safeFlag ? fakeUser : user).getId())
-                .toAvatar((safeFlag ? fakeUser : user).getAvatar())
-                .operation(type)
-                .price(price)
-                .companyId(asset.getCompanyId())
-                .build());
+                                          .tokenId(asset.getTokenId())
+                                          .fromUser(photoAsset.getUserName())
+                                          .fromUserId(photoAsset.getUserId())
+                                          .fromAvatar(photoAsset.getUserAvatar())
+                                          .toUser((safeFlag ? fakeUser : user).getNickname())
+                                          .toUserId((safeFlag ? fakeUser : user).getId())
+                                          .toAvatar((safeFlag ? fakeUser : user).getAvatar())
+                                          .operation(type)
+                                          .price(price)
+                                          .companyId(asset.getCompanyId())
+                                          .build());
 
         //绿洲石
 //        rockRecordService.addRock(user.getId(), price, "购买");
@@ -298,17 +299,17 @@ public class AssetService {
         }
         assetRepo.saveAndFlush(asset);
         tokenHistoryRepo.save(TokenHistory.builder()
-                .tokenId(asset.getTokenId())
-                .fromUser(domainOrder.getUserName())
-                .fromUserId(domainOrder.getUserId())
-                .fromAvatar(domainOrder.getUserAvatar())
-                .toUser((safeFlag ? fakeUser : user).getNickname())
-                .toUserId((safeFlag ? fakeUser : user).getId())
-                .toAvatar((safeFlag ? fakeUser : user).getAvatar())
-                .operation(type)
-                .price(price)
-                .companyId(asset.getCompanyId())
-                .build());
+                                          .tokenId(asset.getTokenId())
+                                          .fromUser(domainOrder.getUserName())
+                                          .fromUserId(domainOrder.getUserId())
+                                          .fromAvatar(domainOrder.getUserAvatar())
+                                          .toUser((safeFlag ? fakeUser : user).getNickname())
+                                          .toUserId((safeFlag ? fakeUser : user).getId())
+                                          .toAvatar((safeFlag ? fakeUser : user).getAvatar())
+                                          .operation(type)
+                                          .price(price)
+                                          .companyId(asset.getCompanyId())
+                                          .build());
 
         //绿洲石
 //        rockRecordService.addRock(user.getId(), price, "购买");
@@ -335,17 +336,17 @@ public class AssetService {
         }
         assetRepo.saveAndFlush(asset);
         tokenHistoryRepo.save(TokenHistory.builder()
-                .tokenId(asset.getTokenId())
-                .fromUser(tradeAuction.getMinter())
-                .fromUserId(Long.valueOf(tradeAuction.getMinterId()))
-                .fromAvatar(tradeAuction.getMinterAvatar())
-                .toUser((safeFlag ? fakeUser : user).getNickname())
-                .toUserId((safeFlag ? fakeUser : user).getId())
-                .toAvatar((safeFlag ? fakeUser : user).getAvatar())
-                .operation(type)
-                .price(null)
-                .companyId(asset.getCompanyId())
-                .build());
+                                          .tokenId(asset.getTokenId())
+                                          .fromUser(tradeAuction.getMinter())
+                                          .fromUserId(Long.valueOf(tradeAuction.getMinterId()))
+                                          .fromAvatar(tradeAuction.getMinterAvatar())
+                                          .toUser((safeFlag ? fakeUser : user).getNickname())
+                                          .toUserId((safeFlag ? fakeUser : user).getId())
+                                          .toAvatar((safeFlag ? fakeUser : user).getAvatar())
+                                          .operation(type)
+                                          .price(null)
+                                          .companyId(asset.getCompanyId())
+                                          .build());
 
         //绿洲石
 //        rockRecordService.addRock(user.getId(), price, "购买");
@@ -365,9 +366,9 @@ public class AssetService {
                 map.put(i, Hashing.md5().hashString(collectionId + ":" + i, StandardCharsets.UTF_8).asInt());
             }
             numberSeq.setNumbers(map.entrySet().stream()
-                    .sorted(Map.Entry.comparingByValue())
-                    .map(Map.Entry::getKey)
-                    .collect(Collectors.toList()));
+                                    .sorted(Map.Entry.comparingByValue())
+                                    .map(Map.Entry::getKey)
+                                    .collect(Collectors.toList()));
             numberSeqRepo.save(numberSeq);
         }
         return numberSeq.getNumbers().get(number);
@@ -376,9 +377,9 @@ public class AssetService {
     public Asset createAsset(BlindBoxItem winItem, User user, Long orderId, BigDecimal price, String type,
                              Integer number, Integer holdDays, boolean safeFlag) {
         Collection blindBox = collectionRepo.findDetailById(winItem.getBlindBoxId())
-                .orElseThrow(new BusinessException("盲盒不存在"));
+                                            .orElseThrow(new BusinessException("盲盒不存在"));
         Collection collection = collectionRepo.findDetailById(winItem.getCollectionId())
-                .orElseThrow(new BusinessException("藏品不存在"));
+                                              .orElseThrow(new BusinessException("藏品不存在"));
         if (collection.isMessNumber() && number != null) {
             number = getMessedNumber(collection.getId(), number, collection.getTotal());
         }
@@ -410,17 +411,17 @@ public class AssetService {
         }
         assetRepo.saveAndFlush(asset);
         tokenHistoryRepo.save(TokenHistory.builder()
-                .tokenId(asset.getTokenId())
-                .fromUser(winItem.getMinter())
-                .fromUserId(winItem.getMinterId())
-                .fromAvatar(winItem.getMinterAvatar())
-                .toUser((safeFlag ? fakeUser : user).getNickname())
-                .toUserId((safeFlag ? fakeUser : user).getId())
-                .toAvatar((safeFlag ? fakeUser : user).getAvatar())
-                .operation(type)
-                .price(price)
-                .companyId(asset.getCompanyId())
-                .build());
+                                          .tokenId(asset.getTokenId())
+                                          .fromUser(winItem.getMinter())
+                                          .fromUserId(winItem.getMinterId())
+                                          .fromAvatar(winItem.getMinterAvatar())
+                                          .toUser((safeFlag ? fakeUser : user).getNickname())
+                                          .toUserId((safeFlag ? fakeUser : user).getId())
+                                          .toAvatar((safeFlag ? fakeUser : user).getAvatar())
+                                          .operation(type)
+                                          .price(price)
+                                          .companyId(asset.getCompanyId())
+                                          .build());
 
         //绿洲石
         rockRecordService.addRock(user.getId(), price, "购买");
@@ -448,34 +449,34 @@ public class AssetService {
                 userRepo.findById(asset.getOwnerId()).orElseThrow(new BusinessException("用户不存在"))
                 : userRepo.findById(asset.getUserId()).orElseThrow(new BusinessException("用户不存在"));
         Collection collection = Collection.builder()
-                .name(asset.getName())
-                .pic(asset.getPic())
-                .minter(asset.getMinter())
-                .minterId(asset.getMinterId())
-                .minterAvatar(asset.getMinterAvatar())
-                .owner(owner.getNickname())
-                .oasisId(asset.getOasisId())
-                .ownerId(owner.getId())
-                .ownerAvatar(owner.getAvatar())
-                .detail(asset.getDetail())
-                .type(CollectionType.DEFAULT)
-                .source(CollectionSource.TRANSFER)
-                .sale(0)
-                .stock(1)
-                .total(1)
-                .onShelf(true)
-                .salable(false)
-                .price(BigDecimal.valueOf(0))
-                .properties(asset.getProperties())
-                .canResale(asset.isCanResale())
-                .royalties(asset.getRoyalties())
-                .serviceCharge(asset.getServiceCharge())
-                .assetId(id)
-                .number(asset.getNumber())
-                .tags(new HashSet<>())
-                .prefixName(asset.getPrefixName())
-                .companyId(asset.getCompanyId())
-                .build();
+                                          .name(asset.getName())
+                                          .pic(asset.getPic())
+                                          .minter(asset.getMinter())
+                                          .minterId(asset.getMinterId())
+                                          .minterAvatar(asset.getMinterAvatar())
+                                          .owner(owner.getNickname())
+                                          .oasisId(asset.getOasisId())
+                                          .ownerId(owner.getId())
+                                          .ownerAvatar(owner.getAvatar())
+                                          .detail(asset.getDetail())
+                                          .type(CollectionType.DEFAULT)
+                                          .source(CollectionSource.TRANSFER)
+                                          .sale(0)
+                                          .stock(1)
+                                          .total(1)
+                                          .onShelf(true)
+                                          .salable(false)
+                                          .price(BigDecimal.valueOf(0))
+                                          .properties(asset.getProperties())
+                                          .canResale(asset.isCanResale())
+                                          .royalties(asset.getRoyalties())
+                                          .serviceCharge(asset.getServiceCharge())
+                                          .assetId(id)
+                                          .number(asset.getNumber())
+                                          .tags(new HashSet<>())
+                                          .prefixName(asset.getPrefixName())
+                                          .companyId(asset.getCompanyId())
+                                          .build();
         if (asset.getTags() != null) {
             collection.getTags().addAll(asset.getTags());
         }
@@ -582,13 +583,13 @@ public class AssetService {
             asset.setOwnerAvatar(owner.getAvatar());
             asset.setSafeFlag(true);
             tokenHistoryRepo.findByTokenIdOrderByCreatedAtDesc(asset.getTokenId()).stream()
-                    .filter(t -> t.getToUserId().equals(asset.getUserId())).findFirst()
-                    .ifPresent(tokenHistory -> {
-                        tokenHistory.setToUserId(owner.getId());
-                        tokenHistory.setToUser(owner.getNickname());
-                        tokenHistory.setToAvatar(owner.getAvatar());
-                        tokenHistoryRepo.save(tokenHistory);
-                    });
+                            .filter(t -> t.getToUserId().equals(asset.getUserId())).findFirst()
+                            .ifPresent(tokenHistory -> {
+                                tokenHistory.setToUserId(owner.getId());
+                                tokenHistory.setToUser(owner.getNickname());
+                                tokenHistory.setToAvatar(owner.getAvatar());
+                                tokenHistoryRepo.save(tokenHistory);
+                            });
         } else {
             owner = asset.isSafeFlag() ?
                     userRepo.findById(asset.getOwnerId()).orElseThrow(new BusinessException("用户不存在"))
@@ -618,34 +619,34 @@ public class AssetService {
         }
 
         Collection collection = Collection.builder()
-                .name(asset.getName())
-                .pic(asset.getPic())
-                .minter(asset.getMinter())
-                .minterId(asset.getMinterId())
-                .minterAvatar(asset.getMinterAvatar())
-                .owner(owner.getNickname())
-                .ownerId(owner.getId())
-                .oasisId(asset.getOasisId())
-                .ownerAvatar(owner.getAvatar())
-                .detail(asset.getDetail())
-                .type(CollectionType.DEFAULT)
-                .source(CollectionSource.TRANSFER)
-                .sale(0)
-                .stock(1)
-                .total(1)
-                .onShelf(true)
-                .salable(true)
-                .price(price)
-                .properties(asset.getProperties())
-                .canResale(asset.isCanResale())
-                .royalties(asset.getRoyalties())
-                .serviceCharge(asset.getServiceCharge())
-                .assetId(id)
-                .number(asset.getNumber())
-                .tags(new HashSet<>())
-                .prefixName(asset.getPrefixName())
-                .companyId(asset.getCompanyId())
-                .build();
+                                          .name(asset.getName())
+                                          .pic(asset.getPic())
+                                          .minter(asset.getMinter())
+                                          .minterId(asset.getMinterId())
+                                          .minterAvatar(asset.getMinterAvatar())
+                                          .owner(owner.getNickname())
+                                          .ownerId(owner.getId())
+                                          .oasisId(asset.getOasisId())
+                                          .ownerAvatar(owner.getAvatar())
+                                          .detail(asset.getDetail())
+                                          .type(CollectionType.DEFAULT)
+                                          .source(CollectionSource.TRANSFER)
+                                          .sale(0)
+                                          .stock(1)
+                                          .total(1)
+                                          .onShelf(true)
+                                          .salable(true)
+                                          .price(price)
+                                          .properties(asset.getProperties())
+                                          .canResale(asset.isCanResale())
+                                          .royalties(asset.getRoyalties())
+                                          .serviceCharge(asset.getServiceCharge())
+                                          .assetId(id)
+                                          .number(asset.getNumber())
+                                          .tags(new HashSet<>())
+                                          .prefixName(asset.getPrefixName())
+                                          .companyId(asset.getCompanyId())
+                                          .build();
         if (asset.getType().equals(CollectionType.DOMAIN)) {
             collection.setType(CollectionType.DOMAIN);
         }
@@ -674,11 +675,11 @@ public class AssetService {
                 throw new BusinessException("已有订单不可取消");
             }
             collectionRepo.findById(asset.getPublicCollectionId())
-                    .ifPresent(collection -> {
-                        collection.setSalable(false);
-                        collection.setOnShelf(false);
-                        collectionRepo.save(collection);
-                    });
+                          .ifPresent(collection -> {
+                              collection.setSalable(false);
+                              collection.setOnShelf(false);
+                              collectionRepo.save(collection);
+                          });
         }
         asset.setConsignment(false);
         asset.setPublicShow(false);
@@ -709,10 +710,10 @@ public class AssetService {
                 throw new BusinessException("已有订单不可取消");
             }
             collectionRepo.findById(asset.getPublicCollectionId())
-                    .ifPresent(collection -> {
-                        collection.setSalable(false);
-                        collectionRepo.save(collection);
-                    });
+                          .ifPresent(collection -> {
+                              collection.setSalable(false);
+                              collectionRepo.save(collection);
+                          });
         }
         asset.setConsignment(false);
         assetRepo.saveAndFlush(asset);
@@ -737,7 +738,7 @@ public class AssetService {
             cancelConsignment(asset);
         }
         Collection collection = collectionRepo.findById(asset.getPublicCollectionId())
-                .orElseThrow(new BusinessException("无展示记录"));
+                                              .orElseThrow(new BusinessException("无展示记录"));
         collectionRepo.delete(collection);
         // 如果展厅有此藏品
         showCollectionRepo.deleteAllByCollectionId(asset.getPublicCollectionId());
@@ -766,11 +767,11 @@ public class AssetService {
     private User createFakeUser() {
         String name = "0x" + RandomStringUtils.randomAlphabetic(8);
         return userRepo.save(User.builder()
-                .username(name)
-                .nickname(name)
-                .avatar(Constants.DEFAULT_AVATAR)
-                .isPublicShow(true)
-                .build());
+                                 .username(name)
+                                 .nickname(name)
+                                 .avatar(Constants.DEFAULT_AVATAR)
+                                 .isPublicShow(true)
+                                 .build());
     }
 
     public void transfer(Asset asset, BigDecimal price, User toUser, TransferReason reason, Long orderId, boolean safeFlag, Set<Tag> tags) {
@@ -825,17 +826,17 @@ public class AssetService {
         }
 
         TokenHistory tokenHistory = TokenHistory.builder()
-                .tokenId(asset.getTokenId())
-                .fromUser(asset.getOwner())
-                .fromUserId(asset.getOwnerId())
-                .fromAvatar(asset.getOwnerAvatar())
-                .toUser(newOwner.getNickname())
-                .toUserId(newOwner.getId())
-                .toAvatar(newOwner.getAvatar())
-                .operation(reason.getDescription())
-                .price(TransferReason.GIFT == reason ? null : price)
-                .companyId(asset.getCompanyId())
-                .build();
+                                                .tokenId(asset.getTokenId())
+                                                .fromUser(asset.getOwner())
+                                                .fromUserId(asset.getOwnerId())
+                                                .fromAvatar(asset.getOwnerAvatar())
+                                                .toUser(newOwner.getNickname())
+                                                .toUserId(newOwner.getId())
+                                                .toAvatar(newOwner.getAvatar())
+                                                .operation(reason.getDescription())
+                                                .price(TransferReason.GIFT == reason ? null : price)
+                                                .companyId(asset.getCompanyId())
+                                                .build();
         tokenHistoryRepo.save(tokenHistory);
 
         //购买者加绿洲石
@@ -855,6 +856,10 @@ public class AssetService {
                 break;
             case TRANSFER:
                 asset.setStatus(AssetStatus.TRANSFERRED);
+                break;
+            case ASK:
+                asset.setStatus(AssetStatus.TRANSFERRED);
+                break;
         }
         asset.setOwner(newOwner.getNickname());
         asset.setOwnerId(newOwner.getId());
@@ -897,7 +902,7 @@ public class AssetService {
             UserHistory userHistory = new UserHistory();
             BeanUtils.copyProperties(tokenHistory, userHistory);
             Optional<Asset> asset = assets.stream().filter(a -> a.getTokenId().equals(tokenHistory.getTokenId()))
-                    .findAny();
+                                          .findAny();
             userHistory.setAssetName(asset.map(Asset::getName).orElse(null));
             userHistory.setPic(asset.map(Asset::getPic).orElse(new ArrayList<>()));
             switch (tokenHistory.getOperation()) {
@@ -940,7 +945,7 @@ public class AssetService {
             UserHistory userHistory = new UserHistory();
             BeanUtils.copyProperties(tokenHistory, userHistory);
             Optional<Asset> asset = assets.stream().filter(a -> a.getTokenId().equals(tokenHistory.getTokenId()))
-                    .findAny();
+                                          .findAny();
             userHistory.setAssetName(asset.map(Asset::getName).orElse(null));
             userHistory.setPic(asset.map(Asset::getPic).orElse(new ArrayList<>()));
             switch (tokenHistory.getOperation()) {
@@ -1055,11 +1060,11 @@ public class AssetService {
                     throw new BusinessException("已有订单不可取消");
                 }
                 collectionRepo.findById(asset.getPublicCollectionId())
-                        .ifPresent(collection -> {
-                            collection.setSalable(false);
-                            collection.setOnShelf(false);
-                            collectionRepo.save(collection);
-                        });
+                              .ifPresent(collection -> {
+                                  collection.setSalable(false);
+                                  collection.setOnShelf(false);
+                                  collectionRepo.save(collection);
+                              });
             }
             asset.setConsignment(false);
             asset.setPublicShow(false);
@@ -1099,7 +1104,7 @@ public class AssetService {
                             criteriaBuilder.equal(root.get("consignment"), false),
                             // and has some tagId
                             root.join("tags").get("id").in(tags.stream().map(Tag::getId).toArray()))
-                            .getRestriction(), pageable);
+                         .getRestriction(), pageable);
         } else {
             return assetRepo
                     .findByUserIdAndStatusAndCompanyIdAndNameLikeAndConsignment(userId, AssetStatus.NORMAL, companyId,
@@ -1130,17 +1135,17 @@ public class AssetService {
         User toUser = userRepo.findById(Constants.BLACK_HOLE_USER_ID).orElseThrow(new BusinessException("无记录"));
 
         TokenHistory tokenHistory = TokenHistory.builder()
-                .tokenId(asset.getTokenId())
-                .fromUser(asset.getOwner())
-                .fromUserId(asset.getOwnerId())
-                .fromAvatar(asset.getOwnerAvatar())
-                .toUser(toUser.getNickname())
-                .toUserId(toUser.getId())
-                .toAvatar(toUser.getAvatar())
-                .operation(TransferReason.DESTROY.getDescription())
-                .price(null)
-                .companyId(asset.getCompanyId())
-                .build();
+                                                .tokenId(asset.getTokenId())
+                                                .fromUser(asset.getOwner())
+                                                .fromUserId(asset.getOwnerId())
+                                                .fromAvatar(asset.getOwnerAvatar())
+                                                .toUser(toUser.getNickname())
+                                                .toUserId(toUser.getId())
+                                                .toAvatar(toUser.getAvatar())
+                                                .operation(TransferReason.DESTROY.getDescription())
+                                                .price(null)
+                                                .companyId(asset.getCompanyId())
+                                                .build();
         tokenHistoryRepo.save(tokenHistory);
 
         asset.setPublicShow(false);
@@ -1153,15 +1158,15 @@ public class AssetService {
         assetRepo.saveAndFlush(asset);
         //积分记录
         destroyRecordRepo.save(DestroyRecord.builder()
-                .userId(userId)
-                .assetId(asset.getId())
-                .name(asset.getName())
-                .pic(asset.getPic().get(0).getUrl())
-                .record(1)
-                .type(RecordType.OBTAIN)
-                .companyId(asset.getCompanyId())
-                .source(source)
-                .build());
+                                            .userId(userId)
+                                            .assetId(asset.getId())
+                                            .name(asset.getName())
+                                            .pic(asset.getPic().get(0).getUrl())
+                                            .record(1)
+                                            .type(RecordType.OBTAIN)
+                                            .companyId(asset.getCompanyId())
+                                            .source(source)
+                                            .build());
 
         //加积分
         userRepo.addDestroyPoint(userId, 1);
@@ -1200,17 +1205,17 @@ public class AssetService {
         User toUser = userRepo.findById(Constants.BLACK_HOLE_USER_ID).orElseThrow(new BusinessException("无记录"));
 
         TokenHistory tokenHistory = TokenHistory.builder()
-                .tokenId(asset.getTokenId())
-                .fromUser(asset.getOwner())
-                .fromUserId(asset.getOwnerId())
-                .fromAvatar(asset.getOwnerAvatar())
-                .toUser(toUser.getNickname())
-                .toUserId(toUser.getId())
-                .toAvatar(toUser.getAvatar())
-                .operation(TransferReason.DESTROY.getDescription())
-                .price(null)
-                .companyId(asset.getCompanyId())
-                .build();
+                                                .tokenId(asset.getTokenId())
+                                                .fromUser(asset.getOwner())
+                                                .fromUserId(asset.getOwnerId())
+                                                .fromAvatar(asset.getOwnerAvatar())
+                                                .toUser(toUser.getNickname())
+                                                .toUserId(toUser.getId())
+                                                .toAvatar(toUser.getAvatar())
+                                                .operation(TransferReason.DESTROY.getDescription())
+                                                .price(null)
+                                                .companyId(asset.getCompanyId())
+                                                .build();
         tokenHistoryRepo.save(tokenHistory);
 
         asset.setPublicShow(false);
@@ -1223,15 +1228,15 @@ public class AssetService {
         assetRepo.saveAndFlush(asset);
         //积分记录
         DestroyRecord destroyRecord = DestroyRecord.builder()
-                .userId(userId)
-                .assetId(asset.getId())
-                .name(asset.getName())
-                .record(1)
-                .type(RecordType.OBTAIN)
-                .companyId(asset.getCompanyId())
-                .source(source)
-                .remark(remark)
-                .build();
+                                                   .userId(userId)
+                                                   .assetId(asset.getId())
+                                                   .name(asset.getName())
+                                                   .record(1)
+                                                   .type(RecordType.OBTAIN)
+                                                   .companyId(asset.getCompanyId())
+                                                   .source(source)
+                                                   .remark(remark)
+                                                   .build();
         destroyRecord
                 .setPic("video/mp4".equals(asset.getPic().get(0).getType()) ? asset.getPic().get(0).getThumb() : asset
                         .getPic().get(0).getUrl());
@@ -1308,22 +1313,22 @@ public class AssetService {
         new ForkJoinPool(1000).submit(() -> {
             AtomicInteger num = new AtomicInteger();
             assetRepo.findByStatus(AssetStatus.NORMAL).parallelStream()
-                    .forEach(asset -> {
-                        if (asset.getHcTxHash() == null) {
-                            User user = userRepo.findById(asset.getUserId()).orElse(null);
-                            if (user != null) {
-                                if (user.getHcChainAddress() == null) {
-                                    user.setHcChainAddress(hcChainService.createAccount(asset.getUserId()));
-                                }
-                                NFT nft = hcChainService.mint(user.getHcChainAddress(), asset.getTokenId());
-                                asset.setHcTokenId(nft.getTokenId());
-                                asset.setHcTxHash(nft.getTxHash());
-                                asset.setGasUsed(nft.getGasUsed());
-                                assetRepo.saveAndFlush(asset);
-                            }
-                        }
-                        log.info("hcChain:" + num.getAndIncrement());
-                    });
+                     .forEach(asset -> {
+                         if (asset.getHcTxHash() == null) {
+                             User user = userRepo.findById(asset.getUserId()).orElse(null);
+                             if (user != null) {
+                                 if (user.getHcChainAddress() == null) {
+                                     user.setHcChainAddress(hcChainService.createAccount(asset.getUserId()));
+                                 }
+                                 NFT nft = hcChainService.mint(user.getHcChainAddress(), asset.getTokenId());
+                                 asset.setHcTokenId(nft.getTokenId());
+                                 asset.setHcTxHash(nft.getTxHash());
+                                 asset.setGasUsed(nft.getGasUsed());
+                                 assetRepo.saveAndFlush(asset);
+                             }
+                         }
+                         log.info("hcChain:" + num.getAndIncrement());
+                     });
         }).get();
     }
 
@@ -1353,16 +1358,16 @@ public class AssetService {
         assetRepo.saveAndFlush(asset);
 
         assetLockRepo.save(AssetLock.builder()
-                .userId(userId)
-                .phone(user.getPhone())
-                .nickname(user.getNickname())
-                .assetId(assetId)
-                .name(asset.getName())
-                .number(asset.getNumber())
-                .lockAt(asset.getLockAt())
-                .lockTo(asset.getLockTo())
-                .duration(duration)
-                .build());
+                                    .userId(userId)
+                                    .phone(user.getPhone())
+                                    .nickname(user.getNickname())
+                                    .assetId(assetId)
+                                    .name(asset.getName())
+                                    .number(asset.getNumber())
+                                    .lockAt(asset.getLockAt())
+                                    .lockTo(asset.getLockTo())
+                                    .duration(duration)
+                                    .build());
     }
 
     public List<TransactionTopTenDTO> transactionTopTen() {

+ 4 - 0
src/main/java/com/izouma/nineth/service/CacheService.java

@@ -22,6 +22,10 @@ public class CacheService {
     public void clearMintActivity(Long id) {
     }
 
+    @CacheEvict(value = "countByPrefix", key = "#prefixName")
+    public void clearPrefixNameCount(String prefixName) {
+    }
+
     @CacheEvict(value = "user", allEntries = true)
     public void clearUser() {
     }

+ 13 - 0
src/main/java/com/izouma/nineth/service/CollectionService.java

@@ -36,6 +36,7 @@ import org.springframework.data.redis.core.BoundValueOperations;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.scheduling.TaskScheduler;
 import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import javax.annotation.PostConstruct;
@@ -122,6 +123,13 @@ public class CollectionService {
                 return criteriaBuilder.and();
             });
         }
+        if (query.containsKey("distinctPrefix")) {
+            query.remove("distinctPrefix");
+            specification = specification.and((Specification<Collection>) (root, criteriaQuery, criteriaBuilder) -> {
+                criteriaQuery.groupBy(root.get("prefixName"));
+                return criteriaBuilder.and();
+            });
+        }
         if (query.containsKey("rarityLabel")) {
             String rarityLabel = String.valueOf(query.get("rarityLabel"));
             query.remove("rarityLabel");
@@ -817,4 +825,9 @@ public class CollectionService {
     public Long countDestroyAssets(String search) {
         return assetRepo.countDestroyed("%" + search + "%", AssetStatus.DESTROYED);
     }
+
+    @Cacheable(value = "countByPrefix", key = "#prefixName")
+    public Integer countNum(String prefixName) {
+        return collectionRepo.countByPrefixNameAndOnShelfAndDelAndSalable(prefixName, true, false, true);
+    }
 }

+ 49 - 11
src/main/java/com/izouma/nineth/service/DomainOrderService.java

@@ -12,6 +12,7 @@ import com.izouma.nineth.domain.User;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.dto.excel.DomainCountDTO;
 import com.izouma.nineth.dto.nftdomain.DomainResult;
+import com.izouma.nineth.dto.nftdomain.DomainTop;
 import com.izouma.nineth.enums.*;
 import com.izouma.nineth.event.OrderNotifyEvent;
 import com.izouma.nineth.exception.BusinessException;
@@ -284,9 +285,9 @@ public class DomainOrderService {
             domain = domain.substring(0, dotIndex);
         }
 //        domain = domain.replaceAll("[^a-zA-Z0-9\\u4E00-\\u9FA5]", "");
-        Pageable pageable = PageRequest.of(0, 10, Sort.by("createdAt").descending());
+        Pageable pageable = PageRequest.of(0, 3, Sort.by("createdAt").descending());
         List<DomainOrder> used = domainOrderRepo.searchUsedDomain("%" + domain + "%", OrderStatus.CANCELLED, pageable)
-                .getContent();
+                                                .getContent();
 
         String n = domain.substring(domain.length() - 1);
         List<Map<String, Object>> recommend = new ArrayList<>();
@@ -311,10 +312,28 @@ public class DomainOrderService {
         used.forEach(domainOrder -> {
             Map<String, Object> sold = new HashMap<>();
             if (!domainOrder.getDomainName().contains(".uni")) {
-                sold.put("domain", domainOrder.getDomainName().toLowerCase());
-                sold.put("endTime", domainOrder.getEndTime());
-                sold.put("sold", true);
-                result.add(sold);
+                Asset asset = assetRepo
+                        .findFirstByNameAndStatus("RID元宇宙域名 " + domainOrder.getDomainName(), AssetStatus.NORMAL);
+                if (asset != null) {
+                    if (asset.isConsignment()) {
+                        sold.put("canAsk", false);
+                    } else {
+                        sold.put("canAsk", true);
+                    }
+                    sold.put("id", domainOrder.getId());
+                    sold.put("domain", domainOrder.getDomainName().toLowerCase());
+                    sold.put("endTime", domainOrder.getEndTime());
+                    sold.put("sold", true);
+                    sold.put("isOpenHyperLink", domainOrder.isOpenHyperLink());
+                    if (domainOrder.getHyperLinkType() != null) {
+                        sold.put("HyperLinkType", domainOrder.getHyperLinkType());
+                    }
+                    if (domainOrder.getAddress() != null) {
+                        sold.put("Address", domainOrder.getAddress());
+                    }
+
+                    result.add(sold);
+                }
             }
         });
         return result;
@@ -376,7 +395,8 @@ public class DomainOrderService {
 
     public Long createAsset(DomainOrder domainOrder) {
         return assetService.createAsset(domainOrder, userRepo.findById(domainOrder.getUserId())
-                .orElseThrow(new BusinessException("无用户记录")), null, domainOrder.getPrice(), "域名", null, false).getId();
+                                                             .orElseThrow(new BusinessException("无用户记录")), null, domainOrder
+                .getPrice(), "域名", null, false).getId();
     }
 
     public BufferedImage domainImg(String domain) throws IOException, FontFormatException, WriterException {
@@ -395,20 +415,20 @@ public class DomainOrderService {
         Font font2;
         if (!chinese) {
             InputStream is1 = this.getClass()
-                    .getResourceAsStream("/font/VonwaonBitmap_16pxLite.ttf");
+                                  .getResourceAsStream("/font/VonwaonBitmap_16pxLite.ttf");
             font1 = Font.createFont(Font.TRUETYPE_FONT, is1);
             is1.close();
             InputStream is2 = this.getClass()
-                    .getResourceAsStream("/font/VonwaonBitmap_12pxLite.ttf");
+                                  .getResourceAsStream("/font/VonwaonBitmap_12pxLite.ttf");
             font2 = Font.createFont(Font.TRUETYPE_FONT, is2);
             is2.close();
         } else {
             InputStream is1 = this.getClass()
-                    .getResourceAsStream("/font/尔雅荣耀手书.ttf");
+                                  .getResourceAsStream("/font/尔雅荣耀手书.ttf");
             font1 = Font.createFont(Font.TRUETYPE_FONT, is1);
             is1.close();
             InputStream is2 = this.getClass()
-                    .getResourceAsStream("/font/尔雅荣耀手书.ttf");
+                                  .getResourceAsStream("/font/尔雅荣耀手书.ttf");
             font2 = Font.createFont(Font.TRUETYPE_FONT, is2);
             is2.close();
         }
@@ -600,6 +620,24 @@ public class DomainOrderService {
         JSONArray jsonArray = new JSONArray();
         jsonArray.addAll(map);
         return jsonArray.toJavaList(DomainResult.class);
+    }
 
+    public List<DomainTop> domainTop() {
+        List<Map<String, Object>> map = assetRepo
+                .domainBuyerTop60(LocalDateTime.now().minusDays(7L), LocalDateTime.now());
+        JSONArray jsonArray = new JSONArray();
+        jsonArray.addAll(map);
+        return jsonArray.toJavaList(DomainTop.class);
+    }
+
+    public void addHyperLink(Long collectionId, boolean openHyperLink, HyperLinkType hyperLinkType, String address) {
+        // Collection collection = collectionRepo.findById(collectionId).orElseThrow(new BusinessException("没找到记录"));
+        Asset asset = assetRepo.findByIdAndStatus(collectionId, AssetStatus.NORMAL).orElseThrow(new BusinessException("没找到记录"));
+        DomainOrder domainOrder = domainOrderRepo.findById(asset.getCollectionId()).orElseThrow(new BusinessException("没找到记录"));
+        domainOrder.setOpenHyperLink(openHyperLink);
+        domainOrder.setHyperLinkType(hyperLinkType);
+        domainOrder.setAddress(address);
+        domainOrder.setCurrentOwnerId(SecurityUtils.getAuthenticatedUser().getId());
+        domainOrderRepo.save(domainOrder);
     }
 }

+ 25 - 0
src/main/java/com/izouma/nineth/service/HyperlinkService.java

@@ -0,0 +1,25 @@
+package com.izouma.nineth.service;
+
+import com.izouma.nineth.domain.Hyperlink;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.repo.HyperlinkRepo;
+import com.izouma.nineth.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class HyperlinkService {
+
+    private HyperlinkRepo hyperlinkRepo;
+
+    public Page<Hyperlink> all(PageQuery pageQuery) {
+        return hyperlinkRepo.findAll(JpaUtils.toSpecification(pageQuery, Hyperlink.class), JpaUtils.toPageRequest(pageQuery));
+    }
+
+
+
+
+
+}

+ 15 - 3
src/main/java/com/izouma/nineth/service/MintActivityService.java

@@ -43,6 +43,7 @@ public class MintActivityService {
     private       RocketMQTemplate              rocketMQTemplate;
     private       GeneralProperties             generalProperties;
     private       TaskScheduler                 taskScheduler;
+    private       SysConfigService              sysConfigService;
     private final Map<Long, ScheduledFuture<?>> tasks = new HashMap<>();
 
 
@@ -51,10 +52,21 @@ public class MintActivityService {
                 .findAll(JpaUtils.toSpecification(pageQuery, MintActivity.class), JpaUtils.toPageRequest(pageQuery));
         List<MintActivity> content = result.getContent();
         List<MintActivity> newContent = new ArrayList<>();
+//        String mintCountCollection = sysConfigService.getString("mint_countCollection");
+//        String regex = ",";
+//        String[] split = mintCountCollection.split(regex);
+
+
         for (MintActivity activity : content) {
-            activity.setVTotal(activity.getTotal());
-            activity.setTotal(0);
-            newContent.add(activity);
+//            if (Arrays.asList(split).contains(String.valueOf(activity.getMinterId()))) {
+//                // targetId在split数组中
+//                newContent.add(activity);
+//            } else {
+                // targetId不在split数组中
+                activity.setVTotal(activity.getTotal());
+                activity.setTotal(0);
+                newContent.add(activity);
+//            }
         }
         return new PageImpl<>(newContent, result.getPageable(), result.getTotalElements());
     }

+ 22 - 0
src/main/java/com/izouma/nineth/service/OrderCancelService.java

@@ -5,12 +5,16 @@ import com.izouma.nineth.config.Constants;
 import com.izouma.nineth.config.GeneralProperties;
 import com.izouma.nineth.config.RedisKeys;
 import com.izouma.nineth.domain.*;
+import com.izouma.nineth.domain.nftdomain.DomainAsk;
 import com.izouma.nineth.dto.PayQuery;
 import com.izouma.nineth.enums.AuctionOrderStatus;
+import com.izouma.nineth.enums.DomainAskStatus;
 import com.izouma.nineth.enums.MintOrderStatus;
 import com.izouma.nineth.enums.OrderStatus;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.*;
+import com.izouma.nineth.repo.nftdomain.DomainAskRepo;
+import com.izouma.nineth.service.nftdomain.DomainAskService;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -44,6 +48,8 @@ public class OrderCancelService {
     private final PhotoAssetRepo                photoAssetRepo;
     private final DomainOrderService            domainOrderService;
     private final DomainOrderRepo               domainOrderRepo;
+    private final DomainAskRepo                 domainAskRepo;
+    private final DomainAskService              domainAskService;
 
     private static int orderCancelInterval = 210;
 
@@ -139,6 +145,22 @@ public class OrderCancelService {
         });
     }
 
+    @Scheduled(fixedRate = 30000, initialDelay = 30000)
+    @RedisLock(value = "domain_ask_batch_cancel", expire = 3, unit = TimeUnit.MINUTES)
+    public void batchCancelDomainAsk() {
+        List<DomainAsk> orders = domainAskRepo.findByStatusAndCreatedAtBeforeAndDelFalse(DomainAskStatus.NOT_PAID,
+                LocalDateTime.now().minusSeconds(orderCancelInterval));
+        orders.forEach(o -> {
+            try {
+                DomainAsk order = domainAskRepo.findById(o.getId()).orElseThrow(new BusinessException("订单不存在"));
+                if (order.getStatus() == DomainAskStatus.NOT_PAID && canCancel(order.getId().toString())) {
+                    domainAskService.cancel(order);
+                }
+            } catch (Exception ignored) {
+            }
+        });
+    }
+
     private boolean canCancel(String id) {
         String channel = null;
         Object payTmp = redisTemplate.opsForValue().get(RedisKeys.PAY_TMP + id);

+ 57 - 42
src/main/java/com/izouma/nineth/service/OrderPayService.java

@@ -10,12 +10,15 @@ import com.izouma.nineth.config.AlipayProperties;
 import com.izouma.nineth.config.Constants;
 import com.izouma.nineth.config.GeneralProperties;
 import com.izouma.nineth.domain.*;
+import com.izouma.nineth.domain.nftdomain.DomainAsk;
 import com.izouma.nineth.dto.PayQuery;
 import com.izouma.nineth.dto.UserBankCard;
 import com.izouma.nineth.enums.*;
 import com.izouma.nineth.event.OrderNotifyEvent;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.*;
+import com.izouma.nineth.repo.nftdomain.DomainAskRepo;
+import com.izouma.nineth.service.nftdomain.DomainAskService;
 import com.izouma.nineth.utils.SnowflakeIdWorker;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -75,6 +78,8 @@ public class OrderPayService {
     private final TradeAuctionRepo         tradeAuctionRepo;
     private final TradeAuctionOrderRepo    tradeAuctionOrderRepo;
     private final TradeAuctionOrderService tradeAuctionOrderService;
+    private final DomainAskRepo            domainAskRepo;
+    private final DomainAskService         domainAskService;
 
     public static void setPayChannel(String payChannel) {
         log.info("set pay channel {}", payChannel);
@@ -138,7 +143,7 @@ public class OrderPayService {
         String qrCode = aliRequest(orderId, order.getTotalPrice(), order.getName(), Constants.OrderNotifyType.ORDER);
 
         String ua = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()
-                .getHeader("User-Agent");
+                                                                                            .getHeader("User-Agent");
         if (ua.toLowerCase().contains("micromessenger")) {
             return "/static/wx_alipay_bridge.html?payUrl=" + URLEncoder
                     .encode(Constants.ALIPAY_URL_SCHEME + qrCode, StandardCharsets.UTF_8)
@@ -197,7 +202,7 @@ public class OrderPayService {
         }
         if (StringUtils.isEmpty(bindCardId)) {
             bindCardId = userBankCardRepo.findByUserId(order.getUserId())
-                    .stream().map(UserBankCard::getBindCardId).findFirst().orElse(null);
+                                         .stream().map(UserBankCard::getBindCardId).findFirst().orElse(null);
         }
         if (StringUtils.isEmpty(bindCardId)) {
             throw new BusinessException("请先绑定银行卡");
@@ -250,7 +255,7 @@ public class OrderPayService {
         String qrCode = aliRequest(orderId, order.getGasPrice(), "转赠", Constants.OrderNotifyType.GIFT);
 
         String ua = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()
-                .getHeader("User-Agent");
+                                                                                            .getHeader("User-Agent");
         if (ua.toLowerCase().contains("micromessenger")) {
             return "/static/wx_alipay_bridge.html?payUrl=" + URLEncoder
                     .encode(Constants.ALIPAY_URL_SCHEME + qrCode, StandardCharsets.UTF_8)
@@ -306,7 +311,7 @@ public class OrderPayService {
         }
         if (StringUtils.isEmpty(bindCardId)) {
             bindCardId = userBankCardRepo.findByUserId(order.getUserId())
-                    .stream().map(UserBankCard::getBindCardId).findFirst().orElse(null);
+                                         .stream().map(UserBankCard::getBindCardId).findFirst().orElse(null);
         }
         if (StringUtils.isEmpty(bindCardId)) {
             throw new BusinessException("请先绑定银行卡");
@@ -346,7 +351,7 @@ public class OrderPayService {
                 .getMintActivityId(), Constants.OrderNotifyType.MINT);
 
         String ua = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()
-                .getHeader("User-Agent");
+                                                                                            .getHeader("User-Agent");
         if (ua.toLowerCase().contains("micromessenger")) {
             return "/static/wx_alipay_bridge.html?payUrl=" + URLEncoder
                     .encode(Constants.ALIPAY_URL_SCHEME + qrCode, StandardCharsets.UTF_8)
@@ -415,7 +420,7 @@ public class OrderPayService {
         }
         if (StringUtils.isEmpty(bindCardId)) {
             bindCardId = userBankCardRepo.findByUserId(order.getUserId())
-                    .stream().map(UserBankCard::getBindCardId).findFirst().orElse(null);
+                                         .stream().map(UserBankCard::getBindCardId).findFirst().orElse(null);
         }
         if (StringUtils.isEmpty(bindCardId)) {
             throw new BusinessException("请先绑定银行卡");
@@ -428,7 +433,7 @@ public class OrderPayService {
         Long companyId = 1L;
         try {
             String hCompanyId = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()
-                    .getHeader("companyId");
+                                                                                                        .getHeader("companyId");
             if (StringUtils.isNotBlank(hCompanyId)) {
                 companyId = Long.parseLong(hCompanyId);
             }
@@ -446,11 +451,11 @@ public class OrderPayService {
 //            throw new BusinessException("充值金额不能大于50000");
 //        }
         RechargeOrder order = RechargeOrder.builder()
-                .id(snowflakeIdWorker.nextId())
-                .userId(userId)
-                .amount(amount)
-                .status(OrderStatus.NOT_PAID)
-                .build();
+                                           .id(snowflakeIdWorker.nextId())
+                                           .userId(userId)
+                                           .amount(amount)
+                                           .status(OrderStatus.NOT_PAID)
+                                           .build();
         rechargeOrderRepo.save(order);
 
         switch (PAY_CHANNEL) {
@@ -475,17 +480,17 @@ public class OrderPayService {
             throw new BusinessException("充值金额不能大于50000");
         }
         RechargeOrder order = RechargeOrder.builder()
-                .id(snowflakeIdWorker.nextId())
-                .userId(userId)
-                .amount(amount)
-                .status(OrderStatus.NOT_PAID)
-                .build();
+                                           .id(snowflakeIdWorker.nextId())
+                                           .userId(userId)
+                                           .amount(amount)
+                                           .status(OrderStatus.NOT_PAID)
+                                           .build();
         rechargeOrderRepo.save(order);
 
         String qrCode = aliRequest(order.getId(), order.getAmount(), "余额充值", Constants.OrderNotifyType.RECHARGE);
 
         String ua = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()
-                .getHeader("User-Agent");
+                                                                                            .getHeader("User-Agent");
         if (ua.toLowerCase().contains("micromessenger")) {
             return "/static/wx_alipay_bridge.html?payUrl=" + URLEncoder
                     .encode(Constants.ALIPAY_URL_SCHEME + qrCode, StandardCharsets.UTF_8)
@@ -506,15 +511,15 @@ public class OrderPayService {
             throw new BusinessException("充值金额不能大于50000");
         }
         RechargeOrder order = RechargeOrder.builder()
-                .id(snowflakeIdWorker.nextId())
-                .userId(userId)
-                .amount(amount)
-                .status(OrderStatus.NOT_PAID)
-                .build();
+                                           .id(snowflakeIdWorker.nextId())
+                                           .userId(userId)
+                                           .amount(amount)
+                                           .status(OrderStatus.NOT_PAID)
+                                           .build();
         rechargeOrderRepo.save(order);
         if (StringUtils.isEmpty(bindCardId)) {
             bindCardId = userBankCardRepo.findByUserId(order.getUserId())
-                    .stream().map(UserBankCard::getBindCardId).findFirst().orElse(null);
+                                         .stream().map(UserBankCard::getBindCardId).findFirst().orElse(null);
         }
         if (StringUtils.isEmpty(bindCardId)) {
             throw new BusinessException("请先绑定银行卡");
@@ -532,11 +537,11 @@ public class OrderPayService {
             throw new BusinessException("充值金额不能大于50000");
         }
         RechargeOrder order = RechargeOrder.builder()
-                .id(snowflakeIdWorker.nextId())
-                .userId(userId)
-                .amount(amount)
-                .status(OrderStatus.NOT_PAID)
-                .build();
+                                           .id(snowflakeIdWorker.nextId())
+                                           .userId(userId)
+                                           .amount(amount)
+                                           .status(OrderStatus.NOT_PAID)
+                                           .build();
         rechargeOrderRepo.save(order);
         return sandPayService.payQuick(order.getId() + "", "余额充值",
                 order.getAmount(), LocalDateTime.now().plusMinutes(3), Constants.OrderNotifyType.RECHARGE,
@@ -555,11 +560,11 @@ public class OrderPayService {
                 .findFirstByUserIdAndStatusAndDelFalseOrderByCreatedAtDesc(userId, AuthStatus.SUCCESS)
                 .orElseThrow(new BusinessException("请先完成实名认证"));
         RechargeOrder order = RechargeOrder.builder()
-                .id(snowflakeIdWorker.nextId())
-                .userId(userId)
-                .amount(amount)
-                .status(OrderStatus.NOT_PAID)
-                .build();
+                                           .id(snowflakeIdWorker.nextId())
+                                           .userId(userId)
+                                           .amount(amount)
+                                           .status(OrderStatus.NOT_PAID)
+                                           .build();
         rechargeOrderRepo.save(order);
         return sandPayService.payQuickBind(order.getId() + "", "余额充值",
                 order.getAmount(), LocalDateTime.now().plusMinutes(3), Constants.OrderNotifyType.RECHARGE,
@@ -660,7 +665,7 @@ public class OrderPayService {
                 .getName(), Constants.OrderNotifyType.AUCTION);
 
         String ua = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()
-                .getHeader("User-Agent");
+                                                                                            .getHeader("User-Agent");
         if (ua.toLowerCase().contains("micromessenger")) {
             return "/static/wx_alipay_bridge.html?payUrl=" + URLEncoder
                     .encode(Constants.ALIPAY_URL_SCHEME + qrCode, StandardCharsets.UTF_8)
@@ -714,7 +719,7 @@ public class OrderPayService {
     public void payTradeAuctionOrderBalance(Long orderId, Long userId, String tradeCode) {
         TradeAuctionOrder order = tradeAuctionOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
         TradeAuction tradeAuction = tradeAuctionRepo.findById(order.getTradeAuctionId())
-                .orElseThrow(new BusinessException("暂无"));
+                                                    .orElseThrow(new BusinessException("暂无"));
         if (order.getStatus() != AuctionOrderStatus.NOT_PAID) {
             throw new BusinessException("订单状态错误");
         }
@@ -725,7 +730,7 @@ public class OrderPayService {
             throw new BusinessException("未到竞价时间");
         }
         if (!tradeAuction.getStatus().equals(TradeAuctionStatus.ONGOING) & !tradeAuction.getStatus()
-                .equals(TradeAuctionStatus.PURCHASED)) {
+                                                                                        .equals(TradeAuctionStatus.PURCHASED)) {
             throw new BusinessException("易拍产品未处在竞价状态");
         }
         if (order.getPaymentType().equals(AuctionPaymentType.DEPOSIT)) {
@@ -757,7 +762,7 @@ public class OrderPayService {
         }
         if (StringUtils.isEmpty(bindCardId)) {
             bindCardId = userBankCardRepo.findByUserId(order.getUserId())
-                    .stream().map(UserBankCard::getBindCardId).findFirst().orElse(null);
+                                         .stream().map(UserBankCard::getBindCardId).findFirst().orElse(null);
         }
         if (StringUtils.isEmpty(bindCardId)) {
             throw new BusinessException("请先绑定银行卡");
@@ -796,7 +801,7 @@ public class OrderPayService {
                 .getPicName(), Constants.OrderNotifyType.PIC);
 
         String ua = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()
-                .getHeader("User-Agent");
+                                                                                            .getHeader("User-Agent");
         if (ua.toLowerCase().contains("micromessenger")) {
             return "/static/wx_alipay_bridge.html?payUrl=" + URLEncoder
                     .encode(Constants.ALIPAY_URL_SCHEME + qrCode, StandardCharsets.UTF_8)
@@ -856,7 +861,7 @@ public class OrderPayService {
         }
         if (StringUtils.isEmpty(bindCardId)) {
             bindCardId = userBankCardRepo.findByUserId(order.getUserId())
-                    .stream().map(UserBankCard::getBindCardId).findFirst().orElse(null);
+                                         .stream().map(UserBankCard::getBindCardId).findFirst().orElse(null);
         }
         if (StringUtils.isEmpty(bindCardId)) {
             throw new BusinessException("请先绑定银行卡");
@@ -896,7 +901,7 @@ public class OrderPayService {
                 .getPicName(), Constants.OrderNotifyType.DOMAIN);
 
         String ua = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()
-                .getHeader("User-Agent");
+                                                                                            .getHeader("User-Agent");
         if (ua.toLowerCase().contains("micromessenger")) {
             return "/static/wx_alipay_bridge.html?payUrl=" + URLEncoder
                     .encode(Constants.ALIPAY_URL_SCHEME + qrCode, StandardCharsets.UTF_8)
@@ -956,7 +961,7 @@ public class OrderPayService {
         }
         if (StringUtils.isEmpty(bindCardId)) {
             bindCardId = userBankCardRepo.findByUserId(order.getUserId())
-                    .stream().map(UserBankCard::getBindCardId).findFirst().orElse(null);
+                                         .stream().map(UserBankCard::getBindCardId).findFirst().orElse(null);
         }
         if (StringUtils.isEmpty(bindCardId)) {
             throw new BusinessException("请先绑定银行卡");
@@ -964,4 +969,14 @@ public class OrderPayService {
         return payEaseService.pay("域名:" + order.getPicName(), orderId.toString(), order.getPrice(),
                 order.getUserId().toString(), bindCardId, Constants.OrderNotifyType.DOMAIN);
     }
+
+    public void payDomainAskBalance(Long orderId, Long userId, String tradeCode) throws FontFormatException, IOException, WriterException {
+        DomainAsk order = domainAskRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
+        if (order.getStatus() != DomainAskStatus.NOT_PAID) {
+            throw new BusinessException("订单状态错误");
+        }
+        checkTradeCode(userId, tradeCode, order.getUserId());
+        BalanceRecord record = userBalanceService.balancePay(order.getUserId(), order.getPrice(), orderId, "元域名叫价");
+        domainAskService.notifyOrder(orderId, PayMethod.BALANCE, record.getId().toString());
+    }
 }

Разница между файлами не показана из-за своего большого размера
+ 481 - 327
src/main/java/com/izouma/nineth/service/OrderService.java


+ 175 - 61
src/main/java/com/izouma/nineth/service/RiceService.java

@@ -1,19 +1,13 @@
 package com.izouma.nineth.service;
 
 import com.alipay.mychain.sdk.vm.abi.datatype.Int;
-import com.izouma.nineth.domain.Rice;
-import com.izouma.nineth.domain.RiceOperationRecord;
-import com.izouma.nineth.domain.RiceUserWaterDropRecord;
-import com.izouma.nineth.domain.User;
+import com.izouma.nineth.domain.*;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.dto.R;
 import com.izouma.nineth.dto.RiceDTO;
 import com.izouma.nineth.enums.RiceOperationType;
 import com.izouma.nineth.exception.BusinessException;
-import com.izouma.nineth.repo.RiceOperationRecordRepo;
-import com.izouma.nineth.repo.RiceRepo;
-import com.izouma.nineth.repo.RiceUserWaterDropRecordRepo;
-import com.izouma.nineth.repo.UserRepo;
+import com.izouma.nineth.repo.*;
 import com.izouma.nineth.utils.JpaUtils;
 import com.izouma.nineth.utils.SecurityUtils;
 import lombok.AllArgsConstructor;
@@ -32,46 +26,57 @@ import javax.json.JsonArray;
 import javax.json.JsonObject;
 import javax.json.JsonReader;
 import java.io.StringReader;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneOffset;
 import java.util.*;
 
 @Service
 @AllArgsConstructor
 public class RiceService {
 
-    private static final int MAX_NICKNAME_LENGTH = 6;
-    private static final String UPDATE_SUCCESS_MSG = "修改成功";
-    private RiceRepo riceRepo;
-    private RiceUserWaterDropRecordRepo riceUserWaterDropRecordRepo;
-    private RiceOperationRecordRepo riceOperationRecordRepo;
-    private UserRepo userRepo;
-    private SysConfigService sysConfigService;
+    private static final int                         MAX_NICKNAME_LENGTH = 6;
+    private static final String                      UPDATE_SUCCESS_MSG  = "修改成功";
+    private              RiceRepo                    riceRepo;
+    private              RiceUserWaterDropRecordRepo riceUserWaterDropRecordRepo;
+    private              RiceOperationRecordRepo     riceOperationRecordRepo;
+    private              UserRepo                    userRepo;
+    private              SysConfigService            sysConfigService;
+    private RiceInviteRepo  riceInviteRepo;
 
     public Page<Rice> all(PageQuery pageQuery) {
         return riceRepo.findAll(JpaUtils.toSpecification(pageQuery, Rice.class), JpaUtils.toPageRequest(pageQuery));
     }
+
     //点击水稻游戏,进行初始化
     public Rice getCurrentRiceUser(User authenticatedUser) throws BusinessException {
         Long id = authenticatedUser.getId();
         Optional<User> byId = userRepo.findByIdAndDelFalse(id);
         String nickname = null;
         String avatar = null;
+        String phone = null;
         if (byId.isPresent()) {
             User user = byId.get();
             nickname = user.getNickname();
             avatar = user.getAvatar();
+            phone= user.getPhone();
         } else {
             throw new BusinessException("用户不存在");
         }
         Optional<Rice> byUserId = riceRepo.findByUserId(id);
         if (byUserId.isPresent()) {
             Rice rice = byUserId.get();
+            rice.setAvatar(avatar);
+            rice.setPhone(phone);
+            riceRepo.save(rice);
             return rice;
         } else {
             Rice rice = new Rice();
             rice.setUserId(id);
             rice.setAvatar(avatar);
             rice.setNickname(nickname);
+            rice.setPhone(phone);
             rice.setLevel(0L);
             rice.setWaterDropCount(0L);
             rice.setSignCount(0L);
@@ -120,7 +125,8 @@ public class RiceService {
                 JsonObject jsonObject = jsonArray.getJsonObject(i);
                 Long start = Long.valueOf(jsonObject.getInt("start"));
 
-                if (empiricalValue >= start && empiricalValue < (i<jsonArray.size()-1?Long.valueOf(jsonArray.getJsonObject(i+1).getInt("start")):Long.MAX_VALUE)) {
+                if (empiricalValue >= start && empiricalValue < (i < jsonArray.size() - 1 ? Long
+                        .valueOf(jsonArray.getJsonObject(i + 1).getInt("start")) : Long.MAX_VALUE)) {
                     String currentLevelStr = jsonObject.getString("name").replace("Lv", "");
                     currentLevel = Long.parseLong(currentLevelStr);
                     currentStart = Long.valueOf(jsonObject.getInt("start"));
@@ -138,7 +144,7 @@ public class RiceService {
                 result.put("currentLevel", currentLevel);
                 double levelUpPercentage;
                 if (nextStart != null) {
-                    levelUpPercentage = (double)(empiricalValue - currentStart) / (nextStart - currentStart);
+                    levelUpPercentage = (double) (empiricalValue - currentStart) / (nextStart - currentStart);
                 } else {
                     levelUpPercentage = 1.0;
                 }
@@ -164,25 +170,64 @@ public class RiceService {
         Optional<Rice> byUserId = riceRepo.findByUserId(authId);
         if (byUserId.isPresent()) {
             Rice rice = byUserId.get();
+            int i = riceInviteRepo.countRiceInviteBy(rice.getUserId(), getTodayStartTime(), getTodayEndTime());
+
             Long lastSignInTime = rice.getLastSignInTime();
             Long currentTime = System.currentTimeMillis();
+
+            Boolean isCanExchangeActivityScoreForWater;
+            Boolean isInvited;
+            Boolean isCanExchangeScore;
+
+            if(rice.getSelfActivityScore()<10&&rice.getSelfScore()>=2){
+                isCanExchangeScore=true;
+            }else {
+                isCanExchangeScore=false;
+            }
+
+            if(i==0){
+                isInvited = false;
+
+            }else {
+                isInvited = true;
+            }
+
+
+            if (rice.getSelfActivityScore() >= 2) {
+                isCanExchangeActivityScoreForWater = true;
+            } else {
+                isCanExchangeActivityScoreForWater = false;
+            }
             // 判断上次签到时间是否为空,如果为空,则默认为从未签到过
             if (lastSignInTime == null) {
-                return R.success("未签到").add("isSignedIn", false).add("exchangeCount", rice.getExchangeCount() == null ? 0 : rice.getExchangeCount()).add("waterDropCount", rice.getWaterDropCount());
+                return R.success("未签到").add("isSignedIn", false)
+                        .add("exchangeCount", rice.getExchangeCount() == null ? 0 : rice.getExchangeCount())
+                        .add("waterDropCount", rice.getWaterDropCount())
+                        .add("isCanExchangeActivityScoreForWater", isCanExchangeActivityScoreForWater)
+                        .add("isInvited",isInvited)
+                .add("isCanExchangeScore",isCanExchangeScore);
             }
             // 判断今天是否已经签到过
             if (DateUtils.isSameDay(new Date(lastSignInTime), new Date(currentTime))) {
-                return R.success("已签到").add("isSignedIn", true).add("exchangeCount", rice.getExchangeCount() == null ? 0 : rice.getExchangeCount()).add("waterDropCount", rice.getWaterDropCount());
+                return R.success("已签到").add("isSignedIn", true)
+                        .add("exchangeCount", rice.getExchangeCount() == null ? 0 : rice.getExchangeCount())
+                        .add("waterDropCount", rice.getWaterDropCount())
+                        .add("isCanExchangeActivityScoreForWater", isCanExchangeActivityScoreForWater)
+                        .add("isInvited",isInvited)
+                .add("isCanExchangeScore",isCanExchangeScore);
             } else {
-                return R.success("未签到").add("isSignedIn", false).add("exchangeCount", rice.getExchangeCount() == null ? 0 : rice.getExchangeCount()).add("waterDropCount", rice.getWaterDropCount());
+                return R.success("未签到").add("isSignedIn", false)
+                        .add("exchangeCount", rice.getExchangeCount() == null ? 0 : rice.getExchangeCount())
+                        .add("waterDropCount", rice.getWaterDropCount())
+                        .add("isCanExchangeActivityScoreForWater", isCanExchangeActivityScoreForWater)
+                        .add("isInvited",isInvited)
+                .add("isCanExchangeScore",isCanExchangeScore);
             }
         }
         return R.error("查询失败");
     }
 
 
-
-
     /**
      * 获取当前用户积分
      */
@@ -258,7 +303,7 @@ public class RiceService {
         if (!rice1.isPresent()) {
             return R.error("用户不存在");
         }
-        List<Rice> top100Rices = riceRepo.findByOrderBySelfScoreDesc();
+        List<Rice> top100Rices = riceRepo.findTop100OrderByEmpiricalValueDesc();
         List<RiceDTO> result = new ArrayList<>();
         RiceDTO dto = new RiceDTO();
         // 计算自己的排名
@@ -323,10 +368,12 @@ public class RiceService {
             }
             // 浇水成功,更新水滴次数,经验值加2
             rice.setWaterDropCount(waterDropCount - 1);
-            rice.setEmpiricalValue(rice.getEmpiricalValue()+2);
+            rice.setEmpiricalValue(rice.getEmpiricalValue() + 2);
             riceRepo.save(rice);
-            createRiceOperationRecord(authId, RiceOperationType.WATER_DROP, 1L,beforeWaterDropCount , rice.getWaterDropCount());
-            createRiceOperationRecord(authId, RiceOperationType.EMPIRICAL_VALUE, 2L,beforeEmpiricalValue , rice.getEmpiricalValue());
+            createRiceOperationRecord(authId, RiceOperationType.WATER_DROP, 1L, beforeWaterDropCount, rice
+                    .getWaterDropCount());
+            createRiceOperationRecord(authId, RiceOperationType.EMPIRICAL_VALUE, 2L, beforeEmpiricalValue, rice
+                    .getEmpiricalValue());
 
             // Save watering record
             RiceUserWaterDropRecord record = new RiceUserWaterDropRecord();
@@ -338,6 +385,7 @@ public class RiceService {
         }
         return R.error("浇水失败").add("can", false);
     }
+
     //根据用户ID和今日时间获取今日浇水次数的方法
     public Long getTodayWateringCount(Long userId) {
         List<RiceUserWaterDropRecord> records = riceUserWaterDropRecordRepo.findByUserId(userId);
@@ -349,6 +397,7 @@ public class RiceService {
 
     /**
      * 每浇水一次可获得2经验值,升级所需经验值为下一等级所配置的经验值标准。按照以下方式来计算用户升级所需水滴数
+     *
      * @param rice
      * @return
      */
@@ -376,7 +425,6 @@ public class RiceService {
     }
 
 
-
     //签到
     public R<?> signIn(Long userId) {
         Optional<Rice> byUserId = riceRepo.findByUserId(userId);
@@ -392,26 +440,28 @@ public class RiceService {
                 rice.setSignCount(rice.getSignCount() + 1);
                 rice.setLastSignInTime(currentTime);
                 riceRepo.save(rice);
-                createRiceOperationRecord(userId,RiceOperationType.WATER_DROP, (long) 1,beforeWaterDropCount,rice.getWaterDropCount());
-                return R.success("签到成功").add("can",true).add("waterDropCount",rice.getWaterDropCount());
+                createRiceOperationRecord(userId, RiceOperationType.WATER_DROP, (long) 1, beforeWaterDropCount, rice
+                        .getWaterDropCount());
+                return R.success("签到成功").add("can", true).add("waterDropCount", rice.getWaterDropCount());
             }
             // 判断今天是否已经签到过
             if (DateUtils.isSameDay(new Date(lastSignInTime), new Date(currentTime))) {
-                return R.error("今天已经签到过了").add("can",false);
+                return R.error("今天已经签到过了").add("can", false);
             }
             // 签到成功,水滴数加1,签到次数加1,更新签到时间
             rice.setWaterDropCount(rice.getWaterDropCount() + 1);
             rice.setSignCount(rice.getSignCount() + 1);
             rice.setLastSignInTime(currentTime);
             riceRepo.save(rice);
-            createRiceOperationRecord(userId,RiceOperationType.WATER_DROP, (long) 1,beforeWaterDropCount,rice.getWaterDropCount());
-            return R.success("签到成功").add("can",true).add("waterDropCount",rice.getWaterDropCount());
+            createRiceOperationRecord(userId, RiceOperationType.WATER_DROP, (long) 1, beforeWaterDropCount, rice
+                    .getWaterDropCount());
+            return R.success("签到成功").add("can", true).add("waterDropCount", rice.getWaterDropCount());
         }
-        return R.error("签到失败").add("can",false);
+        return R.error("签到失败").add("can", false);
     }
 
 
-    @Transactional
+    //积分兑换水滴
     public R<?> exchangeScoreForWaterDrop(User authenticatedUser) {
         Long authId = authenticatedUser.getId();
         Optional<Rice> byUserId = riceRepo.findByUserId(authId);
@@ -427,24 +477,33 @@ public class RiceService {
             int maxExchangeCount = 10;
 
             // 计算当前可兑换的次数和消耗的积分
-            if(rice.getExchangeCount()==null){
-               rice.setExchangeCount(0);
+//            if (rice.getExchangeCount() == null) {
+//                rice.setExchangeCount(0);
+//            }
+
+            if (rice.getExchangeCount() == 10) {
+                return R.error("您今天已经兑换十次了.").add("waterDropCount", rice.getWaterDropCount());
             }
-            int exchangeCount = Math.min((int) (selfScore / exchangeScore), maxExchangeCount-rice.getExchangeCount());
+            int exchangeCount = Math.min((int) (selfScore / exchangeScore), maxExchangeCount - rice.getExchangeCount());
             int totalScore = exchangeCount * exchangeScore;
 
             if (exchangeCount > 0) {
                 rice.setSelfScore(selfScore - totalScore);
                 rice.setWaterDropCount((long) (waterDropCount + exchangeCount));
+                rice.setExchangeCount(rice.getExchangeCount()+exchangeCount);
                 riceRepo.save(rice);
-                createRiceOperationRecord(authId,RiceOperationType.WATER_DROP, (long) exchangeCount,beforeWaterDropCount,rice.getWaterDropCount());
-                return R.success("兑换成功").add("exchangeCount", exchangeCount).add("waterDropCount", rice.getWaterDropCount());
-            } else if(exchangeCount==0){
-                return R.error("今天已经兑换满10滴水滴了");
+                createRiceOperationRecord(authId, RiceOperationType.WATER_DROP, (long) exchangeCount, beforeWaterDropCount, rice
+                        .getWaterDropCount());
 
-            }
-            else {
-                return R.error("兑换失败,当前积分不足").add("exchangeCount", 0).add("waterDropCount", rice.getWaterDropCount());
+                createRiceOperationRecord(authId, RiceOperationType.SELF_SCORE, (long) totalScore, beforeSelfScore, rice
+                        .getSelfScore());
+                return R.success("兑换成功").add("exchangeCount", exchangeCount)
+                        .add("waterDropCount", rice.getWaterDropCount());
+            } else if (exchangeCount == 0) {
+                return R.error("兑换失败,当前积分不足").add("waterDropCount", rice.getWaterDropCount());
+
+            } else {
+                return R.error("兑换失败,当前积分不足").add("exchangeCount", rice.getExchangeCount()).add("waterDropCount", rice.getWaterDropCount());
             }
         }
         return R.error("兑换失败,用户不存在");
@@ -466,33 +525,88 @@ public class RiceService {
     public R<?> exchangeActivityScoreForWaterDrop(User authenticatedUser) {
 
 
-            // 检查用户活动积分是否足够
-            Optional<Rice> optionalRice = riceRepo.findById(authenticatedUser.getId());
-            if (!optionalRice.isPresent()) {
-                return R.error("未找到用户信息");
-            }
-            Rice rice = optionalRice.get();
-            Long currentActivityPoints = rice.getSelfActivityScore();
+        // 检查用户活动积分是否足够
+        Optional<Rice> optionalRice = riceRepo.findByUserId(authenticatedUser.getId());
+        if (!optionalRice.isPresent()) {
+            return R.error("未找到用户信息");
+        }
+        Rice rice = optionalRice.get();
+        Long currentActivityPoints = rice.getSelfActivityScore();
         Long beforeWaterDropCount = rice.getWaterDropCount();
 
         // 计算兑换的水滴数量
         Long exchangedWaterDropCount = (long) Math.floor(currentActivityPoints / 2.0);
         if (exchangedWaterDropCount <= 0) {
-                return R.error("活动积分不足以兑换水滴").add("times",exchangedWaterDropCount);
-            }
+            return R.error("活动积分不足以兑换水滴").add("counts", exchangedWaterDropCount);
+        }
 
-            // 更新用户活动积分和水滴数
-            rice.setSelfActivityScore(currentActivityPoints - (Long) exchangedWaterDropCount*2);
-            rice.setWaterDropCount(rice.getWaterDropCount() + exchangedWaterDropCount);
-            riceRepo.save(rice);
+        // 更新用户活动积分和水滴数
+        rice.setSelfActivityScore(currentActivityPoints - (Long) exchangedWaterDropCount * 2);
+        rice.setWaterDropCount(rice.getWaterDropCount() + exchangedWaterDropCount);
+        riceRepo.save(rice);
+
+        // 记录水滴操作记录
+        createRiceOperationRecord(authenticatedUser
+                .getId(), RiceOperationType.WATER_DROP, exchangedWaterDropCount, beforeWaterDropCount, rice
+                .getWaterDropCount());
+        createRiceOperationRecord(authenticatedUser
+                .getId(), RiceOperationType.SELF_ACTIVITY_SCORE, (Long) exchangedWaterDropCount * 2, currentActivityPoints, rice
+                .getSelfActivityScore());
+
+        return R.success("兑换成功").add("counts", exchangedWaterDropCount);
+
+
+    }
 
-            // 记录水滴操作记录
-            createRiceOperationRecord(authenticatedUser.getId(), RiceOperationType.WATER_DROP, exchangedWaterDropCount, beforeWaterDropCount, rice.getWaterDropCount());
-            createRiceOperationRecord(authenticatedUser.getId(), RiceOperationType.SELF_ACTIVITY_SCORE, (Long) exchangedWaterDropCount*2, currentActivityPoints, rice.getSelfActivityScore());
+    public void addScoreInOrder(Long userId) {
 
-            return R.success("兑换成功").add("times", exchangedWaterDropCount);
+        Optional<Rice> byUserId = riceRepo.findByUserId(userId);
+        if (byUserId.isPresent()) {
+            Rice rice = byUserId.get();
+            Long beforeSelfScore = rice.getSelfScore();
 
+            String jsonString = sysConfigService.getString("rice_score");
+            JsonReader jsonReader = Json.createReader(new StringReader(jsonString));
+            JsonArray jsonArray = jsonReader.readArray();
 
+            LocalDateTime now = LocalDateTime.now();
+            LocalDateTime todayStartTime = LocalDateTime.of(now.toLocalDate(), LocalTime.MIN).withNano(0);
+            LocalDateTime todayEndTime = LocalDateTime.of(now.toLocalDate(), LocalTime.MAX).withNano(0);
+            int counts = riceOperationRecordRepo.countTodayRiceOperationType(rice.getUserId(), RiceOperationType.SELF_SCORE, todayStartTime, todayEndTime);
+            counts = counts + 1;
+            int defaultScore = 0;
+            for (int i = 0; i < jsonArray.size(); i++) {
+                JsonObject jsonObject = jsonArray.getJsonObject(i);
+                JsonArray countsArray = jsonObject.getJsonArray("counts");
+                int score = jsonObject.getInt("score");
+
+                int lowerBound = countsArray.getInt(0);
+                int upperBound = countsArray.getInt(countsArray.size() - 1);
+
+                if (counts >= lowerBound && counts <= upperBound) {
+                    defaultScore = score;
+                    break;
+                }
+            }
+            // 如果 counts 不在任何范围内,则默认的 score 值是最后一个对象中的 score 值
+            if (!(defaultScore == 0 && jsonArray.size() > 0)) {
+                rice.setSelfScore(rice.getSelfScore() + defaultScore);
+                riceRepo.save(rice);
+                createRiceOperationRecord(userId, RiceOperationType.SELF_SCORE, (long) defaultScore, beforeSelfScore, rice.getSelfScore());
+            }
+
+        }
+    }
+
+    private Long getTodayStartTime() {
+        LocalDate localDate = LocalDate.now();
+        LocalDateTime localDateTime = LocalDateTime.of(localDate, LocalTime.MIN);
+        return localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
+    }
 
+    private Long getTodayEndTime() {
+        LocalDate localDate = LocalDate.now();
+        LocalDateTime localDateTime = LocalDateTime.of(localDate, LocalTime.MAX);
+        return localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
     }
 }

+ 195 - 153
src/main/java/com/izouma/nineth/service/UserBalanceService.java

@@ -5,6 +5,7 @@ import com.alibaba.excel.EasyExcel;
 import com.alibaba.fastjson.JSONObject;
 import com.izouma.nineth.annotations.RedisLock;
 import com.izouma.nineth.domain.*;
+import com.izouma.nineth.domain.nftdomain.DomainAsk;
 import com.izouma.nineth.dto.SandPaySettle;
 import com.izouma.nineth.dto.UserBankCard;
 import com.izouma.nineth.dto.UserWithdraw;
@@ -120,45 +121,47 @@ public class UserBalanceService {
                 continue;
             }
             Asset asset = assets.stream().filter(i -> i.getId().equals(order.getAssetId()))
-                    .findFirst()
-                    .orElseThrow(new BusinessException("藏品不存在"));
+                                .findFirst()
+                                .orElseThrow(new BusinessException("藏品不存在"));
 
             UserBalance userBalance = balanceList.stream().filter(b -> b.getUserId().equals(asset.getUserId()))
-                    .findFirst().orElse(null);
+                                                 .findFirst().orElse(null);
             if (userBalance == null) {
                 userBalance = userBalanceRepo.findById(asset.getUserId())
-                        .orElse(new UserBalance(asset.getUserId(), BigDecimal.ZERO, BigDecimal.ZERO,
-                                false, null, null));
+                                             .orElse(new UserBalance(asset
+                                                     .getUserId(), BigDecimal.ZERO, BigDecimal.ZERO,
+                                                     false, null, null));
                 balanceList.add(userBalance);
             }
 
             BigDecimal amount = order.getTotalPrice()
-                    .subtract(order.getGasPrice())
-                    .multiply(BigDecimal.valueOf(100 - order.getRoyalties() - order.getServiceCharge()))
-                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+                                     .subtract(order.getGasPrice())
+                                     .multiply(BigDecimal
+                                             .valueOf(100 - order.getRoyalties() - order.getServiceCharge()))
+                                     .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
 
             totalAmount = totalAmount.add(order.getTotalPrice());
             royaltiesAmount = royaltiesAmount.add(order.getTotalPrice()
-                    .subtract(order.getGasPrice())
-                    .multiply(BigDecimal.valueOf(order.getRoyalties()))
-                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP));
+                                                       .subtract(order.getGasPrice())
+                                                       .multiply(BigDecimal.valueOf(order.getRoyalties()))
+                                                       .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP));
             serviceChargeAmount = serviceChargeAmount.add(order.getTotalPrice()
-                    .subtract(order.getGasPrice())
-                    .multiply(BigDecimal.valueOf(order.getServiceCharge()))
-                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP));
+                                                               .subtract(order.getGasPrice())
+                                                               .multiply(BigDecimal.valueOf(order.getServiceCharge()))
+                                                               .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP));
 
             userBalance.setLastBalance(userBalance.getBalance());
             userBalance.setBalance(userBalance.getBalance().add(amount));
 
             recordList.add(BalanceRecord.builder()
-                    .time(LocalDateTime.now())
-                    .userId(asset.getUserId())
-                    .orderId(order.getId())
-                    .amount(amount)
-                    .balance(userBalance.getBalance())
-                    .lastBalance(userBalance.getLastBalance())
-                    .type(BalanceType.SELL)
-                    .build());
+                                        .time(LocalDateTime.now())
+                                        .userId(asset.getUserId())
+                                        .orderId(order.getId())
+                                        .amount(amount)
+                                        .balance(userBalance.getBalance())
+                                        .lastBalance(userBalance.getLastBalance())
+                                        .type(BalanceType.SELL)
+                                        .build());
         }
         userBalanceRepo.saveAll(balanceList);
         balanceRecordRepo.saveAll(recordList);
@@ -176,7 +179,7 @@ public class UserBalanceService {
         List<UserBalance> balanceList = userBalanceRepo.findByBalanceGreaterThan(BigDecimal.ZERO);
         List<UserBankCard> userBankCardList = balanceList.isEmpty() ? new ArrayList<>() :
                 userBankCardRepo.findByUserIdIn(balanceList.stream().map(UserBalance::getUserId)
-                        .collect(Collectors.toSet()));
+                                                           .collect(Collectors.toSet()));
         List<UserWithdraw> withdrawList = new ArrayList<>();
         Iterator<UserBalance> it = balanceList.iterator();
         UserBalance ub;
@@ -185,7 +188,7 @@ public class UserBalanceService {
             Long userId = ub.getUserId();
             log.info("查询提现银行卡userId={}", ub.getUserId());
             UserBankCard ubc = userBankCardList.stream().filter(u -> u.getUserId().equals(userId))
-                    .findFirst().orElse(null);
+                                               .findFirst().orElse(null);
             if (ubc != null) {
                 withdrawList.add(new UserWithdraw(userId, ubc.getRealName(), ubc.getBankNo(), ub.getBalance()));
             } else {
@@ -197,7 +200,7 @@ public class UserBalanceService {
         File file1 = new File(tmpDir, DateTimeUtils.format(LocalDate.now(), "yyyyMMdd") + "结算.xlsx");
         File file2 = new File(tmpDir, DateTimeUtils.format(LocalDate.now(), "yyyyMMdd") + "结算导入.xls");
         EasyExcel.write(file1, UserWithdraw.class)
-                .sheet("sheet").doWrite(withdrawList);
+                 .sheet("sheet").doWrite(withdrawList);
 
         InputStream inputStream = getClass().getResourceAsStream("/批量付款到对私银行账户模板.xls");
         Workbook workbook = WorkbookFactory.create(inputStream);
@@ -235,7 +238,7 @@ public class UserBalanceService {
 
         ExportWithdraw exportWithdraw = exportWithdrawRepo.save(new ExportWithdraw(url, remark, withdrawList.size(),
                 withdrawList.stream().map(UserWithdraw::getAmount).reduce(BigDecimal::add)
-                        .orElse(BigDecimal.ZERO), "处理中"));
+                            .orElse(BigDecimal.ZERO), "处理中"));
 
         balanceList.parallelStream().forEach(userBalance -> {
             log.info("提现userId={}", userBalance.getUserId());
@@ -245,13 +248,13 @@ public class UserBalanceService {
             userBalanceRepo.saveAndFlush(userBalance);
 
             balanceRecordRepo.save(BalanceRecord.builder()
-                    .time(LocalDateTime.now())
-                    .userId(userBalance.getUserId())
-                    .amount(amount.negate())
-                    .balance(BigDecimal.ZERO)
-                    .lastBalance(userBalance.getLastBalance())
-                    .type(BalanceType.WITHDRAW)
-                    .build());
+                                                .time(LocalDateTime.now())
+                                                .userId(userBalance.getUserId())
+                                                .amount(amount.negate())
+                                                .balance(BigDecimal.ZERO)
+                                                .lastBalance(userBalance.getLastBalance())
+                                                .type(BalanceType.WITHDRAW)
+                                                .build());
         });
 
         tmpDir.delete();
@@ -263,27 +266,27 @@ public class UserBalanceService {
     @Transactional
     public void importFail(MultipartFile withdrawFile, MultipartFile settleFile) throws IOException {
         List<SandPaySettle> failSettleList = EasyExcel.read(settleFile.getInputStream())
-                .head(SandPaySettle.class).sheet()
-                .doReadSync();
+                                                      .head(SandPaySettle.class).sheet()
+                                                      .doReadSync();
         failSettleList = failSettleList.stream()
-                .filter(s -> "失败".equals(s.getStatus().trim()))
-                .collect(Collectors.toList());
+                                       .filter(s -> "失败".equals(s.getStatus().trim()))
+                                       .collect(Collectors.toList());
         List<UserWithdraw> withdrawList = EasyExcel.read(withdrawFile.getInputStream())
-                .head(UserWithdraw.class).sheet()
-                .doReadSync();
+                                                   .head(UserWithdraw.class).sheet()
+                                                   .doReadSync();
         List<UserWithdraw> failWithdraw = new ArrayList<>();
         for (SandPaySettle sandPaySettle : failSettleList) {
             List<UserWithdraw> list;
             if (StringUtils.isNotBlank(sandPaySettle.getRemark()) && Pattern.matches("^\\d+$", sandPaySettle.getRemark()
-                    .trim())) {
+                                                                                                            .trim())) {
                 Long userId = Long.parseLong(sandPaySettle.getRemark().trim());
                 list = withdrawList.stream().filter(i -> i.getUserId().equals(userId))
-                        .collect(Collectors.toList());
+                                   .collect(Collectors.toList());
             } else {
                 list = withdrawList.stream().filter(i -> i.getBankNo().equals(sandPaySettle.getBankNo())
                         && i.getName().equals(sandPaySettle.getName())
                         && i.getAmount().compareTo(sandPaySettle.getAmount()) == 0)
-                        .collect(Collectors.toList());
+                                   .collect(Collectors.toList());
             }
             if (list.size() != 1) {
                 throw new BusinessException("不唯一:" + sandPaySettle.getName() + "," + sandPaySettle.getBankNo());
@@ -293,20 +296,21 @@ public class UserBalanceService {
         }
         failWithdraw.parallelStream().forEach(withdraw -> {
             UserBalance userBalance = userBalanceRepo.findById(withdraw.getUserId())
-                    .orElse(new UserBalance(withdraw.getUserId(), BigDecimal.ZERO, BigDecimal.ZERO,
-                            false, null, null));
+                                                     .orElse(new UserBalance(withdraw
+                                                             .getUserId(), BigDecimal.ZERO, BigDecimal.ZERO,
+                                                             false, null, null));
             userBalance.setLastBalance(userBalance.getBalance());
             userBalance.setBalance(userBalance.getBalance().add(withdraw.getAmount()));
             userBalanceRepo.saveAndFlush(userBalance);
 
             balanceRecordRepo.save(BalanceRecord.builder()
-                    .time(LocalDateTime.now())
-                    .userId(userBalance.getUserId())
-                    .amount(withdraw.getAmount())
-                    .balance(userBalance.getBalance())
-                    .lastBalance(userBalance.getLastBalance())
-                    .type(BalanceType.RETURN)
-                    .build());
+                                                .time(LocalDateTime.now())
+                                                .userId(userBalance.getUserId())
+                                                .amount(withdraw.getAmount())
+                                                .balance(userBalance.getBalance())
+                                                .lastBalance(userBalance.getLastBalance())
+                                                .type(BalanceType.RETURN)
+                                                .build());
         });
     }
 
@@ -322,16 +326,16 @@ public class UserBalanceService {
                     .findByLockedFalseAndBalanceGreaterThanOrderByUserId(BigDecimal.ZERO);
 
             AutoWithdrawRecord record = AutoWithdrawRecord.builder()
-                    .date(LocalDate.now())
-                    .status("pending")
-                    .progress(0)
-                    .total(list.size())
-                    .build();
+                                                          .date(LocalDate.now())
+                                                          .status("pending")
+                                                          .progress(0)
+                                                          .total(list.size())
+                                                          .build();
             autoWithdrawRecordRepo.saveAndFlush(record);
 
             list.parallelStream().forEach(userBalance -> {
                 UserBankCard userBankCard = userBankCardRepo.findByUserId(userBalance.getUserId())
-                        .stream().findFirst().orElse(null);
+                                                            .stream().findFirst().orElse(null);
                 if (userBankCard == null) {
                     log.info("自动提现userId={}, amount={}, 未绑卡", userBalance.getBalance(), userBalance.getUserId());
                     record.setProgress(record.getProgress() + 1);
@@ -350,14 +354,14 @@ public class UserBalanceService {
                     userBalanceRepo.saveAndFlush(userBalance);
 
                     balanceRecordRepo.save(BalanceRecord.builder()
-                            .time(LocalDateTime.now())
-                            .userId(userBalance.getUserId())
-                            .amount(amount.negate())
-                            .balance(BigDecimal.ZERO)
-                            .lastBalance(userBalance.getLastBalance())
-                            .type(BalanceType.WITHDRAW)
-                            .withdrawId(withdrawId)
-                            .build());
+                                                        .time(LocalDateTime.now())
+                                                        .userId(userBalance.getUserId())
+                                                        .amount(amount.negate())
+                                                        .balance(BigDecimal.ZERO)
+                                                        .lastBalance(userBalance.getLastBalance())
+                                                        .type(BalanceType.WITHDRAW)
+                                                        .withdrawId(withdrawId)
+                                                        .build());
 
                     boolean success = false;
                     String msg = null;
@@ -379,15 +383,15 @@ public class UserBalanceService {
                         userBalanceRepo.saveAndFlush(userBalance);
 
                         balanceRecordRepo.save(BalanceRecord.builder()
-                                .time(LocalDateTime.now())
-                                .userId(userBalance.getUserId())
-                                .amount(amount)
-                                .balance(userBalance.getBalance())
-                                .lastBalance(userBalance.getLastBalance())
-                                .type(BalanceType.RETURN)
-                                .withdrawId(withdrawId)
-                                .remark(msg)
-                                .build());
+                                                            .time(LocalDateTime.now())
+                                                            .userId(userBalance.getUserId())
+                                                            .amount(amount)
+                                                            .balance(userBalance.getBalance())
+                                                            .lastBalance(userBalance.getLastBalance())
+                                                            .type(BalanceType.RETURN)
+                                                            .withdrawId(withdrawId)
+                                                            .remark(msg)
+                                                            .build());
                     }
 
                     record.setProgress(record.getProgress() + 1);
@@ -416,11 +420,13 @@ public class UserBalanceService {
                 List<BalanceRecord> balanceRecords = balanceRecordRepo
                         .findByUserIdOrderByCreatedAt(userBalance.getUserId());
                 List<BalanceRecord> todayRecords = balanceRecords.stream()
-                        .filter(b -> b.getCreatedAt().toLocalDate().equals(now)).collect(Collectors.toList());
+                                                                 .filter(b -> b.getCreatedAt().toLocalDate()
+                                                                               .equals(now))
+                                                                 .collect(Collectors.toList());
                 List<BalanceRecord> oldRecords = balanceRecords.stream()
-                        .filter(b -> !b.getCreatedAt().toLocalDate().equals(now))
-                        .sorted(Comparator.comparing(BaseEntity::getCreatedAt))
-                        .collect(Collectors.toList());
+                                                               .filter(b -> !b.getCreatedAt().toLocalDate().equals(now))
+                                                               .sorted(Comparator.comparing(BaseEntity::getCreatedAt))
+                                                               .collect(Collectors.toList());
                 if (oldRecords.size() == 0) {
                     userBalanceRepo.delete(userBalance);
                 } else {
@@ -446,15 +452,15 @@ public class UserBalanceService {
         userBalanceRepo.save(userBalance);
 
         return balanceRecordRepo.save(BalanceRecord.builder()
-                .userId(userId)
-                .balance(userBalance.getBalance())
-                .lastBalance(userBalance.getLastBalance())
-                .type(BalanceType.PAY)
-                .amount(amount.negate())
-                .time(LocalDateTime.now())
-                .orderId(orderId)
-                .remark(remark)
-                .build());
+                                                   .userId(userId)
+                                                   .balance(userBalance.getBalance())
+                                                   .lastBalance(userBalance.getLastBalance())
+                                                   .type(BalanceType.PAY)
+                                                   .amount(amount.negate())
+                                                   .time(LocalDateTime.now())
+                                                   .orderId(orderId)
+                                                   .remark(remark)
+                                                   .build());
     }
 
     @RedisLock("#userId")
@@ -466,24 +472,24 @@ public class UserBalanceService {
         if (OrderStatus.NOT_PAID == rechargeOrder.getStatus()) {
             BigDecimal amount = rechargeOrder.getAmount();
             UserBalance userBalance = userBalanceRepo.findById(userId).orElse(UserBalance.builder()
-                    .userId(userId)
-                    .balance(BigDecimal.ZERO)
-                    .lastBalance(BigDecimal.ZERO)
-                    .build());
+                                                                                         .userId(userId)
+                                                                                         .balance(BigDecimal.ZERO)
+                                                                                         .lastBalance(BigDecimal.ZERO)
+                                                                                         .build());
             userBalance.setLastBalance(userBalance.getBalance());
             userBalance.setBalance(userBalance.getBalance().add(amount));
             userBalanceRepo.save(userBalance);
 
             balanceRecordRepo.save(BalanceRecord.builder()
-                    .userId(userId)
-                    .balance(userBalance.getBalance())
-                    .lastBalance(userBalance.getLastBalance())
-                    .type(BalanceType.RECHARGE)
-                    .amount(amount)
-                    .time(LocalDateTime.now())
-                    .orderId(orderId)
-                    .payMethod(payMethod)
-                    .build());
+                                                .userId(userId)
+                                                .balance(userBalance.getBalance())
+                                                .lastBalance(userBalance.getLastBalance())
+                                                .type(BalanceType.RECHARGE)
+                                                .amount(amount)
+                                                .time(LocalDateTime.now())
+                                                .orderId(orderId)
+                                                .payMethod(payMethod)
+                                                .build());
 
             rechargeOrder.setStatus(OrderStatus.FINISH);
             rechargeOrderRepo.save(rechargeOrder);
@@ -511,17 +517,17 @@ public class UserBalanceService {
         Long collectionId = Long.valueOf(sysConfigService.getString("recharge_collectionId"));
         User user = userRepo.findById(userId).orElseThrow(new BusinessException("暂无该用户"));
         airDropService.create(AirDrop.builder()
-                .name("春节充值空投福卡")
-                .remark("rechargeOrder:" + orderId)
-                .type(AirDropType.asset)
-                .userIds(Collections.singletonList(userId))
-                .collectionId(collectionId)
-                .targets(Collections
-                        .singletonList(new DropTarget(user.getId(), user.getPhone(), user
-                                .getNickname(), Math.toIntExact(checkResult))))
-                .auto(true)
-                .companyId(1L)
-                .build());
+                                     .name("春节充值空投福卡")
+                                     .remark("rechargeOrder:" + orderId)
+                                     .type(AirDropType.asset)
+                                     .userIds(Collections.singletonList(userId))
+                                     .collectionId(collectionId)
+                                     .targets(Collections
+                                             .singletonList(new DropTarget(user.getId(), user.getPhone(), user
+                                                     .getNickname(), Math.toIntExact(checkResult))))
+                                     .auto(true)
+                                     .companyId(1L)
+                                     .build());
 
     }
 
@@ -541,20 +547,20 @@ public class UserBalanceService {
             throw new BusinessException("最小提现金额为" + minWithdrawAmount);
         }
         UserBankCard userBankCard = userBankCardRepo.findByUserId(userBalance.getUserId())
-                .stream().findFirst().orElseThrow(new BusinessException("请先绑定银行卡"));
+                                                    .stream().findFirst().orElseThrow(new BusinessException("请先绑定银行卡"));
 
         userBalance.setLastBalance(userBalance.getBalance());
         userBalance.setBalance(userBalance.getBalance().subtract(amount));
         userBalanceRepo.saveAndFlush(userBalance);
 
         return balanceRecordRepo.save(BalanceRecord.builder()
-                .time(LocalDateTime.now())
-                .userId(userBalance.getUserId())
-                .amount(amount.negate())
-                .balance(userBalance.getBalance())
-                .lastBalance(userBalance.getLastBalance())
-                .type(BalanceType.WITHDRAW)
-                .build());
+                                                   .time(LocalDateTime.now())
+                                                   .userId(userBalance.getUserId())
+                                                   .amount(amount.negate())
+                                                   .balance(userBalance.getBalance())
+                                                   .lastBalance(userBalance.getLastBalance())
+                                                   .type(BalanceType.WITHDRAW)
+                                                   .build());
     }
 
     @RedisLock(value = "'modifyBalance::'+#userId", behavior = RedisLock.Behavior.WAIT)
@@ -571,15 +577,15 @@ public class UserBalanceService {
         userBalanceRepo.saveAndFlush(userBalance);
 
         balanceRecordRepo.save(BalanceRecord.builder()
-                .time(LocalDateTime.now())
-                .userId(userId)
-                .amount(amount)
-                .balance(userBalance.getBalance())
-                .lastBalance(userBalance.getLastBalance())
-                .type(type)
-                .remark(reason)
-                .withdrawId(withdrawId)
-                .build());
+                                            .time(LocalDateTime.now())
+                                            .userId(userId)
+                                            .amount(amount)
+                                            .balance(userBalance.getBalance())
+                                            .lastBalance(userBalance.getLastBalance())
+                                            .type(type)
+                                            .remark(reason)
+                                            .withdrawId(withdrawId)
+                                            .build());
     }
 
     public void realtimeSettleOrder(Order order) {
@@ -595,36 +601,72 @@ public class UserBalanceService {
         Asset asset = assetRepo.findById(order.getAssetId()).orElse(null);
 
         UserBalance userBalance = userBalanceRepo.findById(asset.getUserId())
-                .orElse(new UserBalance(asset.getUserId()));
+                                                 .orElse(new UserBalance(asset.getUserId()));
 
         BigDecimal amount = order.getTotalPrice()
-                .subtract(order.getGasPrice())
-                .multiply(BigDecimal.valueOf(100 - order.getRoyalties() - order.getServiceCharge()))
-                .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+                                 .subtract(order.getGasPrice())
+                                 .multiply(BigDecimal.valueOf(100 - order.getRoyalties() - order.getServiceCharge()))
+                                 .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
 
         userBalance.setLastBalance(userBalance.getBalance());
         userBalance.setBalance(userBalance.getBalance().add(amount));
         userBalanceRepo.save(userBalance);
 
         balanceRecordRepo.save(BalanceRecord.builder()
-                .time(LocalDateTime.now())
-                .userId(asset.getUserId())
-                .orderId(order.getId())
-                .amount(amount)
-                .balance(userBalance.getBalance())
-                .lastBalance(userBalance.getLastBalance())
-                .type(BalanceType.SELL)
-                .build());
+                                            .time(LocalDateTime.now())
+                                            .userId(asset.getUserId())
+                                            .orderId(order.getId())
+                                            .amount(amount)
+                                            .balance(userBalance.getBalance())
+                                            .lastBalance(userBalance.getLastBalance())
+                                            .type(BalanceType.SELL)
+                                            .build());
+    }
+
+    public void realtimeSettleOrder(DomainAsk domainAsk) {
+        if (!sysConfigService.getBoolean("realtime_settle_order")) {
+            return;
+        }
+        BalanceRecord record = balanceRecordRepo.findByOrderIdAndType(domainAsk.getId(), BalanceType.ASK);
+        if (record != null) {
+            log.info("此订单已结算 domainAskId={}", domainAsk.getId());
+            return;
+        }
+        log.info("结算订单 domainAskId={}", domainAsk.getId());
+        Asset asset = assetRepo.findById(domainAsk.getAssetId()).orElse(null);
+
+        UserBalance userBalance = userBalanceRepo.findById(asset.getUserId())
+                                                 .orElse(new UserBalance(asset.getUserId()));
+
+        BigDecimal amount = domainAsk.getPrice()
+//                                 .subtract(BigDecimal.valueOf(1))
+                                     .multiply(BigDecimal
+                                             .valueOf(100 - domainAsk.getRoyalties() - domainAsk.getServiceCharge()))
+                                     .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+
+        userBalance.setLastBalance(userBalance.getBalance());
+        userBalance.setBalance(userBalance.getBalance().add(amount));
+        userBalanceRepo.save(userBalance);
+
+        balanceRecordRepo.save(BalanceRecord.builder()
+                                            .time(LocalDateTime.now())
+                                            .userId(asset.getUserId())
+                                            .orderId(domainAsk.getId())
+                                            .amount(amount)
+                                            .balance(userBalance.getBalance())
+                                            .lastBalance(userBalance.getLastBalance())
+                                            .type(BalanceType.ASK)
+                                            .build());
     }
 
     public void addBalance(Long userId, BigDecimal amount, Long orderId, BalanceType type) {
         //用户冲余额
         UserBalance userBalance = userBalanceRepo.findByUserId(userId)
-                .orElse(UserBalance.builder()
-                        .balance(BigDecimal.ZERO)
-                        .lastBalance(BigDecimal.ZERO)
-                        .userId(userId)
-                        .build());
+                                                 .orElse(UserBalance.builder()
+                                                                    .balance(BigDecimal.ZERO)
+                                                                    .lastBalance(BigDecimal.ZERO)
+                                                                    .userId(userId)
+                                                                    .build());
 
         userBalance.setLastBalance(userBalance.getBalance());
         userBalance.setBalance(userBalance.getBalance().add(amount));
@@ -632,14 +674,14 @@ public class UserBalanceService {
         log.info("拍卖冲用户余额{},¥{}", userId, amount);
 
         balanceRecordRepo.save(BalanceRecord.builder()
-                .time(LocalDateTime.now())
-                .userId(userId)
-                .orderId(orderId)
-                .amount(amount)
-                .balance(userBalance.getBalance())
-                .lastBalance(userBalance.getLastBalance())
-                .type(type)
-                .build());
+                                            .time(LocalDateTime.now())
+                                            .userId(userId)
+                                            .orderId(orderId)
+                                            .amount(amount)
+                                            .balance(userBalance.getBalance())
+                                            .lastBalance(userBalance.getLastBalance())
+                                            .type(type)
+                                            .build());
     }
 
     public boolean checkBalance(Long userId, BigDecimal balance) {

+ 32 - 2
src/main/java/com/izouma/nineth/service/nftdomain/CartService.java

@@ -1,10 +1,13 @@
 package com.izouma.nineth.service.nftdomain;
 
 import com.alibaba.druid.sql.visitor.functions.If;
+import com.izouma.nineth.domain.Asset;
 import com.izouma.nineth.domain.Collection;
+import com.izouma.nineth.domain.User;
 import com.izouma.nineth.domain.nftdomain.Cart;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.exception.BusinessException;
+import com.izouma.nineth.repo.AssetRepo;
 import com.izouma.nineth.repo.CollectionRepo;
 import com.izouma.nineth.repo.nftdomain.CartRepo;
 import com.izouma.nineth.utils.JpaUtils;
@@ -22,23 +25,39 @@ public class CartService {
 
     private CartRepo       cartRepo;
     private CollectionRepo collectionRepo;
+    private AssetRepo      assetRepo;
 
     public Page<Cart> all(PageQuery pageQuery) {
         return cartRepo.findAll(JpaUtils.toSpecification(pageQuery, Cart.class), JpaUtils.toPageRequest(pageQuery));
     }
 
     public Cart create(Long collectionId) {
-        Long userId = SecurityUtils.getAuthenticatedUser().getId();
+        User user = SecurityUtils.getAuthenticatedUser();
+        Long userId = user.getId();
+        int userLevel = user.getLevel();
+        int maxCount = 5 + (userLevel / 10) * 5;
+        Long nowCount = (Long) collectionCartStatus().get("count");
+        if ((nowCount.intValue()) + 1 > maxCount) {
+            throw new BusinessException("已经超过当前用户等级购物车容量,当前" + userLevel + "级容量为" + maxCount);
+        }
         if (inCart(collectionId, userId)) {
             throw new BusinessException("已经加入购物车");
         }
         Collection collection = collectionRepo.findById(collectionId).orElseThrow(new BusinessException("未找到该藏品"));
+        Asset asset = assetRepo.findById(collection.getAssetId()).orElseThrow(new BusinessException("未找到目标藏品"));
+        if (asset.getUserId().equals(userId)) {
+            throw new BusinessException("该藏品为本人持有");
+        }
         Cart cart = new Cart();
         cart.setEnabled(true);
+        cart.setOwnerId(asset.getOwnerId());
+        cart.setOwner(asset.getOwner());
+        cart.setOwnerAvatar(asset.getOwnerAvatar());
         cart.setUserId(userId);
         cart.setCollectionName(collection.getName());
         cart.setPrice(collection.getPrice());
-        cart.setPic(collection.getPic().get(1).getUrl());
+        cart.setPic(collection.getPic().get(0).getUrl());
+        cart.setPicFile(collection.getPic());
         cart.setCollectionId(collectionId);
         cart.setType(collection.getType());
         return cartRepo.save(cart);
@@ -56,4 +75,15 @@ public class CartService {
         result.put("inCart", inCart(collectionId, userId));
         return result;
     }
+
+    public Map<String, Object> collectionCartStatus() {
+        Long userId = SecurityUtils.getAuthenticatedUser().getId();
+        Long disabledCount = cartRepo.countAllByUserIdAndDelAndEnabled(userId, false, false);
+        Long count = cartRepo.countAllByUserIdAndDel(userId, false);
+        Map<String, Object> result = new HashMap<>();
+        result.put("count", count);
+        result.put("disabledCount", disabledCount);
+//        result.put("inCart", inCart(collectionId, userId));
+        return result;
+    }
 }

+ 160 - 0
src/main/java/com/izouma/nineth/service/nftdomain/DomainAskService.java

@@ -0,0 +1,160 @@
+package com.izouma.nineth.service.nftdomain;
+
+import com.alibaba.fastjson.JSONArray;
+import com.izouma.nineth.domain.Asset;
+import com.izouma.nineth.domain.DomainOrder;
+import com.izouma.nineth.domain.User;
+import com.izouma.nineth.domain.nftdomain.DomainAsk;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.dto.nftdomain.DomainAskGroup;
+import com.izouma.nineth.dto.nftdomain.DomainResult;
+import com.izouma.nineth.enums.*;
+import com.izouma.nineth.exception.BusinessException;
+import com.izouma.nineth.repo.AssetRepo;
+import com.izouma.nineth.repo.DomainOrderRepo;
+import com.izouma.nineth.repo.UserRepo;
+import com.izouma.nineth.repo.nftdomain.DomainAskRepo;
+import com.izouma.nineth.service.AssetService;
+import com.izouma.nineth.service.UserBalanceService;
+import com.izouma.nineth.utils.JpaUtils;
+import com.izouma.nineth.utils.SecurityUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+@Service
+@AllArgsConstructor
+public class DomainAskService {
+
+    private final DomainAskRepo      domainAskRepo;
+    private final DomainOrderRepo    domainOrderRepo;
+    private final AssetRepo          assetRepo;
+    private final UserRepo           userRepo;
+    private final AssetService       assetService;
+    private final UserBalanceService userBalanceService;
+
+    public Page<DomainAsk> all(PageQuery pageQuery) {
+        return domainAskRepo
+                .findAll(JpaUtils.toSpecification(pageQuery, DomainAsk.class), JpaUtils.toPageRequest(pageQuery));
+    }
+
+    public BigDecimal getMaxPrice(Long domainOrderId) {
+        return domainAskRepo.findMaxPrice(domainOrderId);
+    }
+
+    public DomainAsk create(Long domainOrderId, Long userId, BigDecimal price) {
+        User user = userRepo.findById(userId).orElseThrow(new BusinessException("未找到用户"));
+        DomainOrder
+                domainOrder = domainOrderRepo.findById(domainOrderId).orElseThrow(new BusinessException("暂无该藏品"));
+        Asset asset = assetRepo.findFirstByNameAndStatus("RID元宇宙域名 " + domainOrder.getDomainName(), AssetStatus.NORMAL);
+        if (asset == null) {
+            throw new BusinessException("未找到对应藏品。");
+        }
+        if (asset.isConsignment()) {
+            throw new BusinessException("藏品已经寄售,无法出价");
+        }
+        if (userId.equals(asset.getUserId())) {
+            throw new BusinessException("无法叫价自己的藏品");
+        }
+        Set<DomainAskStatus> domainAskStatuses = new HashSet<>();
+        domainAskStatuses.add(DomainAskStatus.ASKING);
+        if (domainAskRepo
+                .countByAssetIdAndUserIdAndStatusInAndDelFalse(asset.getId(), userId, domainAskStatuses) > 0) {
+            throw new BusinessException("已有报价,请勿重复报价!");
+        }
+        DomainAsk domainAsk = DomainAsk.builder()
+                                       .domainOrderId(domainOrderId)
+                                       .assetId(asset.getId())
+                                       .name(domainOrder.getDomainName())
+                                       .ownerAvatar(asset.getOwnerAvatar())
+                                       .ownerId(asset.getOwnerId())
+                                       .nickname(user.getNickname())
+                                       .avatar(user.getAvatar())
+                                       .price(price)
+                                       .userId(userId)
+                                       .status(DomainAskStatus.NOT_PAID)
+                                       .ownerName(asset.getOwner())
+                                       .pic(domainOrder.getPic())
+                                       .picUrl(domainOrder.getPic().get(0).getUrl())
+                                       .serviceCharge(assetService.getDomainServiceCharge(asset.getUserId()))
+                                       .royalties(asset.getRoyalties())
+                                       .endTime(domainOrder.getEndTime())
+                                       .build();
+        return domainAskRepo.save(domainAsk);
+    }
+
+    public void notifyOrder(Long id, PayMethod payMethod, String transactionId) {
+        DomainAsk domainAsk = domainAskRepo.findById(id).orElseThrow(new BusinessException("未找到账户"));
+        domainAsk.setStatus(DomainAskStatus.ASKING);
+        domainAsk.setPayMethod(payMethod);
+        domainAsk.setTransactionId(transactionId);
+        domainAskRepo.save(domainAsk);
+    }
+
+    public List<Map<String, Object>> getGroups() {
+        Long userId = SecurityUtils.getAuthenticatedUser().getId();
+        return domainAskRepo.askGroup(userId);
+    }
+
+    public void cancel(DomainAsk domainAsk) {
+//        DomainAsk domainAsk = domainAskRepo.findById(id).orElseThrow(new BusinessException("未找到账户"));
+        if (domainAsk.getStatus() == DomainAskStatus.NOT_PAID) {
+            domainAsk.setStatus(DomainAskStatus.CANCELLED);
+        }
+        if (domainAsk.getStatus() == DomainAskStatus.ASKING) {
+            if (!SecurityUtils.getAuthenticatedUser().getId().equals(domainAsk.getUserId())) {
+                throw new BusinessException("该叫价用户id不匹配,不能取消");
+            }
+            domainAsk.setStatus(DomainAskStatus.REFUNDED);
+            refund(domainAsk);
+        }
+        domainAskRepo.save(domainAsk);
+    }
+
+    public void refund(DomainAsk domainAsk) {
+        userBalanceService
+                .addBalance(domainAsk.getUserId(), domainAsk.getPrice(), domainAsk.getId(), BalanceType.REFUND);
+    }
+
+    public void accept(Long id) {
+        DomainAsk domainAsk = domainAskRepo.findById(id).orElseThrow(new BusinessException("未查询到该叫价订单"));
+        Asset asset = assetRepo.findById(domainAsk.getAssetId()).orElseThrow(new BusinessException("未找到该藏品"));
+        if (!SecurityUtils.getAuthenticatedUser().getId().equals(domainAsk.getOwnerId())) {
+            throw new BusinessException("非本人收到的报价,不可确认");
+        }
+        if (!domainAsk.getStatus().equals(DomainAskStatus.ASKING)) {
+            throw new BusinessException("该报价未在正在报价状态");
+        }
+        Set<DomainAskStatus> domainAskStatuses = new HashSet<>();
+        domainAskStatuses.add(DomainAskStatus.FINISH);
+        if (domainAskRepo
+                .countByAssetIdAndOwnerIdAndStatusInAndDelFalse(asset.getId(), domainAsk
+                        .getOwnerId(), domainAskStatuses) > 0) {
+            throw new BusinessException("已有通过报价,请勿重复通过!");
+        }
+        BigDecimal amount = domainAsk.getPrice()
+//                                 .subtract(BigDecimal.valueOf(1))
+                                     .multiply(BigDecimal
+                                             .valueOf(100 - domainAsk.getRoyalties() - domainAsk.getServiceCharge()))
+                                     .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+        assetService.transfer(asset, amount,
+                userRepo.findById(domainAsk.getUserId())
+                        .orElseThrow(new BusinessException("未找到用户")), TransferReason.ASK, domainAsk
+                        .getId());
+        userBalanceService.realtimeSettleOrder(domainAsk);
+        domainAsk.setStatus(DomainAskStatus.FINISH);
+        domainAskRepo.save(domainAsk);
+        List<DomainAsk> otherAsks = domainAskRepo
+                .findByAssetIdAndStatusAndDelFalse(asset.getId(), DomainAskStatus.ASKING);
+        otherAsks.forEach(this::cancel);
+    }
+
+
+}

+ 1 - 0
src/main/java/com/izouma/nineth/utils/excel/ExcelUtils.java

@@ -52,6 +52,7 @@ public class ExcelUtils<T> {
                 .registerConverter(new MetaLuckyDrawAwardModelConverter())
                 .registerConverter(new MetaPropTriggerTypeConverter())
                 .registerConverter(new MetaPropUsedTypeConverter())
+                .registerConverter(new WithdrawStatusConverter())
                 .doWrite(data);
     }
 }

+ 43 - 0
src/main/java/com/izouma/nineth/utils/excel/WithdrawStatusConverter.java

@@ -0,0 +1,43 @@
+package com.izouma.nineth.utils.excel;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.CellData;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+import com.izouma.nineth.enums.MetaZombieType;
+import com.izouma.nineth.enums.WithdrawStatus;
+
+public class WithdrawStatusConverter implements Converter<WithdrawStatus> {
+
+    @Override
+    public Class supportJavaTypeKey() {
+        return WithdrawStatus.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return null;
+    }
+
+    @Override
+    public WithdrawStatus convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        try {
+            for (WithdrawStatus value : WithdrawStatus.values()) {
+                if (value.getDescription().equals(cellData.getStringValue())) {
+                    return value;
+                }
+            }
+        } catch (Exception ignored) {
+        }
+        return null;
+    }
+
+    @Override
+    public CellData convertToExcelData(WithdrawStatus value, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        if (value != null) {
+            return new CellData(value.getDescription());
+        }
+        return null;
+    }
+}

+ 19 - 0
src/main/java/com/izouma/nineth/web/CollectionController.java

@@ -22,11 +22,13 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
 import org.springframework.data.domain.Pageable;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
+import javax.print.attribute.standard.NumberOfInterveningJobs;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.*;
@@ -80,8 +82,24 @@ public class CollectionController extends BaseController {
     @PostMapping("/all")
     @JsonView(Collection.View.Basic.class)
     public Page<Collection> all(@RequestBody PageQuery pageQuery) {
+        boolean checkPrefix = false;
+        if (pageQuery.getQuery().get("distinctPrefix") != null) {
+            checkPrefix = true;
+        }
         pageQuery.getQuery().putIfAbsent("companyId", 1);
         Page<Collection> page = collectionService.all(pageQuery).toPage();
+        if (checkPrefix) {
+            List<Collection> newContent = new ArrayList<>();
+            page.getContent().forEach(collection -> {
+                if (collection.isSalable() & !collection.isDel() & collection.isOnShelf()) {
+                    Integer count = collectionService.countNum(collection.getPrefixName());
+                    collection.setTransferringCount(Long.valueOf(count));
+                }
+                newContent.add(collection);
+            });
+            collectionService.queryUserDetail(page.getContent());
+            return new PageImpl<>(newContent, page.getPageable(), page.getTotalElements());
+        }
         collectionService.queryUserDetail(page.getContent());
         return page;
     }
@@ -248,5 +266,6 @@ public class CollectionController extends BaseController {
         map.put("tranferingNum", String.valueOf(tranferCount - 1));
         return map;
     }
+
 }
 

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

@@ -1,9 +1,17 @@
 package com.izouma.nineth.web;
 
+import com.izouma.nineth.domain.Asset;
+import com.izouma.nineth.domain.Collection;
 import com.izouma.nineth.domain.DomainOrder;
 import com.izouma.nineth.dto.excel.DomainCountDTO;
 import com.izouma.nineth.dto.nftdomain.DomainResult;
+import com.izouma.nineth.dto.nftdomain.DomainTop;
+import com.izouma.nineth.enums.AssetStatus;
 import com.izouma.nineth.enums.AuthorityName;
+import com.izouma.nineth.enums.HyperLinkType;
+import com.izouma.nineth.enums.OrderStatus;
+import com.izouma.nineth.repo.AssetRepo;
+import com.izouma.nineth.repo.CollectionRepo;
 import com.izouma.nineth.service.DomainOrderService;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.exception.BusinessException;
@@ -31,6 +39,8 @@ import java.util.Map;
 public class DomainOrderController extends BaseController {
     private DomainOrderService domainOrderService;
     private DomainOrderRepo    domainOrderRepo;
+    private AssetRepo          assetRepo;
+    private CollectionRepo     collectionRepo;
 
     @PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
@@ -74,7 +84,10 @@ public class DomainOrderController extends BaseController {
 
     @GetMapping("/get/{id}")
     public DomainOrder get(@PathVariable Long id) {
-        return domainOrderRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        DomainOrder domainOrder = domainOrderRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        Asset asset = assetRepo.findFirstByNameAndStatus("RID元宇宙域名 " + domainOrder.getDomainName(), AssetStatus.NORMAL);
+        domainOrder.setUserName(asset.getOwner());
+        return domainOrder;
     }
 
     @PreAuthorize("hasAnyRole('ADMIN','ORDERINFO')")
@@ -102,5 +115,33 @@ public class DomainOrderController extends BaseController {
     public List<DomainResult> newestOrder() {
         return domainOrderService.newestOrder();
     }
+
+    @PostMapping("/domainTop")
+    @Cacheable(value = "domainBuyerTop")
+    public List<DomainTop> domainTop() {
+        return domainOrderService.domainTop();
+    }
+
+    //全局买域名的时候,显示每个域名是否绑定了超链.
+
+
+    //自己添加超链
+    @PostMapping("/addHyperLink")
+    public void addHyperLink(@RequestParam Long collectionId, @RequestParam("openHyperLink") boolean openHyperLink,
+                             @RequestParam("hyperLinkType") HyperLinkType hyperLinkType,
+                             @RequestParam("address") String address) {
+        domainOrderService.addHyperLink(collectionId, openHyperLink, hyperLinkType, address);
+
+    }
+
+    //我的超链
+    @GetMapping("/showMyHyperLink")
+    public List<DomainOrder>  showMyHyperLink(){
+     return domainOrderRepo.findAllByCurrentOwnerIdAndOpenHyperLinkIsTrue(SecurityUtils.getAuthenticatedUser().getId());
+    }
+
+
+
+
 }
 

+ 62 - 0
src/main/java/com/izouma/nineth/web/HyperlinkController.java

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

+ 15 - 3
src/main/java/com/izouma/nineth/web/MintActivityController.java

@@ -5,6 +5,7 @@ import com.izouma.nineth.service.MintActivityService;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.MintActivityRepo;
+import com.izouma.nineth.service.SysConfigService;
 import com.izouma.nineth.utils.ObjUtils;
 import com.izouma.nineth.utils.excel.ExcelUtils;
 import lombok.AllArgsConstructor;
@@ -15,6 +16,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.List;
 
 @RestController
@@ -23,6 +25,7 @@ import java.util.List;
 public class MintActivityController extends BaseController {
     private MintActivityService mintActivityService;
     private MintActivityRepo    mintActivityRepo;
+    private SysConfigService    sysConfigService;
 
     @PreAuthorize("hasAnyRole('ADMIN','SAAS')")
     @PostMapping("/save")
@@ -72,9 +75,18 @@ public class MintActivityController extends BaseController {
 //    @Cacheable(cacheNames = "mintActivity", key = "#id")
     public MintActivity get(@PathVariable Long id) {
         MintActivity mintActivity = mintActivityRepo.findById(id).orElseThrow(new BusinessException("无记录"));
-        mintActivity.setVTotal(mintActivity.getTotal());
-        mintActivity.setTotal(0);
-        return mintActivity;
+//        String mintCountCollection = sysConfigService.getString("mint_countCollection");
+//        String regex = ",";
+//        String[] split = mintCountCollection.split(regex);
+//        if (Arrays.asList(split).contains(String.valueOf(id))) {
+//            // Id在split数组中
+//            return mintActivity;
+//        } else {
+//            // Id不在split数组中
+            mintActivity.setVTotal(mintActivity.getTotal());
+            mintActivity.setTotal(0);
+            return mintActivity;
+//        }
     }
 
     @PreAuthorize("hasAnyRole('ADMIN','SAAS')")

+ 30 - 13
src/main/java/com/izouma/nineth/web/OrderController.java

@@ -5,10 +5,7 @@ import com.izouma.nineth.domain.Order;
 import com.izouma.nineth.domain.User;
 import com.izouma.nineth.dto.OrderDTO;
 import com.izouma.nineth.dto.PageQuery;
-import com.izouma.nineth.enums.AuthorityName;
-import com.izouma.nineth.enums.CollectionType;
-import com.izouma.nineth.enums.OrderStatus;
-import com.izouma.nineth.enums.PayMethod;
+import com.izouma.nineth.enums.*;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.AssetRepo;
 import com.izouma.nineth.repo.OrderRepo;
@@ -21,6 +18,7 @@ import com.izouma.nineth.utils.excel.ExcelUtils;
 import lombok.AllArgsConstructor;
 import org.springframework.beans.BeanUtils;
 import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
 import org.springframework.data.domain.Pageable;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
@@ -29,10 +27,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
 import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
 
@@ -63,7 +58,19 @@ public class OrderController extends BaseController {
         if (!SecurityUtils.hasRole(AuthorityName.ROLE_ADMIN)) {
             pageQuery.getQuery().put("userId", SecurityUtils.getAuthenticatedUser().getId());
         }
-        return orderService.all(pageQuery);
+        Page<Order> orders = orderService.all(pageQuery);
+        List<Order> content = orders.getContent();
+        List<Order> newContent = new ArrayList<>();
+        content.forEach(order -> {
+            if (order.getOrderType() != null) {
+                if (order.getOrderType().equals(OrderType.MIX)) {
+                    List<Order> subOrders = orderRepo.findAllByParentOrderId(order.getId());
+                    order.setSubOrders(subOrders);
+                }
+            }
+            newContent.add(order);
+        });
+        return new PageImpl<>(newContent, orders.getPageable(), orders.getTotalElements());
     }
 
     @PostMapping("/backAll")
@@ -81,9 +88,17 @@ public class OrderController extends BaseController {
 
     @GetMapping("/get/{id}")
     public Order get(@PathVariable Long id) {
-        return orderRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        Order order = orderRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        if (order.getOrderType() != null) {
+            if (order.getOrderType().equals(OrderType.MIX)) {
+                List<Order> subOrders = orderRepo.findAllByParentOrderId(order.getId());
+                order.setSubOrders(subOrders);
+            }
+        }
+        return order;
     }
 
+
 //    @PostMapping("/del/{id}")
 //    public void del(@PathVariable Long id) {
 //        orderRepo.softDelete(id);
@@ -119,18 +134,20 @@ public class OrderController extends BaseController {
     }
 
     @PostMapping("/mqCreate")
-    public HashMap<String, String> mqCreate(@RequestParam Long collectionId, @RequestParam int qty,
+    public HashMap<String, String> mqCreate(@RequestParam(required = false) Long collectionId, @RequestParam int qty,
                                             @RequestParam(required = false) Long addressId,
                                             @RequestParam(required = false) Long couponId,
                                             @RequestParam(required = false) Long invitor,
                                             @RequestParam String sign,
                                             @RequestParam(defaultValue = "false") boolean vip,
                                             @RequestParam(defaultValue = "false") boolean safeFlag,
-                                            @RequestParam(required = false) Long showroomId) {
+                                            @RequestParam(required = false) Long showroomId,
+                                            @RequestParam(required = false) OrderType orderType,
+                                            @RequestParam(required = false) String collectionIds) {
         final User user = SecurityUtils.getAuthenticatedUser();
         return new HashMap<>() {{
             put("id", orderService.mqCreate(user.getId(), collectionId, qty, addressId, couponId, invitor, sign,
-                    vip, safeFlag, showroomId));
+                    vip, safeFlag, showroomId, orderType, collectionIds));
         }};
     }
 

+ 6 - 0
src/main/java/com/izouma/nineth/web/OrderPayControllerV2.java

@@ -339,4 +339,10 @@ public class OrderPayControllerV2 {
     public void payTradeAuctionOrderBalance(@RequestParam Long id, @RequestParam String tradeCode) {
         orderPayService.payTradeAuctionOrderBalance(id, SecurityUtils.getAuthenticatedUser().getId(), tradeCode);
     }
+
+    @RequestMapping(value = "/ask/balance")
+    @ResponseBody
+    public void payDomainAskBalance(@RequestParam Long id, @RequestParam String tradeCode) throws FontFormatException, IOException, WriterException {
+        orderPayService.payDomainAskBalance(id, SecurityUtils.getAuthenticatedUser().getId(), tradeCode);
+    }
 }

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

@@ -175,7 +175,7 @@ public class RiceController extends BaseController {
         return riceService.signIn(authId);
     }
 
-    //任务初始化
+
     // 任务初始化.显示各个任务能否点击
     @GetMapping("/taskInitialization")
     public R<?> taskInitialization() {

+ 9 - 0
src/main/java/com/izouma/nineth/web/RiceInviteController.java

@@ -89,6 +89,11 @@ public class RiceInviteController extends BaseController {
     //助力别人并认领水滴
     @PostMapping("/helpOthers")
     public R<?> helpOthers(@RequestParam Long helperId, @RequestParam Long helpeeId) {
+
+        if (helperId.equals(helpeeId)) {
+            return R.error("不能自己助力自己");
+        }
+
         // 检查助力者是否已经助力过该用户
         Optional<RiceInvite> invite = riceInviteRepo.findByHelperIdAndHelpeeIdAndCreateTimeBetween(helperId, helpeeId, getTodayStartTime(), getTodayEndTime());
         if (invite.isPresent()) {
@@ -142,6 +147,10 @@ public class RiceInviteController extends BaseController {
         newInvite.setHelpeeId(helpeeId);
         newInvite.setCreateTime(System.currentTimeMillis());
         riceInviteRepo.save(newInvite);
+        Optional<Rice> byUserId = riceRepo.findByUserId(helpeeId);
+        if(byUserId.isPresent()){
+            Rice rice = byUserId.get();
+        }
 
         // 增加被助力者的水滴数
         Optional<Rice> rice = riceRepo.findByUserId(helpeeId);

+ 73 - 7
src/main/java/com/izouma/nineth/web/nftdomain/CartController.java

@@ -1,5 +1,15 @@
 package com.izouma.nineth.web.nftdomain;
 
+import com.alipay.api.domain.Car;
+import com.izouma.nineth.domain.Collection;
+import com.izouma.nineth.domain.DomainOrder;
+import com.izouma.nineth.enums.AuthorityName;
+import com.izouma.nineth.enums.CollectionType;
+import com.izouma.nineth.enums.OrderStatus;
+import com.izouma.nineth.repo.CollectionRepo;
+import com.izouma.nineth.repo.DomainOrderRepo;
+import com.izouma.nineth.repo.OrderRepo;
+import com.izouma.nineth.utils.SecurityUtils;
 import com.izouma.nineth.web.BaseController;
 import com.izouma.nineth.domain.nftdomain.Cart;
 import com.izouma.nineth.service.nftdomain.CartService;
@@ -11,11 +21,14 @@ import com.izouma.nineth.utils.excel.ExcelUtils;
 
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -23,10 +36,13 @@ import java.util.Map;
 @RequestMapping("/cart")
 @AllArgsConstructor
 public class CartController extends BaseController {
-    private CartService cartService;
-    private CartRepo    cartRepo;
+    private CartService     cartService;
+    private CartRepo        cartRepo;
+    private CollectionRepo  collectionRepo;
+    private DomainOrderRepo domainOrderRepo;
+    private OrderRepo       orderRepo;
 
-    //@PreAuthorize("hasRole('ADMIN')")
+    @PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
     public Cart save(@RequestBody Cart record) {
         if (record.getId() != null) {
@@ -47,11 +63,50 @@ public class CartController extends BaseController {
         return cartService.collectionCartStatus(collectionId);
     }
 
+    @PostMapping("/myStatus")
+    public Map<String, Object> status() {
+        return cartService.collectionCartStatus();
+    }
+
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/all")
     public Page<Cart> all(@RequestBody PageQuery pageQuery) {
-        return cartService.all(pageQuery);
+        if (!SecurityUtils.hasRole(AuthorityName.ROLE_ADMIN) & !SecurityUtils.hasRole(AuthorityName.ROLE_ORDERINFO)) {
+            pageQuery.getQuery().put("userId", SecurityUtils.getAuthenticatedUser().getId());
+        }
+        Page<Cart> carts = cartService.all(pageQuery);
+        List<Cart> content = carts.getContent();
+        List<Cart> newResult = new ArrayList<>();
+        content.forEach(cart -> {
+            if (cart.isEnabled()) {
+                Collection collection = collectionRepo.findById(cart.getCollectionId()).orElse(null);
+                if (collection != null) {
+                    if (!collection.isSalable() || collection.getStock() < 0 || collection.isInPaying()) {
+                        if (!collection.isInPaying()) {
+                            cart.setEnabled(false);
+                            cartRepo.save(cart);
+                        } else {
+                            cart.setInPaying(true);
+                        }
+                    } else {
+                        if (collection.getType().equals(CollectionType.DOMAIN)) {
+                            String domainName = collection.getName().substring(9);
+                            DomainOrder domainOrder = domainOrderRepo
+                                    .findFirstByDomainNameAndOrderStatus(domainName, OrderStatus.FINISH);
+                            if (domainOrder != null)
+                                cart.setEndTime(domainOrder.getEndTime());
+                        }
+                    }
+                } else {
+                    cart.setEnabled(false);
+                    cart.setInPaying(false);
+                    cartRepo.save(cart);
+                }
+            }
+            newResult.add(cart);
+        });
+        return new PageImpl<>(newResult, carts.getPageable(), carts.getTotalElements());
     }
 
     @GetMapping("/get/{id}")
@@ -59,12 +114,23 @@ public class CartController extends BaseController {
         return cartRepo.findById(id).orElseThrow(new BusinessException("无记录"));
     }
 
-    @PostMapping("/del/{id}")
-    public void del(@PathVariable Long id) {
-        cartRepo.softDelete(id);
+//    @PostMapping("/del/{id}")
+//    public void del(@PathVariable Long id) {
+//        cartRepo.softDelete(id);
+//    }
+
+    @PostMapping("/del")
+    public void del(String cartIds) {
+        List<String> ids = Arrays.asList(cartIds.split(","));
+        ids.forEach(id -> {
+            cartRepo.findById(Long.valueOf(id)).ifPresent(deleteCart -> {
+                cartRepo.delete(deleteCart);
+            });
+        });
     }
 
     @GetMapping("/excel")
+    @PreAuthorize("hasRole('ADMIN')")
     @ResponseBody
     public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
         List<Cart> data = all(pageQuery).getContent();

+ 112 - 0
src/main/java/com/izouma/nineth/web/nftdomain/DomainAskController.java

@@ -0,0 +1,112 @@
+package com.izouma.nineth.web.nftdomain;
+
+import com.izouma.nineth.dto.nftdomain.DomainAskGroup;
+import com.izouma.nineth.utils.SecurityUtils;
+import com.izouma.nineth.web.BaseController;
+import com.izouma.nineth.domain.nftdomain.DomainAsk;
+import com.izouma.nineth.service.nftdomain.DomainAskService;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.exception.BusinessException;
+import com.izouma.nineth.repo.nftdomain.DomainAskRepo;
+import com.izouma.nineth.utils.ObjUtils;
+import com.izouma.nineth.utils.excel.ExcelUtils;
+
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+@RestController
+@RequestMapping("/domainAsk")
+@AllArgsConstructor
+public class DomainAskController extends BaseController {
+    private DomainAskService domainAskService;
+    private DomainAskRepo    domainAskRepo;
+
+    @PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public DomainAsk save(@RequestBody DomainAsk record) {
+        if (record.getId() != null) {
+            DomainAsk orig = domainAskRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return domainAskRepo.save(orig);
+        }
+        return domainAskRepo.save(record);
+    }
+
+    @PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/create")
+    public DomainAsk create(Long domainOrderId, BigDecimal price) {
+        Long userId = SecurityUtils.getAuthenticatedUser().getId();
+        return domainAskService.create(domainOrderId, userId, price);
+    }
+
+    @PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/cancel")
+    public void cancel(Long id) {
+        DomainAsk domainAsk = domainAskRepo.findById(id).orElseThrow(new BusinessException("暂无"));
+        if (!SecurityUtils.getAuthenticatedUser().getId().equals(domainAsk.getUserId())) {
+            throw new BusinessException("非自己的叫价不可取消");
+        }
+//        int cancelTime = 24;
+        if (LocalDateTime.now().isBefore(domainAsk.getCreatedAt().plusMinutes(1))) {
+            throw new BusinessException("未满一天不可以取消");
+        }
+        domainAskService.cancel(domainAsk);
+    }
+
+    @PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/accept")
+    public void accept(Long id) {
+        domainAskService.accept(id);
+    }
+
+    @PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/maxPrice")
+    public BigDecimal maxPrice(Long domainOrderId) {
+        return Optional.ofNullable(domainAskService.getMaxPrice(domainOrderId)).orElse(BigDecimal.ZERO);
+    }
+
+    @PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/groupInfo")
+    public List<Map<String, Object>> getGroupInfo() {
+        return domainAskService.getGroups();
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<DomainAsk> all(@RequestBody PageQuery pageQuery) {
+        return domainAskService.all(pageQuery);
+    }
+
+    @PreAuthorize("hasRole('ADMIN')")
+    @GetMapping("/get/{id}")
+    public DomainAsk get(@PathVariable Long id) {
+        return domainAskRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        domainAskRepo.softDelete(id);
+    }
+
+    @PreAuthorize("hasRole('ADMIN')")
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<DomainAsk> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 1 - 1
src/main/nine-space/.env.app_raex

@@ -1,4 +1,4 @@
-VUE_APP_BASE_URL=https://www.raex.vip
+VUE_APP_BASE_URL=http://localhost:8080/
 NODE_ENV=production
 PUBLIC_PATH=./
 ASSETS_PATH=raex

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/resources/static/web-mobile/assets/internal/config.json


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/resources/static/web-mobile/assets/internal/import/02/02229b71c.json


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/resources/static/web-mobile/assets/internal/import/0e/0e59a4145.json


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/resources/static/web-mobile/assets/main/config.json


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/resources/static/web-mobile/assets/main/import/04/047fd44c3.json


+ 0 - 1
src/main/resources/static/web-mobile/assets/main/import/05/0540da930.json

@@ -1 +0,0 @@
-{"type":"cc.Texture2D","data":[["2,2,0,0,0,0",["7agYLdDS9B36JZNNWxkLmr"]],["2,2,2,2,0,0",["7dj5uJT9FMn6OrOOx83tfK"]],["2,2,0,0,0,0",["8fTqmwSy5Bp4hLSjS2HD5B"]],["2,2,2,2,0,0",["430fAuTFpIk5RfLE9CrJg/"]],["2,2,2,2,0,0",["54TknWPwVPqJqeCR+Y/Czo"]],["2,2,2,2,0,0",["20g1ukYUVPvKWKBRznAKo+"]],["2,2,0,0,0,0",["71dz4/aPdPN6j0GYuFXiO2"]],["2,2,2,2,0,0",["95EkngnxZFbYuFpsqVTaFr"]],["2,2,2,2,0,0",["57UgcWSMhKGYrPQcn4d3+w"]],["2,2,0,0,0,0",["abKie4/WVF5L4X9oRlX/P2"]]]}

+ 0 - 1
src/main/resources/static/web-mobile/assets/main/import/05/05ec77bf4.json

@@ -1 +0,0 @@
-{"type":"cc.ImageAsset","data":[[1,0,0,["cc.ImageAsset"],0,[{"fmt":"0","w":0,"h":0},-1],[0],0,[],[],[]],[1,0,0,["cc.ImageAsset"],0,[{"fmt":"0","w":0,"h":0},-1],[0],0,[],[],[]],[1,0,0,["cc.ImageAsset"],0,[{"fmt":"0","w":0,"h":0},-1],[0],0,[],[],[]],[1,0,0,["cc.ImageAsset"],0,[{"fmt":"0","w":0,"h":0},-1],[0],0,[],[],[]],[1,0,0,["cc.ImageAsset"],0,[{"fmt":"0","w":0,"h":0},-1],[0],0,[],[],[]],[1,0,0,["cc.ImageAsset"],0,[{"fmt":"0","w":0,"h":0},-1],[0],0,[],[],[]],[1,0,0,["cc.ImageAsset"],0,[{"fmt":"0","w":0,"h":0},-1],[0],0,[],[],[]],[1,0,0,["cc.ImageAsset"],0,[{"fmt":"0","w":0,"h":0},-1],[0],0,[],[],[]],[1,0,0,["cc.ImageAsset"],0,[{"fmt":"0","w":0,"h":0},-1],[0],0,[],[],[]],[1,0,0,["cc.ImageAsset"],0,[{"fmt":"0","w":0,"h":0},-1],[0],0,[],[],[]]]}

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/resources/static/web-mobile/assets/main/import/06/06c153673.json


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/resources/static/web-mobile/assets/main/import/08/08997832d.json


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/resources/static/web-mobile/assets/main/import/0e/0eb5cd0fc.json


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/resources/static/web-mobile/assets/main/import/0f/0fd2db246.json


BIN
src/main/resources/static/web-mobile/assets/main/import/56/56c49332-afff-453f-92cf-4a474f92bce9@9f0d6.cconb


BIN
src/main/resources/static/web-mobile/assets/main/import/ac/ac5e989e-666e-45d7-a349-b66da3ed049c@48976.cconb


+ 1 - 0
src/main/resources/static/web-mobile/assets/main/import/ba/ba21476f-2866-4f81-9c4d-6e359316e448.json

@@ -0,0 +1 @@
+[1,0,0,[["cc.PhysicsMaterial",["_name","_friction","_rollingFriction","_spinningFriction","_restitution"],-2]],[[0,0,1,2,3,4,6]],[[0,"default-physics-material",0.8,0.1,0.1,0.1]],0,0,[],[],[]]

Разница между файлами не показана из-за своего большого размера
+ 0 - 1
src/main/resources/static/web-mobile/assets/main/index.js


BIN
src/main/resources/static/web-mobile/assets/main/native/09/0957b052-9e15-4390-90e5-dec587a22d6a.jpg


BIN
src/main/resources/static/web-mobile/assets/main/native/0f/0f8a440e-1fca-4d0c-85ab-f6683f4bb81d.png


BIN
src/main/resources/static/web-mobile/assets/main/native/12/1263d74c-8167-4928-91a6-4e2672411f47@2e76e.bin


BIN
src/main/resources/static/web-mobile/assets/main/native/12/1263d74c-8167-4928-91a6-4e2672411f47@fc873.bin


BIN
src/main/resources/static/web-mobile/assets/main/native/16/16385755-58cc-41c6-b460-34c9a66f7f80.jpg


BIN
src/main/resources/static/web-mobile/assets/main/native/1a/1a17e585-f41e-4064-80cc-caa340be9a55.jpg


BIN
src/main/resources/static/web-mobile/assets/main/native/1d/1d613f5d-0d3c-49fd-95f0-45ada8f340b0.png


BIN
src/main/resources/static/web-mobile/assets/main/native/1d/1dfc770d-f5bd-4e81-be18-e7ff20933fc3.jpg


BIN
src/main/resources/static/web-mobile/assets/main/native/2d/2d4f1c99-a696-48fd-9799-7361abd09c54.png


BIN
src/main/resources/static/web-mobile/assets/main/native/2e/2eb6a0cb-8303-4823-9309-f517a7566c02.png


BIN
src/main/resources/static/web-mobile/assets/main/native/39/390f2482-37b1-4b15-8663-b14a91817067.png


BIN
src/main/resources/static/web-mobile/assets/main/native/39/39a35d57-a25a-4ed7-8d1a-10ff68704eb3.jpg


BIN
src/main/resources/static/web-mobile/assets/main/native/3b/3bce75d8-370e-4d49-939f-6188ebd60c15@b47c0@40c10.png


BIN
src/main/resources/static/web-mobile/assets/main/native/3b/3bce75d8-370e-4d49-939f-6188ebd60c15@b47c0@74afd.png


BIN
src/main/resources/static/web-mobile/assets/main/native/3b/3bce75d8-370e-4d49-939f-6188ebd60c15@b47c0@7d38f.png


BIN
src/main/resources/static/web-mobile/assets/main/native/3b/3bce75d8-370e-4d49-939f-6188ebd60c15@b47c0@8fd34.png


BIN
src/main/resources/static/web-mobile/assets/main/native/3b/3bce75d8-370e-4d49-939f-6188ebd60c15@b47c0@bb97f.png


BIN
src/main/resources/static/web-mobile/assets/main/native/3b/3bce75d8-370e-4d49-939f-6188ebd60c15@b47c0@e9a6d.png


BIN
src/main/resources/static/web-mobile/assets/main/native/3d/3d8bf198-fdd5-4fad-8364-bb9c79c3af10.jpg


BIN
src/main/resources/static/web-mobile/assets/main/native/46/4668b013-2ed9-4731-b896-d7ea3b296493.jpg


BIN
src/main/resources/static/web-mobile/assets/main/native/46/468525b9-cc53-4d1d-82f0-b6fd624eb41c.png


BIN
src/main/resources/static/web-mobile/assets/main/native/4a/4a72b62d-eb28-4c22-95f3-82316579bc39.png


BIN
src/main/resources/static/web-mobile/assets/main/native/4a/4a9f5563-7f98-4d63-b316-802ec2f7f39b.png


BIN
src/main/resources/static/web-mobile/assets/main/native/4b/4bc944d6-0cff-464f-beeb-1c9e38ec4309.png


BIN
src/main/resources/static/web-mobile/assets/main/native/52/526c4afc-c5d9-4e49-a54b-576b5808f755.png


BIN
src/main/resources/static/web-mobile/assets/main/native/57/57520716-48c8-4a19-8acf-41c9f8777fb0.png


BIN
src/main/resources/static/web-mobile/assets/main/native/5a/5a2cef41-7638-4ded-b393-10b3da99927c.jpg


BIN
src/main/resources/static/web-mobile/assets/main/native/5c/5cde21b9-66fe-4055-ac40-350562ecf807.mp4


BIN
src/main/resources/static/web-mobile/assets/main/native/61/6195e3c3-218b-4721-8c5c-0b37c2b39924.jpg


Некоторые файлы не были показаны из-за большого количества измененных файлов