فهرست منبع

Merge branch 'dev' of http://git.izouma.com/xiongzhu/raex_back into dev

 Conflicts:
	src/main/java/com/izouma/nineth/service/DomainOrderService.java
	src/main/java/com/izouma/nineth/web/DomainOrderController.java
lajiyouxi-xu 3 سال پیش
والد
کامیت
14c4a0851e
100فایلهای تغییر یافته به همراه3172 افزوده شده و 337 حذف شده
  1. 5 0
      src/main/java/com/izouma/nineth/config/MetaConstants.java
  2. 54 0
      src/main/java/com/izouma/nineth/domain/MetaAtomTask.java
  3. 1 1
      src/main/java/com/izouma/nineth/domain/MetaParamsConfig.java
  4. 1 0
      src/main/java/com/izouma/nineth/domain/MetaProblem.java
  5. 1 1
      src/main/java/com/izouma/nineth/domain/MetaResourcesLikeRecord.java
  6. 62 0
      src/main/java/com/izouma/nineth/domain/MetaStore.java
  7. 35 0
      src/main/java/com/izouma/nineth/domain/MetaStorePurchaseRecord.java
  8. 12 16
      src/main/java/com/izouma/nineth/domain/MetaTask.java
  9. 38 0
      src/main/java/com/izouma/nineth/domain/MetaTaskBind.java
  10. 59 0
      src/main/java/com/izouma/nineth/domain/MetaTaskNew.java
  11. 13 2
      src/main/java/com/izouma/nineth/domain/MetaTaskToUser.java
  12. 83 0
      src/main/java/com/izouma/nineth/domain/MetaTaskToUserNew.java
  13. 28 0
      src/main/java/com/izouma/nineth/domain/MetaTop.java
  14. 2 0
      src/main/java/com/izouma/nineth/domain/MetaUserGold.java
  15. 2 0
      src/main/java/com/izouma/nineth/domain/MetaUserGoldRecord.java
  16. 39 0
      src/main/java/com/izouma/nineth/domain/MetaUserTaskAwardReceivedRecordNew.java
  17. 3 3
      src/main/java/com/izouma/nineth/domain/MetaUserTaskProgress.java
  18. 53 0
      src/main/java/com/izouma/nineth/domain/MetaUserTaskProgressNew.java
  19. 1 0
      src/main/java/com/izouma/nineth/domain/nftdomain/DomainAsk.java
  20. 29 0
      src/main/java/com/izouma/nineth/dto/MetaGoldTopDTO.java
  21. 21 0
      src/main/java/com/izouma/nineth/dto/MetaResourcesLikeDTO.java
  22. 2 2
      src/main/java/com/izouma/nineth/dto/nftdomain/DomainAskGroup.java
  23. 2 2
      src/main/java/com/izouma/nineth/enums/BalanceType.java
  24. 19 0
      src/main/java/com/izouma/nineth/enums/MetaStoreCommodityType.java
  25. 0 22
      src/main/java/com/izouma/nineth/enums/MetaTaskClassification.java
  26. 21 0
      src/main/java/com/izouma/nineth/enums/MetaTaskTarget.java
  27. 4 7
      src/main/java/com/izouma/nineth/enums/MetaTaskType.java
  28. 2 1
      src/main/java/com/izouma/nineth/enums/TransferReason.java
  29. 3 0
      src/main/java/com/izouma/nineth/repo/AssetRepo.java
  30. 21 0
      src/main/java/com/izouma/nineth/repo/MetaAtomTaskRepo.java
  31. 2 0
      src/main/java/com/izouma/nineth/repo/MetaPropRepo.java
  32. 1 1
      src/main/java/com/izouma/nineth/repo/MetaResourcesLikeRecordRepo.java
  33. 11 0
      src/main/java/com/izouma/nineth/repo/MetaStorePurchaseRecordRepo.java
  34. 32 0
      src/main/java/com/izouma/nineth/repo/MetaStoreRepo.java
  35. 26 0
      src/main/java/com/izouma/nineth/repo/MetaTaskBindRepo.java
  36. 27 0
      src/main/java/com/izouma/nineth/repo/MetaTaskNewRepo.java
  37. 21 0
      src/main/java/com/izouma/nineth/repo/MetaTaskToUserNewRepo.java
  38. 16 0
      src/main/java/com/izouma/nineth/repo/MetaTopRepo.java
  39. 7 0
      src/main/java/com/izouma/nineth/repo/MetaUserGoldRecordRepo.java
  40. 7 1
      src/main/java/com/izouma/nineth/repo/MetaUserGoldRepo.java
  41. 15 0
      src/main/java/com/izouma/nineth/repo/MetaUserTaskAwardReceivedRecordNewRepo.java
  42. 18 0
      src/main/java/com/izouma/nineth/repo/MetaUserTaskProgressNewRepo.java
  43. 9 2
      src/main/java/com/izouma/nineth/repo/nftdomain/DomainAskRepo.java
  44. 20 15
      src/main/java/com/izouma/nineth/service/DomainOrderService.java
  45. 20 0
      src/main/java/com/izouma/nineth/service/MetaAtomTaskService.java
  46. 20 0
      src/main/java/com/izouma/nineth/service/MetaStorePurchaseRecordService.java
  47. 184 0
      src/main/java/com/izouma/nineth/service/MetaStoreService.java
  48. 110 0
      src/main/java/com/izouma/nineth/service/MetaTaskNewService.java
  49. 306 0
      src/main/java/com/izouma/nineth/service/MetaTaskToUserNewService.java
  50. 16 0
      src/main/java/com/izouma/nineth/service/MetaTaskToUserService.java
  51. 20 0
      src/main/java/com/izouma/nineth/service/MetaTopService.java
  52. 2 0
      src/main/java/com/izouma/nineth/service/MetaUserGoldRecordService.java
  53. 40 19
      src/main/java/com/izouma/nineth/service/MetaUserGoldService.java
  54. 74 0
      src/main/java/com/izouma/nineth/service/MetaUserTaskAwardReceivedRecordNewService.java
  55. 3 3
      src/main/java/com/izouma/nineth/service/MetaUserTaskAwardReceivedRecordService.java
  56. 183 0
      src/main/java/com/izouma/nineth/service/MetaUserTaskProgressNewService.java
  57. 5 5
      src/main/java/com/izouma/nineth/service/MetaUserTaskProgressService.java
  58. 57 42
      src/main/java/com/izouma/nineth/service/OrderPayService.java
  59. 195 153
      src/main/java/com/izouma/nineth/service/UserBalanceService.java
  60. 3 0
      src/main/java/com/izouma/nineth/service/UserHoldCountService.java
  61. 53 16
      src/main/java/com/izouma/nineth/service/nftdomain/DomainAskService.java
  62. 43 0
      src/main/java/com/izouma/nineth/utils/MetaTaskTargetConverter.java
  63. 41 0
      src/main/java/com/izouma/nineth/utils/excel/ChatTypeConverter.java
  64. 11 0
      src/main/java/com/izouma/nineth/utils/excel/ExcelUtils.java
  65. 41 0
      src/main/java/com/izouma/nineth/utils/excel/MetaLuckyDrawAwardModelConverter.java
  66. 42 0
      src/main/java/com/izouma/nineth/utils/excel/MetaPropTriggerTypeConverter.java
  67. 41 0
      src/main/java/com/izouma/nineth/utils/excel/MetaPropTypeConverter.java
  68. 42 0
      src/main/java/com/izouma/nineth/utils/excel/MetaPropUsedTypeConverter.java
  69. 42 0
      src/main/java/com/izouma/nineth/utils/excel/MetaResourcesTypeConverter.java
  70. 41 0
      src/main/java/com/izouma/nineth/utils/excel/MetaStoreCommodityTypeConverter.java
  71. 41 0
      src/main/java/com/izouma/nineth/utils/excel/MetaSwitchTypeConverter.java
  72. 3 0
      src/main/java/com/izouma/nineth/web/AirDropController.java
  73. 19 4
      src/main/java/com/izouma/nineth/web/AssetController.java
  74. 8 2
      src/main/java/com/izouma/nineth/web/DomainOrderController.java
  75. 65 0
      src/main/java/com/izouma/nineth/web/MetaAtomTaskController.java
  76. 2 2
      src/main/java/com/izouma/nineth/web/MetaProblemController.java
  77. 25 5
      src/main/java/com/izouma/nineth/web/MetaResourcesController.java
  78. 135 0
      src/main/java/com/izouma/nineth/web/MetaStoreController.java
  79. 33 0
      src/main/java/com/izouma/nineth/web/MetaStorePurchaseRecordController.java
  80. 17 2
      src/main/java/com/izouma/nineth/web/MetaTaskController.java
  81. 65 0
      src/main/java/com/izouma/nineth/web/MetaTaskNewController.java
  82. 64 0
      src/main/java/com/izouma/nineth/web/MetaTaskToUserNewController.java
  83. 60 0
      src/main/java/com/izouma/nineth/web/MetaTopController.java
  84. 7 3
      src/main/java/com/izouma/nineth/web/MetaUserGoldController.java
  85. 52 1
      src/main/java/com/izouma/nineth/web/MetaUserGoldRecordController.java
  86. 3 2
      src/main/java/com/izouma/nineth/web/MetaUserTaskAwardReceivedRecordController.java
  87. 39 0
      src/main/java/com/izouma/nineth/web/MetaUserTaskAwardReceivedRecordNewController.java
  88. 51 0
      src/main/java/com/izouma/nineth/web/MetaUserTaskProgressNewController.java
  89. 6 0
      src/main/java/com/izouma/nineth/web/OrderPayControllerV2.java
  90. 12 1
      src/main/java/com/izouma/nineth/web/nftdomain/DomainAskController.java
  91. 1 0
      src/main/resources/genjson/MetaAtomTask.json
  92. 0 0
      src/main/resources/genjson/MetaStore.json
  93. 1 0
      src/main/resources/genjson/MetaTaskNew.json
  94. 0 1
      src/main/resources/static/js/jquery.min.js
  95. 0 0
      src/main/resources/static/web-mobile/assets/main/config.json
  96. 0 0
      src/main/resources/static/web-mobile/assets/main/import/04/047fd44c3.json
  97. 0 0
      src/main/resources/static/web-mobile/assets/main/import/08/08997832d.json
  98. 0 0
      src/main/resources/static/web-mobile/assets/main/import/0a/0a68df1d0.json
  99. 0 0
      src/main/resources/static/web-mobile/assets/main/import/0e/0eb5cd0fc.json
  100. 0 0
      src/main/resources/static/web-mobile/assets/main/import/0f/0fd2db246.json

+ 5 - 0
src/main/java/com/izouma/nineth/config/MetaConstants.java

@@ -12,8 +12,13 @@ public interface MetaConstants {
 
     String META_LUCKY_DRAW_ID = "META_LUCKY_DRAW_ID";
 
+    String META_GOLD_TOP_END_TIME = "META_GOLD_TOP_END_TIME";
+
+    String META_GOLD_TOP_BEGIN_TIME = "META_GOLD_TOP_BEGIN_TIME";
+
     String COMMA = ",";
 
     String BLANK = " ";
 
+    String REDIS_STOCK_PREFIX = "stock:";
 }

+ 54 - 0
src/main/java/com/izouma/nineth/domain/MetaAtomTask.java

@@ -0,0 +1,54 @@
+package com.izouma.nineth.domain;
+
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.izouma.nineth.annotations.Searchable;
+import com.izouma.nineth.enums.MetaAwardTypeEnum;
+import com.izouma.nineth.enums.MetaTaskTarget;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@ApiModel("元宇宙原子任务")
+public class MetaAtomTask extends BaseEntity {
+
+    @Searchable
+    @ApiModelProperty("任务名称")
+    @ExcelProperty("任务名称")
+    private String name;
+
+    @ApiModelProperty("任务详情")
+    @ExcelProperty("任务详情")
+    @Column(columnDefinition = "TEXT")
+    private String detail;
+
+    @ApiModelProperty("任务目标")
+    @ExcelProperty("任务目标")
+    @Enumerated(EnumType.STRING)
+    private MetaTaskTarget targetType;
+
+    @ApiModelProperty("目标配置")
+    @ExcelProperty("目标配置")
+    private String targetConfig;
+
+    @ApiModelProperty("奖励类型")
+    @ExcelProperty("奖励类型")
+    @Enumerated(EnumType.STRING)
+    private MetaAwardTypeEnum awardType;
+
+    @ApiModelProperty("奖励配置")
+    @ExcelProperty("奖励配置")
+    private String awardConfig;
+
+}

+ 1 - 1
src/main/java/com/izouma/nineth/domain/MetaParamsConfig.java

@@ -34,7 +34,7 @@ public class MetaParamsConfig extends AuditedEntity {
     public enum ValueType {
 
         STRING,
-
+        DATETIME,
         BOOLEAN
 
     }

+ 1 - 0
src/main/java/com/izouma/nineth/domain/MetaProblem.java

@@ -23,6 +23,7 @@ public class MetaProblem extends BaseEntity {
     private String title;
 
     @ApiModelProperty("答案")
+    @Column(columnDefinition = "TEXT")
     private String answer;
 
     @ApiModelProperty("文件")

+ 1 - 1
src/main/java/com/izouma/nineth/domain/MetaResourcesLikeRecord.java

@@ -15,7 +15,7 @@ import java.time.LocalDate;
 @ApiModel("元宇宙资源点赞记录")
 public class MetaResourcesLikeRecord extends BaseEntity {
 
-    private Long metaResourcesId;
+    private String metaResourcesName;
 
     private Long userId;
 

+ 62 - 0
src/main/java/com/izouma/nineth/domain/MetaStore.java

@@ -0,0 +1,62 @@
+package com.izouma.nineth.domain;
+
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.izouma.nineth.enums.MetaStoreCommodityType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@ApiModel("元宇宙商店")
+public class MetaStore extends BaseEntity {
+
+    @ApiModelProperty("商品名称")
+    @ExcelProperty("商品名称")
+    private String name;
+
+    @ApiModelProperty("商品类型")
+    @ExcelProperty("商品类型")
+    @Enumerated(EnumType.STRING)
+    private MetaStoreCommodityType commodityType;
+
+    @ApiModelProperty("商品图片")
+    @ExcelProperty("商品图片")
+    private String pic;
+
+    @ApiModelProperty("商品介绍")
+    @ExcelProperty("商品介绍")
+    private String introduction;
+
+    @ApiModelProperty("金币价格")
+    @ExcelProperty("金币价格")
+    private int price;
+
+    @ApiModelProperty("道具id")
+    @ExcelProperty("道具id")
+    private Long metaPropId;
+
+    @ApiModelProperty("库存数量")
+    @ExcelProperty("库存数量")
+    private int stockNum;
+
+    @ApiModelProperty("限购数量")
+    @ExcelProperty("限购数量")
+    private int purchaseLimitNum;
+
+    @ApiModelProperty("是否上架")
+    @ExcelProperty("是否上架")
+    @Column(columnDefinition = "tinyint unsigned")
+    private boolean onShelf;
+
+    @Transient
+    private boolean canPurchase = true;
+
+}

+ 35 - 0
src/main/java/com/izouma/nineth/domain/MetaStorePurchaseRecord.java

@@ -0,0 +1,35 @@
+package com.izouma.nineth.domain;
+
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.izouma.nineth.annotations.Searchable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@ApiModel("元宇宙商店购买记录")
+public class MetaStorePurchaseRecord extends BaseEntity {
+
+    @ApiModelProperty("商品id")
+    @ExcelProperty("商品id")
+    @Searchable
+    private Long metaStoreId;
+
+    @ApiModelProperty("用户id")
+    @ExcelProperty("用户id")
+    @Searchable
+    private Long userId;
+
+    @ApiModelProperty("购买时间")
+    @ExcelProperty("购买时间")
+    private LocalDateTime purchaseTime;
+}

+ 12 - 16
src/main/java/com/izouma/nineth/domain/MetaTask.java

@@ -1,21 +1,18 @@
 package com.izouma.nineth.domain;
 
 
+import com.alibaba.excel.annotation.ExcelIgnore;
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.izouma.nineth.annotations.Searchable;
 import com.izouma.nineth.enums.MetaAwardTypeEnum;
-import com.izouma.nineth.enums.MetaTaskClassification;
-import com.izouma.nineth.enums.MetaTaskType;
+import com.izouma.nineth.enums.MetaTaskTarget;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 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.*;
 
 @Data
 @AllArgsConstructor
@@ -37,12 +34,7 @@ public class MetaTask extends BaseEntity {
     @ApiModelProperty("任务类型")
     @Enumerated(EnumType.STRING)
     @ExcelProperty("任务类型")
-    private MetaTaskType type;
-
-    @ApiModelProperty("任务分类")
-    @Enumerated(EnumType.STRING)
-    @ExcelProperty("任务分类")
-    private MetaTaskClassification classification;
+    private MetaTaskTarget type;
 
     @ApiModelProperty("参数配置")
     @ExcelProperty("参数")
@@ -77,12 +69,16 @@ public class MetaTask extends BaseEntity {
     @ExcelProperty("是否自动领取")
     private boolean autoReceive;
 
-    @ApiModelProperty("道id")
-    @ExcelProperty("道id")
+    @ApiModelProperty("道id")
+    @ExcelProperty("道id")
     private Long metaPropId;
 
-    @ApiModelProperty("道id")
-    @ExcelProperty("道id")
+    @ApiModelProperty("道id")
+    @ExcelProperty("道id")
     @Searchable
     private Long channelId;
+
+    @Transient
+    @ExcelIgnore
+    private MetaProp metaProp;
 }

+ 38 - 0
src/main/java/com/izouma/nineth/domain/MetaTaskBind.java

@@ -0,0 +1,38 @@
+package com.izouma.nineth.domain;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.izouma.nineth.enums.MetaTaskType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@ApiModel("元宇宙主线任务绑定")
+public class MetaTaskBind extends BaseEntity {
+
+    @ApiModelProperty("任务id")
+    @ExcelProperty("任务id")
+    private Long taskId;
+
+    @ApiModelProperty("原子任务id")
+    @ExcelProperty("原子任务id")
+    private Long atomTaskId;
+
+    @ApiModelProperty("原子任务下标")
+    @ExcelProperty("原子任务下标")
+    private int atomTaskIndex;
+
+    @ApiModelProperty("任务分类")
+    @ExcelProperty("任务分类")
+    @Enumerated(EnumType.STRING)
+    private MetaTaskType type;
+}

+ 59 - 0
src/main/java/com/izouma/nineth/domain/MetaTaskNew.java

@@ -0,0 +1,59 @@
+package com.izouma.nineth.domain;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.izouma.nineth.annotations.Searchable;
+import com.izouma.nineth.enums.MetaTaskType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@ApiModel("元宇宙任务")
+public class MetaTaskNew extends BaseEntity {
+
+    @ApiModelProperty("任务名称")
+    @Searchable
+    @ExcelProperty("任务名称")
+    private String name;
+
+    @ApiModelProperty("任务详情")
+    @Column(columnDefinition = "TEXT")
+    @ExcelProperty("任务详情")
+    private String detail;
+
+    @ApiModelProperty("任务分类")
+    @ExcelProperty("任务分类")
+    @Enumerated(EnumType.STRING)
+    private MetaTaskType type;
+
+    @ApiModelProperty("是否发布")
+    @ExcelProperty("是否发布")
+    private boolean publish;
+
+    @ApiModelProperty("是否自动领取")
+    @ExcelProperty("是否自动领取")
+    private boolean autoReceive;
+
+    @Searchable
+    @ApiModelProperty("频道id")
+    @ExcelProperty("频道id")
+    private Long channelId;
+
+    @Transient
+    private List<MetaTaskBind> metaNodeTask;
+
+    @Transient
+    private List<MetaTaskBind> metaBranchLineTask;
+
+    @Transient
+    private List<MetaTaskBind> metaDailyTask;
+
+}

+ 13 - 2
src/main/java/com/izouma/nineth/domain/MetaTaskToUser.java

@@ -5,7 +5,7 @@ import com.alibaba.excel.annotation.ExcelProperty;
 import com.izouma.nineth.annotations.Searchable;
 import com.izouma.nineth.enums.MetaAwardTypeEnum;
 import com.izouma.nineth.enums.MetaTaskStatus;
-import com.izouma.nineth.enums.MetaTaskType;
+import com.izouma.nineth.enums.MetaTaskTarget;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -48,7 +48,7 @@ public class MetaTaskToUser extends BaseEntity {
     @ApiModelProperty("任务类型")
     @Enumerated(EnumType.STRING)
     @ExcelProperty("任务类型")
-    private MetaTaskType taskType;
+    private MetaTaskTarget taskType;
 
     @ApiModelProperty("奖励类型")
     @ExcelProperty("奖励类型")
@@ -64,6 +64,14 @@ public class MetaTaskToUser extends BaseEntity {
     @ExcelProperty("奖励图片地址")
     private String awardPic;
 
+    @ApiModelProperty("金币奖励数量")
+    @ExcelProperty("金币奖励数量")
+    private int goldNum;
+
+    @ApiModelProperty("道具id")
+    @ExcelProperty("道具id")
+    private Long metaPropId;
+
     @ApiModelProperty("当前状态")
     @ExcelProperty("当前状态")
     @Enumerated(EnumType.STRING)
@@ -78,4 +86,7 @@ public class MetaTaskToUser extends BaseEntity {
     @ApiModelProperty("进度")
     @ExcelIgnore
     private String process;
+
+    @Transient
+    private MetaProp metaProp;
 }

+ 83 - 0
src/main/java/com/izouma/nineth/domain/MetaTaskToUserNew.java

@@ -0,0 +1,83 @@
+package com.izouma.nineth.domain;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.izouma.nineth.annotations.Searchable;
+import com.izouma.nineth.enums.MetaTaskStatus;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.Transient;
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@ApiModel("元宇宙玩家领取任务情况-新")
+public class MetaTaskToUserNew extends BaseEntity {
+
+    @Searchable
+    @ApiModelProperty("用户id")
+    @ExcelProperty("用户id")
+    private Long userId;
+
+    @ApiModelProperty("领取时间")
+    @ExcelProperty("领取时间")
+    private LocalDateTime getTime;
+
+    @ApiModelProperty("完成时间")
+    @ExcelProperty("完成时间")
+    private LocalDateTime finishTime;
+
+    @Searchable
+    @ApiModelProperty("任务id")
+    @ExcelProperty("任务id")
+    private Long taskId;
+
+    @Searchable
+    @ApiModelProperty("原子任务id")
+    @ExcelProperty("原子任务id")
+    private Long atomTaskId;
+
+    @ApiModelProperty("当前状态")
+    @ExcelProperty("当前状态")
+    @Enumerated(EnumType.STRING)
+    private MetaTaskStatus status;
+
+    @Searchable
+    @ApiModelProperty("频道id")
+    @ExcelProperty("频道id")
+    private Long channelId;
+
+    @Transient
+    @ExcelIgnore
+    @ApiModelProperty("进度")
+    private String process;
+
+    @Transient
+    @ExcelIgnore
+    @ApiModelProperty("基础任务进度")
+    private String atomTaskProcess;
+
+    @Transient
+    @ExcelIgnore
+    @ApiModelProperty("任务详情")
+    private MetaTaskNew metaTaskNew;
+
+    @Transient
+    @ExcelIgnore
+    @ApiModelProperty("原子任务详情")
+    private MetaAtomTask metaAtomTask;
+
+    @Transient
+    @ExcelIgnore
+    @ApiModelProperty("道具详情")
+    private MetaProp metaProp;
+}

+ 28 - 0
src/main/java/com/izouma/nineth/domain/MetaTop.java

@@ -0,0 +1,28 @@
+package com.izouma.nineth.domain;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@ApiModel("元宇宙排行榜管理")
+public class MetaTop extends BaseEntity{
+
+    @ApiModelProperty("排行榜名称")
+    private String name;
+
+    @ApiModelProperty("排行榜用途")
+    private String rule;
+
+    @ApiModelProperty("配置图片")
+    private String pic;
+
+}

+ 2 - 0
src/main/java/com/izouma/nineth/domain/MetaUserGold.java

@@ -1,6 +1,7 @@
 package com.izouma.nineth.domain;
 
 import com.alibaba.excel.annotation.ExcelProperty;
+import com.izouma.nineth.annotations.Searchable;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -16,6 +17,7 @@ import javax.persistence.Entity;
 @ApiModel("元宇宙玩家金币")
 public class MetaUserGold extends BaseEntity {
 
+    @Searchable
     @ApiModelProperty("用户id")
     @ExcelProperty("用户id")
     private Long userId;

+ 2 - 0
src/main/java/com/izouma/nineth/domain/MetaUserGoldRecord.java

@@ -1,6 +1,7 @@
 package com.izouma.nineth.domain;
 
 import com.alibaba.excel.annotation.ExcelProperty;
+import com.izouma.nineth.annotations.Searchable;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -16,6 +17,7 @@ import javax.persistence.Entity;
 @ApiModel("元宇宙玩家金币明细")
 public class MetaUserGoldRecord extends BaseEntity {
 
+    @Searchable
     @ApiModelProperty("用户id")
     @ExcelProperty("用户id")
     private Long userId;

+ 39 - 0
src/main/java/com/izouma/nineth/domain/MetaUserTaskAwardReceivedRecordNew.java

@@ -0,0 +1,39 @@
+package com.izouma.nineth.domain;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.izouma.nineth.annotations.Searchable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@ApiModel("元宇宙玩家任务奖励领取记录")
+public class MetaUserTaskAwardReceivedRecordNew extends BaseEntity {
+
+    @Searchable
+    @ApiModelProperty("用户id")
+    @ExcelProperty("用户id")
+    private Long userId;
+
+    @Searchable
+    @ApiModelProperty("任务id")
+    @ExcelProperty("任务id")
+    private Long taskId;
+
+    @Searchable
+    @ApiModelProperty("原子任务id")
+    @ExcelProperty("原子任务id")
+    private Long atomTaskId;
+
+    @ApiModelProperty("领取时间")
+    @ExcelProperty("领取时间")
+    private LocalDateTime receivedTime;
+}

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

@@ -1,7 +1,7 @@
 package com.izouma.nineth.domain;
 
 import com.alibaba.excel.annotation.ExcelProperty;
-import com.izouma.nineth.enums.MetaTaskType;
+import com.izouma.nineth.enums.MetaTaskTarget;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -17,7 +17,7 @@ import javax.persistence.Enumerated;
 @NoArgsConstructor
 @Entity
 @ApiModel("元宇宙玩家任务进度")
-public class MetaUserTaskProgress extends BaseEntity{
+public class MetaUserTaskProgress extends BaseEntity {
 
     @ApiModelProperty("元宇宙玩家领取任务记录id")
     @ExcelProperty("玩家领取任务记录id")
@@ -30,7 +30,7 @@ public class MetaUserTaskProgress extends BaseEntity{
     @ApiModelProperty("任务类型")
     @ExcelProperty("任务类型")
     @Enumerated(EnumType.STRING)
-    private MetaTaskType taskType;
+    private MetaTaskTarget taskType;
 
     @ApiModelProperty("任务名称")
     @ExcelProperty("任务名称")

+ 53 - 0
src/main/java/com/izouma/nineth/domain/MetaUserTaskProgressNew.java

@@ -0,0 +1,53 @@
+package com.izouma.nineth.domain;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.izouma.nineth.annotations.Searchable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import javax.persistence.Transient;
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@ApiModel("元宇宙玩家任务进度")
+public class MetaUserTaskProgressNew extends BaseEntity {
+
+    @Searchable
+    @ApiModelProperty("用户id")
+    @ExcelProperty("用户id")
+    private Long userId;
+
+    @ApiModelProperty("玩家领取任务记录id")
+    @ExcelProperty("玩家领取任务记录id")
+    private Long metaTaskToUserNewId;
+
+    @ApiModelProperty("备注")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("进度上传时间")
+    @ExcelProperty("进度上传时间")
+    private LocalDateTime progressTime;
+
+    @ApiModelProperty("备注参数是否唯一,例如收集彩蛋的任务每个备注(彩蛋id)不允许重复完成")
+    @ExcelProperty("备注参数是否唯一")
+    private boolean remarkOnly;
+
+    @Transient
+    @ExcelIgnore
+    @ApiModelProperty("任务详情")
+    private MetaTaskNew metaTaskNew;
+
+    @Transient
+    @ExcelIgnore
+    @ApiModelProperty("原子任务详情")
+    private MetaAtomTask metaAtomTask;
+}

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

@@ -35,6 +35,7 @@ public class DomainAsk extends BaseEntity {
     @Column(columnDefinition = "TEXT")
     @Convert(converter = FileObjectListConverter.class)
     private List<FileObject> pic;
+    private String           picUrl;
     private String           nickname;
     private String           avatar;
     private String           name;

+ 29 - 0
src/main/java/com/izouma/nineth/dto/MetaGoldTopDTO.java

@@ -0,0 +1,29 @@
+package com.izouma.nineth.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class MetaGoldTopDTO {
+
+    @ApiModelProperty("用户Id")
+    @ExcelProperty("用户ID")
+    private Long userId;
+
+    @ApiModelProperty("用户头像")
+    @ExcelProperty("头像")
+    private String head;
+
+    @ApiModelProperty("用户昵称")
+    @ExcelProperty("昵称")
+    private String nickName;
+
+    @ApiModelProperty("用户金币数量")
+    @ExcelProperty("金币数量")
+    private Long num;
+}

+ 21 - 0
src/main/java/com/izouma/nineth/dto/MetaResourcesLikeDTO.java

@@ -0,0 +1,21 @@
+package com.izouma.nineth.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel("资源点赞")
+public class MetaResourcesLikeDTO {
+
+    @ApiModelProperty("点赞数量")
+    private int num;
+
+    @ApiModelProperty("当日是否点赞")
+    private boolean like = false;
+
+}

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

@@ -16,7 +16,7 @@ import java.util.List;
 @NoArgsConstructor
 public class DomainAskGroup {
     @Convert(converter = FileObjectListConverter.class)
-    private List<FileObject> pic;
+    private String pic;
 
     private Long domainOrderId;
 
@@ -24,7 +24,7 @@ public class DomainAskGroup {
 
     private Long picName;
 
-    private int count;
+    private int countNum;
 
     private LocalDateTime endTime;
 }

+ 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;
 

+ 19 - 0
src/main/java/com/izouma/nineth/enums/MetaStoreCommodityType.java

@@ -0,0 +1,19 @@
+package com.izouma.nineth.enums;
+
+public enum MetaStoreCommodityType {
+
+    NFT("NFT"),
+
+    META_PROP("元宇宙道具");
+
+    private final String description;
+
+    MetaStoreCommodityType(String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}
+

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

@@ -1,22 +0,0 @@
-package com.izouma.nineth.enums;
-
-public enum MetaTaskClassification {
-
-    MAIN_LINE("主线任务"),
-
-    BRANCH_LINE("支线任务"),
-
-    NODE("节点任务"),
-
-    DAILY("日常任务");
-
-    private final String description;
-
-    MetaTaskClassification(String description) {
-        this.description = description;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-}

+ 21 - 0
src/main/java/com/izouma/nineth/enums/MetaTaskTarget.java

@@ -0,0 +1,21 @@
+package com.izouma.nineth.enums;
+
+
+public enum MetaTaskTarget {
+
+    COLLECT_COLLECTION("收集藏品"),
+
+    ON_LINE_TIME_DAILY("每日在线时长"),
+
+    ACCUMULATE("累计");
+
+    private final String description;
+
+    MetaTaskTarget(String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}

+ 4 - 7
src/main/java/com/izouma/nineth/enums/MetaTaskType.java

@@ -1,17 +1,14 @@
 package com.izouma.nineth.enums;
 
-
 public enum MetaTaskType {
 
-//    SIGN_IN_SINGLE_DAY("单日签到"),
-//
-//    SIGN_IN_CONTINUOUS("连续多日签到"),
+    MAIN_LINE("主线任务"),
 
-    COLLECT_COLLECTION("收集藏品"),
+    NODE("节点任务"),
 
-    ON_LINE_TIME_DAILY("每日在线时长"),
+    BRANCH_LINE("支线任务"),
 
-    ACCUMULATE("累计");
+    DAILY("日常任务");
 
     private final String 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) {

+ 3 - 0
src/main/java/com/izouma/nineth/repo/AssetRepo.java

@@ -2,6 +2,7 @@ package com.izouma.nineth.repo;
 
 import com.izouma.nineth.domain.Asset;
 import com.izouma.nineth.dto.FuAssetDTO;
+import com.izouma.nineth.dto.MetaRestResult;
 import com.izouma.nineth.enums.AssetSource;
 import com.izouma.nineth.enums.AssetStatus;
 import com.izouma.nineth.enums.CollectionType;
@@ -183,4 +184,6 @@ public interface AssetRepo extends JpaRepository<Asset, Long>, JpaSpecificationE
     void openTrade(String name);
 
     Asset findFirstByNameAndStatus(String name, AssetStatus status);
+
+    Asset findByNameAndStatusAndCategoryAndDel(String name, AssetStatus status, String categroy,boolean del);
 }

+ 21 - 0
src/main/java/com/izouma/nineth/repo/MetaAtomTaskRepo.java

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

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

@@ -16,4 +16,6 @@ public interface MetaPropRepo extends JpaRepository<MetaProp, Long>, JpaSpecific
     void softDelete(Long id);
 
     List<MetaProp> findAllByDel(boolean del);
+
+    MetaProp findByIdAndDel(Long id, boolean del);
 }

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

@@ -8,5 +8,5 @@ import java.time.LocalDate;
 
 public interface MetaResourcesLikeRecordRepo extends JpaRepository<MetaResourcesLikeRecord, Long>, JpaSpecificationExecutor<MetaResourcesLikeRecord> {
 
-    MetaResourcesLikeRecord findByMetaResourcesIdAndUserIdAndLikeTime(Long metaResourcesId, Long userId, LocalDate likeTime);
+    MetaResourcesLikeRecord findByMetaResourcesNameAndUserIdAndLikeTime(String name, Long userId, LocalDate likeTime);
 }

+ 11 - 0
src/main/java/com/izouma/nineth/repo/MetaStorePurchaseRecordRepo.java

@@ -0,0 +1,11 @@
+package com.izouma.nineth.repo;
+
+import com.izouma.nineth.domain.MetaStorePurchaseRecord;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+
+public interface MetaStorePurchaseRecordRepo extends JpaRepository<MetaStorePurchaseRecord, Long>, JpaSpecificationExecutor<MetaStorePurchaseRecord> {
+
+    int countByMetaStoreIdAndUserId(Long metaStoreId, Long userId);
+}

+ 32 - 0
src/main/java/com/izouma/nineth/repo/MetaStoreRepo.java

@@ -0,0 +1,32 @@
+package com.izouma.nineth.repo;
+
+import com.izouma.nineth.domain.MetaStore;
+import com.izouma.nineth.enums.MetaStoreCommodityType;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+public interface MetaStoreRepo extends JpaRepository<MetaStore, Long>, JpaSpecificationExecutor<MetaStore> {
+    @Query("update MetaStore t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    MetaStore findByCommodityTypeAndMetaPropIdAndDel(MetaStoreCommodityType commodityType, Long metaPropId, boolean del);
+
+    MetaStore findByCommodityTypeAndNameAndDel(MetaStoreCommodityType commodityType, String name, boolean del);
+
+    MetaStore findByIdAndDel(Long id, boolean del);
+
+    List<MetaStore> findAllByCommodityTypeAndOnShelfAndDel(MetaStoreCommodityType commodityType, boolean onShelf, boolean del);
+
+    @Query("update MetaStore t set t.stockNum = ?2 where t.id = ?1")
+    @Modifying
+    @Transactional
+    void updateStockNum(Long updateStockNum, int stockNum);
+
+}

+ 26 - 0
src/main/java/com/izouma/nineth/repo/MetaTaskBindRepo.java

@@ -0,0 +1,26 @@
+package com.izouma.nineth.repo;
+
+import com.izouma.nineth.domain.MetaTaskBind;
+import com.izouma.nineth.enums.MetaTaskType;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+
+import java.util.List;
+
+public interface MetaTaskBindRepo extends JpaRepository<MetaTaskBind, Long>, JpaSpecificationExecutor<MetaTaskBind> {
+
+    List<MetaTaskBind> findByTaskIdAndTypeAndDel(Long taskId, MetaTaskType type, boolean del);
+
+    @Query(value = "select m.atom_task_id from meta_task_bind m where m.task_id = ?1 and m.type = ?2 and m.del = false order by m.atom_task_index asc limit 1", nativeQuery = true)
+    Long findAtomTaskId(Long taskId, String type);
+
+    @Query("select m.atomTaskId from MetaTaskBind m where m.taskId = ?1 and m.del = false")
+    List<Long> findAtomTaskIds(Long taskId);
+
+    MetaTaskBind findByTaskIdAndAtomTaskIdAndDel(Long taskId, Long atomTaskId, boolean del);
+
+    @Query(value = "select m.atom_task_id from meta_task_bind m where m.task_id = ?1 and m.type = 'NODE' and m.del = false and m.atom_task_index > ?2 order by m.atom_task_index asc limit 1", nativeQuery = true)
+    Long findNextAtomTaskId(Long taskId, int atomTaskIndex);
+
+}

+ 27 - 0
src/main/java/com/izouma/nineth/repo/MetaTaskNewRepo.java

@@ -0,0 +1,27 @@
+package com.izouma.nineth.repo;
+
+import com.izouma.nineth.domain.MetaTaskNew;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+public interface MetaTaskNewRepo extends JpaRepository<MetaTaskNew, Long>, JpaSpecificationExecutor<MetaTaskNew> {
+    @Query("update MetaTaskNew t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    MetaTaskNew findByIdAndDel(Long id, boolean del);
+
+    @Query(value = "select m1 from MetaTaskNew m1 where m1.autoReceive = true and m1.del = false and m1.id not in (select m2.taskId from MetaTaskToUserNew m2 where m2.userId = ?1 and m2.del = false)")
+    List<MetaTaskNew> findUnReceivedAndAutoReceivedTask(Long userId);
+
+    List<MetaTaskNew> findAllByPublishAndDel(boolean publish, boolean del);
+
+    @Query(value = "select * from meta_task_new where finish = false and del = false and publish = true and channel_id = ?2 and id not in (select task_id from meta_task_to_user where user_id = ?1)", nativeQuery = true)
+    List<MetaTaskNew> canGet(Long userId, Long channelId);
+}

+ 21 - 0
src/main/java/com/izouma/nineth/repo/MetaTaskToUserNewRepo.java

@@ -0,0 +1,21 @@
+package com.izouma.nineth.repo;
+
+
+import com.izouma.nineth.domain.MetaTaskToUserNew;
+import com.izouma.nineth.enums.MetaTaskStatus;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+import java.util.List;
+
+public interface MetaTaskToUserNewRepo extends JpaRepository<MetaTaskToUserNew, Long>, JpaSpecificationExecutor<MetaTaskToUserNew> {
+
+    MetaTaskToUserNew findByUserIdAndTaskIdAndAtomTaskIdAndDel(Long userId, Long taskId, Long atomTaskId, boolean del);
+
+    List<MetaTaskToUserNew> findAllByUserIdAndStatusAndDelAndAtomTaskIdIn(Long userId, MetaTaskStatus status, boolean del, List<Long> atomTaskIds);
+
+    MetaTaskToUserNew findByIdAndDel(Long id, boolean del);
+
+    List<MetaTaskToUserNew> findAllByUserIdAndChannelIdAndStatusAndDel(Long userId, Long channelId, MetaTaskStatus status, boolean del);
+
+}

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

@@ -0,0 +1,16 @@
+package com.izouma.nineth.repo;
+
+import com.izouma.nineth.domain.MetaTop;
+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 MetaTopRepo extends JpaRepository<MetaTop, Long>, JpaSpecificationExecutor<MetaTop> {
+    @Query("update MetaTop t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+}

+ 7 - 0
src/main/java/com/izouma/nineth/repo/MetaUserGoldRecordRepo.java

@@ -1,16 +1,23 @@
 package com.izouma.nineth.repo;
 
 import com.izouma.nineth.domain.MetaUserGoldRecord;
+import com.izouma.nineth.dto.MetaGoldTopDTO;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 
 import javax.transaction.Transactional;
+import java.util.List;
+import java.util.Map;
 
 public interface MetaUserGoldRecordRepo extends JpaRepository<MetaUserGoldRecord, Long>, JpaSpecificationExecutor<MetaUserGoldRecord> {
     @Query("update MetaUserGoldRecord t set t.del = true where t.id = ?1")
     @Modifying
     @Transactional
     void softDelete(Long id);
+
+    @Query(value = "select user_id userId,sum(operation_num) num,nickname nickName,avatar head from meta_user_gold_record inner join user u on meta_user_gold_record.user_id = u.id where meta_user_gold_record.created_at between ?1 and ?2 and operation_num > 0 group by user_id  order by sum(operation_num) desc",nativeQuery = true)
+    List<Map<String,String>> top(String beginTime, String endTime);
 }

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

@@ -8,6 +8,7 @@ import org.springframework.data.jpa.repository.Query;
 
 import javax.transaction.Transactional;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 
 public interface MetaUserGoldRepo extends JpaRepository<MetaUserGold, Long>, JpaSpecificationExecutor<MetaUserGold> {
@@ -16,7 +17,12 @@ public interface MetaUserGoldRepo extends JpaRepository<MetaUserGold, Long>, Jpa
     @Transactional
     void softDelete(Long id);
 
-    MetaUserGold findByUserIdAndDel(Long userId, boolean del);
+    Optional<MetaUserGold> findByUserIdAndDel(Long userId, boolean del);
 
     List<MetaUserGold> findAllByUserIdInAndDel(Set<Long> userIds, boolean del);
+
+    @Query("update MetaUserGold m set m.num = ?2 where m.userId = ?1")
+    @Modifying
+    @Transactional
+    void updateNumByUserId(Long userId, int num);
 }

+ 15 - 0
src/main/java/com/izouma/nineth/repo/MetaUserTaskAwardReceivedRecordNewRepo.java

@@ -0,0 +1,15 @@
+package com.izouma.nineth.repo;
+
+import com.izouma.nineth.domain.MetaUserTaskAwardReceivedRecordNew;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+import java.time.LocalDateTime;
+
+public interface MetaUserTaskAwardReceivedRecordNewRepo extends JpaRepository<MetaUserTaskAwardReceivedRecordNew, Long>, JpaSpecificationExecutor<MetaUserTaskAwardReceivedRecordNew> {
+
+    MetaUserTaskAwardReceivedRecordNew findByUserIdAndTaskIdAndAtomTaskIdAndDel(Long userId, Long taskId, Long atomTaskId, boolean del);
+
+    MetaUserTaskAwardReceivedRecordNew findByUserIdAndTaskIdAndAtomTaskIdAndDelAndReceivedTimeAfter(Long userId, Long taskId, Long atomTaskId, boolean del, LocalDateTime receivedTime);
+
+}

+ 18 - 0
src/main/java/com/izouma/nineth/repo/MetaUserTaskProgressNewRepo.java

@@ -0,0 +1,18 @@
+package com.izouma.nineth.repo;
+
+import com.izouma.nineth.domain.MetaUserTaskProgressNew;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+public interface MetaUserTaskProgressNewRepo extends JpaRepository<MetaUserTaskProgressNew, Long>, JpaSpecificationExecutor<MetaUserTaskProgressNew> {
+
+    List<MetaUserTaskProgressNew> findAllByMetaTaskToUserNewIdAndDel(Long metaTaskToUserNewId, boolean del);
+
+    MetaUserTaskProgressNew findByMetaTaskToUserNewIdAndDelAndCreatedAtAfter(Long metaTaskToUserNewId, boolean del, LocalDateTime createdAt);
+
+    MetaUserTaskProgressNew findByMetaTaskToUserNewIdAndRemarkAndDel(Long metaTaskToUserNewId, String remark, boolean del);
+
+}

+ 9 - 2
src/main/java/com/izouma/nineth/repo/nftdomain/DomainAskRepo.java

@@ -12,6 +12,7 @@ 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> {
@@ -25,6 +26,12 @@ public interface DomainAskRepo extends JpaRepository<DomainAsk, Long>, JpaSpecif
     @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,a.pic 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 in ?1 and da.user_id = ?2 and a.status = 'NORMAL' group by da.asset_id order by a.created_at desc ")
-    List<DomainAskGroup> askGroup(Set<DomainAskStatus> domainAskStatus, Long userId);
+    @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 countByDomainOrderIdAndUserIdAndStatusInAndDelFalse(Long domainOrderId, Long userId, Set<DomainAskStatus> statuses);
+
+    int countByDomainOrderIdAndOwnerIdAndStatusInAndDelFalse(Long domainOrderId, Long userId, Set<DomainAskStatus> statuses);
+
+    List<DomainAsk> findByAssetIdAndStatusAndDelFalse(Long assetId, DomainAskStatus domainAskStatus);
 }

+ 20 - 15
src/main/java/com/izouma/nineth/service/DomainOrderService.java

@@ -285,7 +285,7 @@ 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();
 
@@ -314,21 +314,26 @@ public class DomainOrderService {
             if (!domainOrder.getDomainName().contains(".uni")) {
                 Asset asset = assetRepo
                         .findFirstByNameAndStatus("RID元宇宙域名 " + domainOrder.getDomainName(), AssetStatus.NORMAL);
-                if (asset.isConsignment()) {
-                    sold.put("canAsk", false);
-                } else {
-                    sold.put("canAsk", true);
+                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);
                 }
-                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.isOpenHyperLink()){
-                    sold.put("HyperLinkType", domainOrder.getHyperLinkType());
-                    sold.put("Address", domainOrder.getAddress());
-                }
-                result.add(sold);
             }
         });
         return result;

+ 20 - 0
src/main/java/com/izouma/nineth/service/MetaAtomTaskService.java

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

+ 20 - 0
src/main/java/com/izouma/nineth/service/MetaStorePurchaseRecordService.java

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

+ 184 - 0
src/main/java/com/izouma/nineth/service/MetaStoreService.java

@@ -0,0 +1,184 @@
+package com.izouma.nineth.service;
+
+import com.izouma.nineth.annotations.RedisLock;
+import com.izouma.nineth.config.Constants;
+import com.izouma.nineth.config.MetaConstants;
+import com.izouma.nineth.domain.*;
+import com.izouma.nineth.dto.MetaRestResult;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.enums.MetaPropOperationType;
+import com.izouma.nineth.enums.MetaPropUsedType;
+import com.izouma.nineth.enums.MetaStoreCommodityType;
+import com.izouma.nineth.repo.MetaPropRepo;
+import com.izouma.nineth.repo.MetaStorePurchaseRecordRepo;
+import com.izouma.nineth.repo.MetaStoreRepo;
+import com.izouma.nineth.repo.MetaUserPropRepo;
+import com.izouma.nineth.utils.JpaUtils;
+import com.izouma.nineth.utils.SecurityUtils;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.data.domain.Page;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+import javax.transaction.Transactional;
+import java.time.Duration;
+import java.time.LocalDateTime;
+import java.util.Objects;
+
+@Service
+@AllArgsConstructor
+public class MetaStoreService {
+
+    private RedisTemplate<String, String> redisTemplate;
+
+    private MetaStoreRepo metaStoreRepo;
+
+    private MetaPropRepo metaPropRepo;
+
+    private MetaUserPropRepo metaUserPropRepo;
+
+    private MetaUserGoldService metaUserGoldService;
+
+    private MetaUserPropRecordService metaUserPropRecordService;
+
+    private MetaStorePurchaseRecordRepo metaStorePurchaseRecordRepo;
+
+    public Page<MetaStore> all(PageQuery pageQuery) {
+        return metaStoreRepo.findAll(JpaUtils.toSpecification(pageQuery, MetaStore.class), JpaUtils.toPageRequest(pageQuery));
+    }
+
+    @Transactional
+    public MetaRestResult<Void> purchase(Long id) {
+        MetaStore metaStore = metaStoreRepo.findByIdAndDel(id, false);
+        if (Objects.isNull(metaStore)) {
+            return MetaRestResult.returnError("商品不存在");
+        }
+        if (!metaStore.isOnShelf()) {
+            return MetaRestResult.returnError("商品未上架");
+        }
+        Long userId = SecurityUtils.getAuthenticatedUser().getId();
+        if (MetaStoreCommodityType.META_PROP.equals(metaStore.getCommodityType())) {
+            return purchaseProp(metaStore, userId);
+        }
+        return purchaseNFT(metaStore, userId);
+    }
+
+    @Transactional
+    public MetaRestResult<Void> purchaseProp(MetaStore metaStore, Long userId) {
+        int price = metaStore.getPrice();
+        if (0 >= metaStore.getPrice()) {
+            return MetaRestResult.returnError("道具价格不合法");
+        }
+        MetaProp metaProp = metaPropRepo.findByIdAndDel(metaStore.getMetaPropId(), false);
+        if (Objects.isNull(metaProp)) {
+            return MetaRestResult.returnError("道具信息为空");
+        }
+        MetaUserProp dbMetaUserProp = metaUserPropRepo.findByUserIdAndMetaPropIdAndDel(userId, metaProp.getId(), false);
+        if (Objects.isNull(dbMetaUserProp)) {
+            dbMetaUserProp = MetaUserProp.create(userId, metaProp, 1);
+            MetaRestResult<MetaUserGold> restResult = metaUserGoldService.changeNum(userId, -price, String.format("购买道具:[%S],消耗金币[%s]", metaProp.getId(), price));
+            if (restResult.getCode() != Constants.MetaRestCode.success) {
+                return MetaRestResult.returnError(restResult.getMessage());
+            }
+            metaUserPropRepo.save(dbMetaUserProp);
+            metaUserPropRecordService.save(userId, metaProp, MetaPropOperationType.RECEIVE, 1);
+            metaStorePurchaseRecordRepo.save(new MetaStorePurchaseRecord(metaStore.getId(), userId, LocalDateTime.now()));
+            return MetaRestResult.returnSuccess("购买成功!");
+        }
+        if (MetaPropUsedType.PERMANENT.equals(metaProp.getUsedType()) && dbMetaUserProp.getNum() >= 1) {
+            return MetaRestResult.returnError("已拥有永久道具,不可购买");
+        }
+        MetaRestResult<MetaUserGold> restResult = metaUserGoldService.changeNum(userId, -price, String.format("购买道具:[%S],消耗金币[%s]", metaProp.getId(), price));
+        if (restResult.getCode() != Constants.MetaRestCode.success) {
+            return MetaRestResult.returnError(restResult.getMessage());
+        }
+        dbMetaUserProp.setNum(dbMetaUserProp.getNum() + 1);
+        metaUserPropRepo.save(dbMetaUserProp);
+        metaUserPropRecordService.save(userId, metaProp, MetaPropOperationType.RECEIVE, 1);
+        metaStorePurchaseRecordRepo.save(new MetaStorePurchaseRecord(metaStore.getId(), userId, LocalDateTime.now()));
+        return MetaRestResult.returnSuccess("购买成功!");
+
+    }
+
+    @Transactional
+    @RedisLock("'updateStockNumLock::'+#metaStore.getId()")
+    public MetaRestResult<Void> purchaseNFT(MetaStore metaStore, Long userId) {
+        int price = metaStore.getPrice();
+        if (price <= 0) {
+            return MetaRestResult.returnError("购买失败,道具价格不合法");
+        }
+        // 从缓存中获取库存
+        int stockNum = getStockNumFromCache(metaStore.getId());
+        if (stockNum <= 0) {
+            return MetaRestResult.returnError("购买失败,库存不足");
+        }
+        // 限购
+        if (isPurchaseLimitReached(metaStore.getId(), userId, metaStore.getPurchaseLimitNum())) {
+            return MetaRestResult.returnError(String.format("购买失败,当前商品限购[%s]个", metaStore.getPurchaseLimitNum()));
+        }
+        // 扣减金币
+        MetaRestResult<MetaUserGold> restResult = metaUserGoldService.changeNum(userId, -price, String.format("购买NFT:[%s],消耗金币[%s]", metaStore.getName(), price));
+        if (restResult.getCode() != Constants.MetaRestCode.success) {
+            return MetaRestResult.returnError(restResult.getMessage());
+        }
+        // 更新库存
+        updateStockNum(metaStore.getId(), stockNum - 1);
+        // 保存购买记录
+        metaStorePurchaseRecordRepo.save(new MetaStorePurchaseRecord(metaStore.getId(), userId, LocalDateTime.now()));
+        return MetaRestResult.returnSuccess("购买成功!");
+    }
+
+
+    /**
+     * 从 Redis 中获取库存信息
+     *
+     * @param metaStoreId 商品id
+     * @return 库存数量
+     */
+    private int getStockNumFromCache(Long metaStoreId) {
+        String key = MetaConstants.REDIS_STOCK_PREFIX.concat(String.valueOf(metaStoreId));
+        String stockStr = redisTemplate.opsForValue().get(key);
+        if (StringUtils.isNotBlank(stockStr)) {
+            return Integer.parseInt(stockStr);
+        }
+        // 如果 Redis 中不存在,则从数据库中加载,并写入 Redis 缓存
+        MetaStore metaStore = metaStoreRepo.findByIdAndDel(metaStoreId, false);
+        if (metaStore != null) {
+            int stockNum = metaStore.getStockNum();
+            redisTemplate.opsForValue().set(key, String.valueOf(stockNum), Duration.ofMinutes(5)); // 设置过期时间 5 分钟
+            return stockNum;
+        }
+        return 0;
+    }
+
+    /**
+     * 更新 Redis 中的库存信息,异步更新数据库中的库存
+     *
+     * @param metaStoreId 商品id
+     * @param stockNum    库存数量
+     */
+    @RedisLock("'updateStockNumLock::'+#metaStoreId")
+    public void updateStockNum(Long metaStoreId, int stockNum) {
+        String key = MetaConstants.REDIS_STOCK_PREFIX.concat(String.valueOf(metaStoreId));
+        redisTemplate.opsForValue().set(key, String.valueOf(stockNum), Duration.ofMinutes(5)); // 设置过期时间 5 分钟
+        metaStoreRepo.updateStockNum(metaStoreId, stockNum);
+    }
+
+    /**
+     * 判断是否达到购买限制
+     *
+     * @param metaStoreId      商品id
+     * @param userId           用户id
+     * @param purchaseLimitNum 最大购买数量
+     * @return 是否达到购买限制
+     */
+    private boolean isPurchaseLimitReached(Long metaStoreId, Long userId, Integer purchaseLimitNum) {
+        if (purchaseLimitNum == null || purchaseLimitNum <= 0) {
+            return false;
+        }
+        int count = metaStorePurchaseRecordRepo.countByMetaStoreIdAndUserId(metaStoreId, userId);
+        return count >= purchaseLimitNum;
+    }
+
+}

+ 110 - 0
src/main/java/com/izouma/nineth/service/MetaTaskNewService.java

@@ -0,0 +1,110 @@
+package com.izouma.nineth.service;
+
+import com.izouma.nineth.domain.MetaTaskBind;
+import com.izouma.nineth.domain.MetaTaskNew;
+import com.izouma.nineth.dto.MetaRestResult;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.enums.MetaTaskType;
+import com.izouma.nineth.exception.BusinessException;
+import com.izouma.nineth.repo.MetaTaskBindRepo;
+import com.izouma.nineth.repo.MetaTaskNewRepo;
+import com.izouma.nineth.utils.JpaUtils;
+import com.izouma.nineth.utils.ObjUtils;
+import lombok.AllArgsConstructor;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@AllArgsConstructor
+public class MetaTaskNewService {
+
+    private MetaTaskNewRepo metaTaskNewRepo;
+
+    private MetaTaskBindRepo metaTaskBindRepo;
+
+    public MetaTaskNew save(MetaTaskNew record) {
+        if (record.getId() != null) {
+            MetaTaskNew orig = metaTaskNewRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            MetaTaskNew save = metaTaskNewRepo.save(orig);
+            saveMetaTaskBind(save.getId(), record);
+            return save;
+        }
+        MetaTaskNew save = metaTaskNewRepo.save(record);
+        saveMetaTaskBind(save.getId(), record);
+        return save;
+    }
+
+    private void saveMetaTaskBind(Long taskId, MetaTaskNew record) {
+        // 节点任务
+        if (CollectionUtils.isNotEmpty(record.getMetaNodeTask())) {
+            record.getMetaNodeTask().forEach(metaTaskBind -> {
+                metaTaskBind.setTaskId(taskId);
+                metaTaskBind.setType(MetaTaskType.NODE);
+            });
+            metaTaskBindRepo.saveAll(record.getMetaNodeTask());
+        }
+        // 支线任务
+        if (CollectionUtils.isNotEmpty(record.getMetaBranchLineTask())) {
+            record.getMetaBranchLineTask().forEach(metaTaskBind -> {
+                metaTaskBind.setTaskId(taskId);
+                metaTaskBind.setType(MetaTaskType.BRANCH_LINE);
+            });
+            metaTaskBindRepo.saveAll(record.getMetaBranchLineTask());
+        }
+        // 日常任务
+        if (CollectionUtils.isNotEmpty(record.getMetaDailyTask())) {
+            record.getMetaDailyTask().forEach(metaTaskBind -> {
+                metaTaskBind.setTaskId(taskId);
+                metaTaskBind.setType(MetaTaskType.DAILY);
+            });
+            metaTaskBindRepo.saveAll(record.getMetaDailyTask());
+        }
+    }
+
+    public Page<MetaTaskNew> all(PageQuery pageQuery) {
+        return metaTaskNewRepo.findAll(JpaUtils.toSpecification(pageQuery, MetaTaskNew.class), JpaUtils.toPageRequest(pageQuery));
+    }
+
+    public MetaTaskNew get(Long id) {
+        MetaTaskNew metaTaskNew = metaTaskNewRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        buildAtomTask(metaTaskNew);
+        return metaTaskNew;
+    }
+
+    public MetaRestResult<List<MetaTaskNew>> canGet(Long userId, Long channelId) {
+        List<MetaTaskNew> metaTaskNews = metaTaskNewRepo.canGet(userId, channelId);
+        metaTaskNews.forEach(this::buildAtomTask);
+        return MetaRestResult.returnSuccess(metaTaskNews);
+    }
+
+    private void buildAtomTask(MetaTaskNew metaTaskNew) {
+        if (MetaTaskType.MAIN_LINE.equals(metaTaskNew.getType())) {
+            List<MetaTaskBind> metaNodeTask = metaTaskBindRepo.findByTaskIdAndTypeAndDel(metaTaskNew.getId(), MetaTaskType.NODE, false);
+            if (CollectionUtils.isNotEmpty(metaNodeTask)) {
+                metaTaskNew.setMetaNodeTask(metaNodeTask);
+            }
+            List<MetaTaskBind> metaBranchLineTask = metaTaskBindRepo.findByTaskIdAndTypeAndDel(metaTaskNew.getId(), MetaTaskType.BRANCH_LINE, false);
+            if (CollectionUtils.isNotEmpty(metaBranchLineTask)) {
+                metaTaskNew.setMetaBranchLineTask(metaBranchLineTask);
+            }
+            return;
+        }
+        if (MetaTaskType.BRANCH_LINE.equals(metaTaskNew.getType())) {
+            List<MetaTaskBind> metaBranchLineTask = metaTaskBindRepo.findByTaskIdAndTypeAndDel(metaTaskNew.getId(), MetaTaskType.BRANCH_LINE, false);
+            if (CollectionUtils.isNotEmpty(metaBranchLineTask)) {
+                metaTaskNew.setMetaBranchLineTask(metaBranchLineTask);
+            }
+            return;
+        }
+        if (MetaTaskType.DAILY.equals(metaTaskNew.getType())) {
+            List<MetaTaskBind> metaDailyTask = metaTaskBindRepo.findByTaskIdAndTypeAndDel(metaTaskNew.getId(), MetaTaskType.DAILY, false);
+            if (CollectionUtils.isNotEmpty(metaDailyTask)) {
+                metaTaskNew.setMetaDailyTask(metaDailyTask);
+            }
+        }
+    }
+}

+ 306 - 0
src/main/java/com/izouma/nineth/service/MetaTaskToUserNewService.java

@@ -0,0 +1,306 @@
+package com.izouma.nineth.service;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.alibaba.excel.util.CollectionUtils;
+import com.izouma.nineth.config.Constants;
+import com.izouma.nineth.domain.*;
+import com.izouma.nineth.dto.MetaRestResult;
+import com.izouma.nineth.dto.MetaServiceResult;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.enums.MetaAwardTypeEnum;
+import com.izouma.nineth.enums.MetaTaskStatus;
+import com.izouma.nineth.enums.MetaTaskType;
+import com.izouma.nineth.exception.BusinessException;
+import com.izouma.nineth.repo.*;
+import com.izouma.nineth.utils.JpaUtils;
+import com.izouma.nineth.utils.SecurityUtils;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+import javax.transaction.Transactional;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Objects;
+
+@Service
+@AllArgsConstructor
+@Slf4j
+public class MetaTaskToUserNewService {
+
+    private MetaTaskToUserNewRepo metaTaskToUserNewRepo;
+
+    private MetaAtomTaskRepo metaAtomTaskRepo;
+
+    private MetaTaskNewRepo metaTaskNewRepo;
+
+    private MetaPropRepo metaPropRepo;
+
+    private MetaTaskBindRepo metaTaskBindRepo;
+
+    private MetaUserTaskProgressNewRepo metaUserTaskProgressNewRepo;
+
+    private final String PREFIX = "0/";
+
+    public Page<MetaTaskToUserNew> all(PageQuery pageQuery) {
+        return metaTaskToUserNewRepo.findAll(JpaUtils.toSpecification(pageQuery, MetaTaskToUserNew.class), JpaUtils.toPageRequest(pageQuery));
+    }
+
+    @Transactional
+    public MetaRestResult<Void> autoReceiveTask() {
+        Long userId = SecurityUtils.getAuthenticatedUser().getId();
+        List<MetaTaskNew> metaTaskNews = metaTaskNewRepo.findUnReceivedAndAutoReceivedTask(userId);
+        if (CollectionUtil.isNotEmpty(metaTaskNews)) {
+            metaTaskNews.forEach(metaTaskNew -> {
+                MetaTaskToUserNew metaTaskToUserNew = new MetaTaskToUserNew();
+                metaTaskToUserNew.setUserId(userId);
+                metaTaskToUserNew.setTaskId(metaTaskNew.getId());
+                // 设置主动领取第一个索引的基础任务
+                if (MetaTaskType.MAIN_LINE.equals(metaTaskNew.getType())) {
+                    Long atomTaskId = metaTaskBindRepo.findAtomTaskId(metaTaskNew.getId(), MetaTaskType.NODE.toString());
+                    if (Objects.nonNull(atomTaskId)) {
+                        metaTaskToUserNew.setAtomTaskId(atomTaskId);
+                    }
+                }
+                if (MetaTaskType.BRANCH_LINE.equals(metaTaskNew.getType())) {
+                    Long atomTaskId = metaTaskBindRepo.findAtomTaskId(metaTaskNew.getId(), MetaTaskType.BRANCH_LINE.toString());
+                    if (Objects.nonNull(atomTaskId)) {
+                        metaTaskToUserNew.setAtomTaskId(atomTaskId);
+                    }
+                }
+                if (MetaTaskType.DAILY.equals(metaTaskNew.getType())) {
+                    Long atomTaskId = metaTaskBindRepo.findAtomTaskId(metaTaskNew.getId(), MetaTaskType.DAILY.toString());
+                    if (Objects.nonNull(atomTaskId)) {
+                        metaTaskToUserNew.setAtomTaskId(atomTaskId);
+                    }
+                }
+                MetaRestResult<MetaTaskToUserNew> result = receiveTask(metaTaskToUserNew, false);
+                if (Constants.MetaRestCode.success != result.getCode()) {
+                    throw new BusinessException(result.getMessage());
+                }
+            });
+            return MetaRestResult.returnSuccess("主动任务领取成功");
+        }
+        return MetaRestResult.returnSuccess("玩家主动领取任务已经全部领取");
+    }
+
+    @Transactional
+    public MetaRestResult<MetaTaskToUserNew> receiveTask(MetaTaskToUserNew metaTaskToUserNew, boolean progress) {
+        if (Objects.isNull(metaTaskToUserNew.getUserId())) {
+            return MetaRestResult.returnError("Illegal parameter : userId can not be null");
+        }
+        if (Objects.isNull(metaTaskToUserNew.getTaskId())) {
+            return MetaRestResult.returnError("Illegal parameter : taskId can not be null");
+        }
+        if (Objects.isNull(metaTaskToUserNew.getAtomTaskId())) {
+            return MetaRestResult.returnError("Illegal parameter : atomTaskId can not be null");
+        }
+        MetaTaskNew metaTaskNew = metaTaskNewRepo.findByIdAndDel(metaTaskToUserNew.getTaskId(), false);
+        MetaServiceResult checkMetaTaskNewResult = checkMetaTaskNew(metaTaskNew);
+        if (!checkMetaTaskNewResult.isSuccess()) {
+            return MetaRestResult.returnError(checkMetaTaskNewResult.getMessage());
+        }
+        metaTaskToUserNew.setMetaTaskNew(metaTaskNew);
+        MetaAtomTask metaAtomTask = metaAtomTaskRepo.findByIdAndDel(metaTaskToUserNew.getAtomTaskId(), false);
+        MetaServiceResult checkMetaAtomTaskResult = checkMetaAtomTask(metaAtomTask);
+        if (!checkMetaAtomTaskResult.isSuccess()) {
+            return MetaRestResult.returnError(checkMetaAtomTaskResult.getMessage());
+        }
+        metaTaskToUserNew.setMetaAtomTask(metaAtomTask);
+        MetaServiceResult buildMetaPropResult = buildMetaProp(metaTaskToUserNew);
+        if (!buildMetaPropResult.isSuccess()) {
+            return MetaRestResult.returnError(buildMetaPropResult.getMessage());
+        }
+        // 判断当前玩家是否领取过基础任务
+        MetaTaskToUserNew dbMetaTaskToUserNew = metaTaskToUserNewRepo.findByUserIdAndTaskIdAndAtomTaskIdAndDel(metaTaskToUserNew.getUserId(), metaTaskToUserNew.getTaskId(), metaTaskToUserNew.getAtomTaskId(), false);
+        if (Objects.nonNull(dbMetaTaskToUserNew)) {
+            return MetaRestResult.returnError(String.format("当前用户已在[%S]领取过该任务", dbMetaTaskToUserNew.getGetTime()));
+        }
+        metaTaskToUserNew.setGetTime(LocalDateTime.now());
+        metaTaskToUserNew.setStatus(MetaTaskStatus.PROGRESS);
+        metaTaskToUserNew.setChannelId(metaTaskNew.getChannelId());
+        if (MetaAwardTypeEnum.META_PROP.equals(metaAtomTask.getAwardType())) {
+            MetaProp metaProp = metaPropRepo.findByIdAndDel(Long.parseLong(metaAtomTask.getAwardConfig()), false);
+            if (Objects.isNull(metaProp)) {
+                return MetaRestResult.returnError(String.format("基础任务[%S]奖励配置的道具不存在", metaTaskToUserNew.getAtomTaskId()));
+            }
+            metaTaskToUserNew.setMetaProp(metaProp);
+        }
+        metaTaskToUserNew.setMetaTaskNew(metaTaskNew);
+        metaTaskToUserNew.setMetaAtomTask(metaAtomTask);
+        MetaTaskToUserNew save = metaTaskToUserNewRepo.save(metaTaskToUserNew);
+        save.setMetaTaskNew(metaTaskToUserNew.getMetaTaskNew());
+        save.setMetaAtomTask(metaTaskToUserNew.getMetaAtomTask());
+        save.setMetaProp(metaTaskToUserNew.getMetaProp());
+        if (progress) {
+            setProgress(save);
+        }
+        return MetaRestResult.returnSuccess(save);
+    }
+
+    public MetaRestResult<List<MetaTaskToUserNew>> findByStatus(Long userId, Long channelId, MetaTaskStatus status) {
+        List<MetaTaskToUserNew> metaTaskToUsers = metaTaskToUserNewRepo.findAllByUserIdAndChannelIdAndStatusAndDel(userId, channelId, status, false);
+        metaTaskToUsers.forEach(this::setSingleProgress);
+        return MetaRestResult.returnSuccess(metaTaskToUsers);
+    }
+
+    public MetaRestResult<MetaTaskToUserNew> setSingleProgress(MetaTaskToUserNew metaTaskToUserNew) {
+        MetaAtomTask metaAtomTask = metaAtomTaskRepo.findByIdAndDel(metaTaskToUserNew.getAtomTaskId(), false);
+        MetaServiceResult checkMetaAtomTaskResult = checkMetaAtomTask(metaAtomTask);
+        if (!checkMetaAtomTaskResult.isSuccess()) {
+            return MetaRestResult.returnError(checkMetaAtomTaskResult.getMessage());
+        }
+        metaTaskToUserNew.setMetaAtomTask(metaAtomTask);
+        MetaTaskNew metaTaskNew = metaTaskNewRepo.findByIdAndDel(metaTaskToUserNew.getTaskId(), false);
+        MetaServiceResult checkMetaTaskNewResult = checkMetaTaskNew(metaTaskNew);
+        if (!checkMetaTaskNewResult.isSuccess()) {
+            return MetaRestResult.returnError(checkMetaTaskNewResult.getMessage());
+        }
+        metaTaskToUserNew.setMetaTaskNew(metaTaskNew);
+        MetaServiceResult buildMetaPropResult = buildMetaProp(metaTaskToUserNew);
+        if (!buildMetaPropResult.isSuccess()) {
+            return MetaRestResult.returnError(buildMetaPropResult.getMessage());
+        }
+        setProgress(metaTaskToUserNew);
+        return MetaRestResult.returnSuccess(metaTaskToUserNew);
+    }
+
+    /**
+     * 设置任务进度
+     *
+     * @param metaTaskToUserNew 任务领取信息
+     */
+    private void setProgress(MetaTaskToUserNew metaTaskToUserNew) {
+        MetaAtomTask metaAtomTask = metaTaskToUserNew.getMetaAtomTask();
+        List<Long> atomTaskIds = metaTaskBindRepo.findAtomTaskIds(metaTaskToUserNew.getTaskId());
+        List<MetaTaskToUserNew> completed = metaTaskToUserNewRepo.findAllByUserIdAndStatusAndDelAndAtomTaskIdIn(metaTaskToUserNew.getUserId(), MetaTaskStatus.COMPLETION, false, atomTaskIds);
+        metaTaskToUserNew.setProcess(String.valueOf(completed.size()).concat("/").concat(String.valueOf(atomTaskIds.size())));
+        String value = metaAtomTask.getTargetConfig();
+        switch (metaAtomTask.getTargetType()) {
+            case COLLECT_COLLECTION:
+                if (StringUtils.isBlank(value)) {
+                    String errMsg = "任务进度显示异常,缺少藏品id配置";
+                    log.error(errMsg);
+                    metaTaskToUserNew.setAtomTaskProcess(errMsg);
+                    break;
+                }
+                String[] split = value.split(" ");
+                List<MetaUserTaskProgressNew> collectCollection = metaUserTaskProgressNewRepo.findAllByMetaTaskToUserNewIdAndDel(metaTaskToUserNew.getId(), false);
+                if (CollectionUtils.isEmpty(collectCollection)) {
+                    metaTaskToUserNew.setAtomTaskProcess(PREFIX.concat(String.valueOf(split.length)));
+                    break;
+                }
+                metaTaskToUserNew.setAtomTaskProcess(String.valueOf(collectCollection.size()).concat("/").concat(String.valueOf(split.length)));
+                break;
+            case ON_LINE_TIME_DAILY:
+                if (StringUtils.isBlank(value)) {
+                    String errMsg = "任务进度显示异常,缺少在线时长配置";
+                    log.error(errMsg);
+                    metaTaskToUserNew.setAtomTaskProcess(errMsg);
+                    break;
+                }
+                MetaUserTaskProgressNew onLineTimeDaily = metaUserTaskProgressNewRepo.findByMetaTaskToUserNewIdAndDelAndCreatedAtAfter(metaTaskToUserNew.getId(), false, LocalDateTime.now().withHour(0).withMinute(0).withSecond(0));
+                if (Objects.isNull(onLineTimeDaily)) {
+                    metaTaskToUserNew.setAtomTaskProcess("0");
+                    break;
+                }
+                metaTaskToUserNew.setAtomTaskProcess(onLineTimeDaily.getRemark().concat("/").concat(value));
+                break;
+            case ACCUMULATE:
+                if (StringUtils.isBlank(value)) {
+                    String errMsg = "任务进度显示异常,缺少累计任务的数量配置";
+                    log.error(errMsg);
+                    metaTaskToUserNew.setAtomTaskProcess(errMsg);
+                    break;
+                }
+                List<MetaUserTaskProgressNew> accumulate = metaUserTaskProgressNewRepo.findAllByMetaTaskToUserNewIdAndDel(metaTaskToUserNew.getId(), false);
+                if (CollectionUtils.isEmpty(accumulate)) {
+                    metaTaskToUserNew.setAtomTaskProcess(PREFIX.concat(value));
+                    break;
+                }
+                metaTaskToUserNew.setAtomTaskProcess(String.valueOf(accumulate.size()).concat("/").concat(value));
+                break;
+            default:
+                String errMsg = "不存在的任务类型";
+                log.error(errMsg);
+                metaTaskToUserNew.setAtomTaskProcess(errMsg);
+                break;
+        }
+    }
+
+    /**
+     * 校验基础任务
+     *
+     * @param metaAtomTask 基础任务
+     * @return result
+     */
+    private MetaServiceResult checkMetaAtomTask(MetaAtomTask metaAtomTask) {
+        if (Objects.isNull(metaAtomTask)) {
+            return MetaServiceResult.returnError("基础任务不存在");
+        }
+        if (StringUtils.isBlank(metaAtomTask.getName())) {
+            return MetaServiceResult.returnError(String.format("基础任务[%S]缺少任务名称", metaAtomTask.getId()));
+        }
+        if (Objects.isNull(metaAtomTask.getDetail())) {
+            return MetaServiceResult.returnError(String.format("基础任务[%S]缺少任务详情", metaAtomTask.getId()));
+        }
+        if (Objects.isNull(metaAtomTask.getTargetType())) {
+            return MetaServiceResult.returnError(String.format("基础任务[%S]缺少目标", metaAtomTask.getId()));
+        }
+        if (StringUtils.isBlank(metaAtomTask.getTargetConfig())) {
+            return MetaServiceResult.returnError(String.format("基础任务[%S]缺少目标配置", metaAtomTask.getId()));
+        }
+        if (Objects.isNull(metaAtomTask.getAwardType())) {
+            return MetaServiceResult.returnError(String.format("基础任务[%S]缺少奖励类型", metaAtomTask.getId()));
+        }
+        if (StringUtils.isBlank(metaAtomTask.getAwardConfig())) {
+            return MetaServiceResult.returnError(String.format("基础任务[%S]缺少奖励配置", metaAtomTask.getId()));
+        }
+        return MetaServiceResult.returnSuccess();
+    }
+
+    /**
+     * 校验任务
+     *
+     * @param metaTaskNew 任务信息
+     * @return result
+     */
+    private MetaServiceResult checkMetaTaskNew(MetaTaskNew metaTaskNew) {
+        if (Objects.isNull(metaTaskNew)) {
+            return MetaServiceResult.returnError("任务不存在");
+        }
+        if (!metaTaskNew.isPublish()) {
+            return MetaServiceResult.returnError("status error : task has not been published");
+        }
+        if (StringUtils.isBlank(metaTaskNew.getName())) {
+            return MetaServiceResult.returnError(String.format("任务[%S]缺少任务名称", metaTaskNew.getId()));
+        }
+        if (Objects.isNull(metaTaskNew.getDetail())) {
+            return MetaServiceResult.returnError(String.format("任务[%S]缺少任务详情", metaTaskNew.getId()));
+        }
+        if (Objects.isNull(metaTaskNew.getType())) {
+            return MetaServiceResult.returnError(String.format("任务[%S]缺少任务类型", metaTaskNew.getId()));
+        }
+        return MetaServiceResult.returnSuccess();
+    }
+
+    /**
+     * 道具奖励 构建道具信息
+     *
+     * @param metaTaskToUserNew 任务领取信息
+     * @return result
+     */
+    private MetaServiceResult buildMetaProp(MetaTaskToUserNew metaTaskToUserNew) {
+        if (!MetaAwardTypeEnum.META_PROP.equals(metaTaskToUserNew.getMetaAtomTask().getAwardType())) {
+            return MetaServiceResult.returnSuccess();
+        }
+        MetaProp metaProp = metaPropRepo.findByIdAndDel(Long.parseLong(metaTaskToUserNew.getMetaAtomTask().getAwardConfig()), false);
+        if (Objects.isNull(metaProp)) {
+            return MetaServiceResult.returnError(String.format("基础任务[%S]道具奖励 道具信息为空", metaTaskToUserNew.getMetaAtomTask().getId()));
+        }
+        metaTaskToUserNew.setMetaProp(metaProp);
+        return MetaServiceResult.returnSuccess();
+    }
+}

+ 16 - 0
src/main/java/com/izouma/nineth/service/MetaTaskToUserService.java

@@ -1,12 +1,14 @@
 package com.izouma.nineth.service;
 
 import com.alibaba.excel.util.CollectionUtils;
+import com.izouma.nineth.domain.MetaProp;
 import com.izouma.nineth.domain.MetaTask;
 import com.izouma.nineth.domain.MetaTaskToUser;
 import com.izouma.nineth.domain.MetaUserTaskProgress;
 import com.izouma.nineth.dto.MetaRestResult;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.enums.MetaTaskStatus;
+import com.izouma.nineth.repo.MetaPropRepo;
 import com.izouma.nineth.repo.MetaTaskRepo;
 import com.izouma.nineth.repo.MetaTaskToUserRepo;
 import com.izouma.nineth.repo.MetaUserTaskProgressRepo;
@@ -36,6 +38,8 @@ public class MetaTaskToUserService {
 
     private final String PREFIX = "0/";
 
+    private MetaPropRepo metaPropRepo;
+
     public Page<MetaTaskToUser> all(PageQuery pageQuery) {
         return metaTaskToUserRepo.findAll(JpaUtils.toSpecification(pageQuery, MetaTaskToUser.class), JpaUtils.toPageRequest(pageQuery));
     }
@@ -80,6 +84,12 @@ public class MetaTaskToUserService {
         if (Objects.nonNull(metaTask.getAwardPic())) {
             metaTaskToUser.setAwardPic(metaTask.getAwardPic());
         }
+        if (metaTask.getGoldNum() > 0) {
+            metaTaskToUser.setGoldNum(metaTask.getGoldNum());
+        }
+        if (Objects.nonNull(metaTask.getMetaPropId())) {
+            metaTaskToUser.setMetaPropId(metaTask.getMetaPropId());
+        }
         metaTaskToUser.setTaskName(metaTask.getName());
         metaTaskToUser.setTaskType(metaTask.getType());
         metaTaskToUser.setDetail(metaTask.getDetail());
@@ -115,6 +125,12 @@ public class MetaTaskToUserService {
      * @param metaTaskToUser 参数
      */
     private void setProgress(MetaTaskToUser metaTaskToUser) {
+        if (Objects.nonNull(metaTaskToUser.getMetaPropId())) {
+            MetaProp metaProp = metaPropRepo.findByIdAndDel(metaTaskToUser.getMetaPropId(), false);
+            if (Objects.nonNull(metaProp)) {
+                metaTaskToUser.setMetaProp(metaProp);
+            }
+        }
         MetaTask metaTask = metaTaskRepo.findByIdAndDel(metaTaskToUser.getTaskId(), false);
         if (Objects.isNull(metaTask)) {
             log.error("任务信息为空");

+ 20 - 0
src/main/java/com/izouma/nineth/service/MetaTopService.java

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

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

@@ -2,6 +2,8 @@ package com.izouma.nineth.service;
 
 import com.izouma.nineth.domain.MetaUserGoldRecord;
 import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.dto.PageWrapper;
+import com.izouma.nineth.dto.UserHoldDTO;
 import com.izouma.nineth.repo.MetaUserGoldRecordRepo;
 import com.izouma.nineth.utils.JpaUtils;
 import lombok.AllArgsConstructor;

+ 40 - 19
src/main/java/com/izouma/nineth/service/MetaUserGoldService.java

@@ -1,5 +1,6 @@
 package com.izouma.nineth.service;
 
+import com.izouma.nineth.annotations.RedisLock;
 import com.izouma.nineth.domain.MetaUserGold;
 import com.izouma.nineth.domain.MetaUserGoldRecord;
 import com.izouma.nineth.dto.MetaRestResult;
@@ -17,6 +18,7 @@ import org.springframework.stereotype.Service;
 
 import javax.transaction.Transactional;
 import java.util.*;
+import java.util.stream.Collectors;
 
 @Service
 @AllArgsConstructor
@@ -35,13 +37,13 @@ public class MetaUserGoldService {
 
     @Transactional
     public void initMetaUserGold(String userIds) {
-        String[] split = userIds.split(" ");
-        List<MetaUserGold> metaUserGolds = new ArrayList<>();
-        List<MetaUserGoldRecord> metaUserGoldRecords = new ArrayList<>();
-        Arrays.stream(split).forEach(userId -> {
-            metaUserGolds.add(new MetaUserGold(Long.parseLong(userId), 0));
-            metaUserGoldRecords.add(new MetaUserGoldRecord(Long.parseLong(userId), 0, 0, 0, "初始化"));
-        });
+        List<MetaUserGold> metaUserGolds = Arrays.stream(userIds.split(" "))
+                                                 .map(Long::parseLong)
+                                                 .map(userId -> new MetaUserGold(userId, 0))
+                                                 .collect(Collectors.toList());
+        List<MetaUserGoldRecord> metaUserGoldRecords = metaUserGolds.stream()
+                                                                    .map(metaUserGold -> new MetaUserGoldRecord(metaUserGold.getUserId(), 0, 0, 0, "初始化"))
+                                                                    .collect(Collectors.toList());
         metaUserGoldRepo.saveAll(metaUserGolds);
         metaUserGoldRecordRepo.saveAll(metaUserGoldRecords);
     }
@@ -66,27 +68,46 @@ public class MetaUserGoldService {
         }
     }
 
+    /**
+     * 操作金币
+     *
+     * @param userId 玩家id
+     * @param num    操作数量(负数代表扣减)
+     * @param remark 备注信息
+     * @return result
+     */
     @Transactional
+    @RedisLock("'userGoldLock::'+#userId")
     public MetaRestResult<MetaUserGold> changeNum(Long userId, int num, String remark) {
-        MetaUserGold metaUserGold = metaUserGoldRepo.findByUserIdAndDel(userId, false);
-        if (Objects.isNull(metaUserGold)) {
-            log.info(String.format("不存在用户[%S]记录。默认初始化", userId));
-            initMetaUserGold(String.valueOf(userId));
-            metaUserGold = metaUserGoldRepo.findByUserIdAndDel(userId, false);
+        Objects.requireNonNull(userId, "用户ID不能为空");
+        Objects.requireNonNull(remark, "备注不能为空");
+        MetaUserGold metaUserGold = metaUserGoldRepo.findByUserIdAndDel(userId, false)
+                                                    .orElseGet(() -> {
+                                                        log.info(String.format("不存在用户[%S]记录。默认初始化", userId));
+                                                        initMetaUserGold(String.valueOf(userId));
+                                                        return metaUserGoldRepo.findByUserIdAndDel(userId, false).orElse(null);
+                                                    });
+        if (metaUserGold == null) {
+            throw new RuntimeException(String.format("无法初始化用户[%S]记录", userId));
         }
-        // 操作前金币数量
         int nowNum = metaUserGold.getNum();
+        int afterNum;
+        try {
+            afterNum = Math.addExact(nowNum, num);
+        } catch (Exception e) {
+            throw new RuntimeException(String.format("金额操作发生异常[%S]", e.getMessage()));
+        }
+        if (afterNum < 0) {
+            throw new RuntimeException(String.format("用户[%S] 当前金币剩余[%S],无法进行数量为[%S]的操作", userId, nowNum, -num));
+        }
         MetaUserGoldRecord metaUserGoldRecord = new MetaUserGoldRecord();
         metaUserGoldRecord.setUserId(userId);
         metaUserGoldRecord.setBeforeNum(nowNum);
-        metaUserGoldRecord.setAfterNum(nowNum + num);
+        metaUserGoldRecord.setAfterNum(afterNum);
         metaUserGoldRecord.setOperationNum(num);
         metaUserGoldRecord.setRemark(remark);
-        if (metaUserGoldRecord.getAfterNum() < 0) {
-            return MetaRestResult.returnError(String.format("用户[%S] 当前金币剩余[%S] 本次操作需要金币数量为[%S]", userId, nowNum, -num));
-        }
-        metaUserGold.setNum(nowNum + num);
         metaUserGoldRecordRepo.save(metaUserGoldRecord);
-        return MetaRestResult.returnSuccess(metaUserGoldRepo.save(metaUserGold));
+        metaUserGoldRepo.updateNumByUserId(userId, afterNum);
+        return MetaRestResult.returnSuccess(metaUserGold);
     }
 }

+ 74 - 0
src/main/java/com/izouma/nineth/service/MetaUserTaskAwardReceivedRecordNewService.java

@@ -0,0 +1,74 @@
+package com.izouma.nineth.service;
+
+import com.izouma.nineth.domain.MetaAtomTask;
+import com.izouma.nineth.domain.MetaTaskToUserNew;
+import com.izouma.nineth.domain.MetaUserTaskAwardReceivedRecordNew;
+import com.izouma.nineth.dto.MetaAwardReceiveDTO;
+import com.izouma.nineth.dto.MetaRestResult;
+import com.izouma.nineth.dto.MetaServiceResult;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.enums.MetaTaskStatus;
+import com.izouma.nineth.enums.MetaTaskTarget;
+import com.izouma.nineth.repo.MetaAtomTaskRepo;
+import com.izouma.nineth.repo.MetaTaskToUserNewRepo;
+import com.izouma.nineth.repo.MetaUserTaskAwardReceivedRecordNewRepo;
+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 javax.transaction.Transactional;
+import java.time.LocalDateTime;
+import java.util.Objects;
+
+@Service
+@AllArgsConstructor
+public class MetaUserTaskAwardReceivedRecordNewService {
+
+    private MetaUserTaskAwardReceivedRecordNewRepo metaUserTaskAwardReceivedRecordNewRepo;
+
+    private MetaTaskToUserNewRepo metaTaskToUserNewRepo;
+
+    private MetaAtomTaskRepo metaAtomTaskRepo;
+
+    private MetaAwardReceiveService metaAwardReceiveService;
+
+    public Page<MetaUserTaskAwardReceivedRecordNew> all(PageQuery pageQuery) {
+        return metaUserTaskAwardReceivedRecordNewRepo.findAll(JpaUtils.toSpecification(pageQuery, MetaUserTaskAwardReceivedRecordNew.class), JpaUtils.toPageRequest(pageQuery));
+    }
+
+    @Transactional
+    public MetaRestResult<Void> receiveAward(Long taskId, Long atomTaskId) {
+        Long userId = SecurityUtils.getAuthenticatedUser().getId();
+        MetaAtomTask metaAtomTask = metaAtomTaskRepo.findByIdAndDel(atomTaskId, false);
+        if (Objects.isNull(metaAtomTask)) {
+            return MetaRestResult.returnError("奖励领取失败:基础任务不存在!");
+        }
+        MetaTaskToUserNew metaTaskToUserNew = metaTaskToUserNewRepo.findByUserIdAndTaskIdAndAtomTaskIdAndDel(userId, taskId, atomTaskId, false);
+        if (Objects.isNull(metaTaskToUserNew)) {
+            return MetaRestResult.returnError("奖励领取失败:用户未领取过该任务!");
+        }
+        if (MetaTaskStatus.PROGRESS.equals(metaTaskToUserNew.getStatus()) || MetaTaskStatus.FINISH.equals(metaTaskToUserNew.getStatus())) {
+            return MetaRestResult.returnError(String.format("奖励领取失败:当前任务状态为[%S]", metaTaskToUserNew.getStatus().getDescription()));
+        }
+        if (MetaTaskTarget.ON_LINE_TIME_DAILY.equals(metaAtomTask.getTargetType())) {
+            MetaUserTaskAwardReceivedRecordNew metaUserTaskAwardReceivedRecordNew = metaUserTaskAwardReceivedRecordNewRepo.findByUserIdAndTaskIdAndAtomTaskIdAndDelAndReceivedTimeAfter(userId, taskId, atomTaskId, false, LocalDateTime.now().withHour(0).withMinute(0).withSecond(0));
+            if (Objects.nonNull(metaUserTaskAwardReceivedRecordNew)) {
+                return MetaRestResult.returnError("奖励领取失败:用户今天已经领取过该任务奖励,不可重复领取!");
+            }
+        }
+        if (!MetaTaskTarget.ON_LINE_TIME_DAILY.equals(metaAtomTask.getTargetType())) {
+            MetaUserTaskAwardReceivedRecordNew metaUserTaskAwardReceivedRecordNew = metaUserTaskAwardReceivedRecordNewRepo.findByUserIdAndTaskIdAndAtomTaskIdAndDel(userId, taskId, atomTaskId, false);
+            if (Objects.nonNull(metaUserTaskAwardReceivedRecordNew)) {
+                return MetaRestResult.returnError("奖励领取失败:用户已经领取过该任务奖励,不可重复领取!");
+            }
+        }
+        MetaServiceResult receive = metaAwardReceiveService.receive(new MetaAwardReceiveDTO(metaAtomTask.getAwardType(), metaAtomTask.getAwardConfig(), userId, "基础任务" + atomTaskId));
+        if (!receive.isSuccess()) {
+            return MetaRestResult.returnError(receive.getMessage());
+        }
+        metaUserTaskAwardReceivedRecordNewRepo.save(new MetaUserTaskAwardReceivedRecordNew(userId, taskId, atomTaskId, LocalDateTime.now()));
+        return MetaRestResult.returnSuccess(receive.getMessage());
+    }
+}

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

@@ -7,7 +7,7 @@ import com.izouma.nineth.dto.MetaAwardReceiveDTO;
 import com.izouma.nineth.dto.MetaRestResult;
 import com.izouma.nineth.dto.MetaServiceResult;
 import com.izouma.nineth.enums.MetaTaskStatus;
-import com.izouma.nineth.enums.MetaTaskType;
+import com.izouma.nineth.enums.MetaTaskTarget;
 import com.izouma.nineth.repo.MetaTaskRepo;
 import com.izouma.nineth.repo.MetaTaskToUserRepo;
 import com.izouma.nineth.repo.MetaUserTaskAwardReceivedRecordRepo;
@@ -45,13 +45,13 @@ public class MetaUserTaskAwardReceivedRecordService {
         if (MetaTaskStatus.PROGRESS.equals(metaTaskToUser.getStatus()) || MetaTaskStatus.FINISH.equals(metaTaskToUser.getStatus())) {
             return MetaRestResult.returnError(String.format("奖励领取失败:当前任务状态为[%S]", metaTaskToUser.getStatus().getDescription()));
         }
-        if (MetaTaskType.ON_LINE_TIME_DAILY.equals(metaTask.getType())) {
+        if (MetaTaskTarget.ON_LINE_TIME_DAILY.equals(metaTask.getType())) {
             MetaUserTaskAwardReceivedRecord metaUserTaskAwardReceivedRecord = metaUserTaskAwardReceivedRecordRepo.findByUserIdAndMetaTaskIdAndDelAndCreatedAtAfter(userId, metaTaskId, false, LocalDateTime.now().withHour(0).withMinute(0).withSecond(0));
             if (Objects.nonNull(metaUserTaskAwardReceivedRecord)) {
                 return MetaRestResult.returnError("奖励领取失败:用户今天已经领取过该任务奖励,不可重复领取!");
             }
         }
-        if (!MetaTaskType.ON_LINE_TIME_DAILY.equals(metaTask.getType())) {
+        if (!MetaTaskTarget.ON_LINE_TIME_DAILY.equals(metaTask.getType())) {
             MetaUserTaskAwardReceivedRecord metaUserTaskAwardReceivedRecord = metaUserTaskAwardReceivedRecordRepo.findByUserIdAndMetaTaskIdAndDel(userId, metaTaskId, false);
             if (Objects.nonNull(metaUserTaskAwardReceivedRecord)) {
                 return MetaRestResult.returnError("奖励领取失败:用户已经领取过该任务奖励,不可重复领取!");

+ 183 - 0
src/main/java/com/izouma/nineth/service/MetaUserTaskProgressNewService.java

@@ -0,0 +1,183 @@
+package com.izouma.nineth.service;
+
+import com.izouma.nineth.domain.*;
+import com.izouma.nineth.dto.MetaRestResult;
+import com.izouma.nineth.dto.MetaServiceResult;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.enums.MetaTaskStatus;
+import com.izouma.nineth.enums.MetaTaskTarget;
+import com.izouma.nineth.enums.MetaTaskType;
+import com.izouma.nineth.exception.BusinessException;
+import com.izouma.nineth.repo.*;
+import com.izouma.nineth.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+import javax.transaction.Transactional;
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@Service
+@AllArgsConstructor
+public class MetaUserTaskProgressNewService {
+
+    private MetaUserTaskProgressNewRepo metaUserTaskProgressNewRepo;
+
+    private MetaTaskToUserNewRepo metaTaskToUserNewRepo;
+
+    private MetaAtomTaskRepo metaAtomTaskRepo;
+
+    private MetaTaskToUserNewService metaTaskToUserNewService;
+
+    private MetaTaskBindRepo metaTaskBindRepo;
+
+    public Page<MetaUserTaskProgressNew> all(PageQuery pageQuery) {
+        return metaUserTaskProgressNewRepo.findAll(JpaUtils.toSpecification(pageQuery, MetaUserTaskProgressNew.class), JpaUtils.toPageRequest(pageQuery));
+    }
+
+    @Transactional
+    public MetaRestResult<Boolean> metaSave(MetaUserTaskProgressNew metaUserTaskProgressNew) {
+        // 校验参数
+        MetaServiceResult result = checkParams(metaUserTaskProgressNew);
+        if (!result.isSuccess()) {
+            return MetaRestResult.returnError(result.getMessage());
+        }
+        // 任务领取记录
+        MetaTaskToUserNew metaTaskToUserNew = metaTaskToUserNewRepo.findByIdAndDel(metaUserTaskProgressNew.getMetaTaskToUserNewId(), false);
+        if (Objects.isNull(metaTaskToUserNew)) {
+            return MetaRestResult.returnError("无用户领取任务记录");
+        }
+        if (!metaTaskToUserNew.getStatus().equals(MetaTaskStatus.PROGRESS)) {
+            return MetaRestResult.returnError(String.format("状态错误:当前任务状态为[%S]", metaTaskToUserNew.getStatus().getDescription()));
+        }
+        // 基础任务
+        MetaAtomTask metaAtomTask = metaAtomTaskRepo.findByIdAndDel(metaTaskToUserNew.getAtomTaskId(), false);
+        if (Objects.isNull(metaAtomTask)) {
+            return MetaRestResult.returnError("基础任务信息为空");
+        }
+        // 收集藏品类型任务 remark为藏品id 不可为空
+        if (metaAtomTask.getTargetType().equals(MetaTaskTarget.COLLECT_COLLECTION)) {
+            if (StringUtils.isBlank(metaUserTaskProgressNew.getRemark())) {
+                return MetaRestResult.returnError(String.format("类型[%S]的任务 remark不可为空", metaAtomTask.getTargetType().getDescription()));
+            }
+        }
+        String value = metaAtomTask.getTargetConfig();
+        // 收集藏品任务
+        if (metaAtomTask.getTargetType().equals(MetaTaskTarget.COLLECT_COLLECTION)) {
+            if (StringUtils.isBlank(value)) {
+                return MetaRestResult.returnError("该任务未配置藏品id");
+            }
+            String[] split = value.split(" ");
+            List<String> all = Arrays.asList(split);
+            if (!all.contains(metaUserTaskProgressNew.getRemark())) {
+                return MetaRestResult.returnError("不在任务规定藏品内");
+            }
+        }
+        // 累计任务
+        if (metaAtomTask.getTargetType().equals(MetaTaskTarget.ACCUMULATE)) {
+            if (StringUtils.isBlank(value)) {
+                return MetaRestResult.returnError("该任务未配置达标次数");
+            }
+        }
+        metaUserTaskProgressNew.setProgressTime(LocalDateTime.now());
+        // 在线时长任务 如记录存在则更新remark(每日在线时长) 如不存在则每日首次触发该任务
+        if (metaAtomTask.getTargetType().equals(MetaTaskTarget.ON_LINE_TIME_DAILY)) {
+            MetaUserTaskProgressNew dbMetaUserTaskProgressNew = metaUserTaskProgressNewRepo.findByMetaTaskToUserNewIdAndDelAndCreatedAtAfter(metaUserTaskProgressNew.getMetaTaskToUserNewId(), false, LocalDateTime.now().withHour(0).withMinute(0).withSecond(0));
+            if (Objects.isNull(dbMetaUserTaskProgressNew)) {
+                metaUserTaskProgressNewRepo.save(metaUserTaskProgressNew);
+                // 该类型任务不存在完成
+                return MetaRestResult.returnSuccess(false);
+            }
+            int remark = Integer.parseInt(metaUserTaskProgressNew.getRemark()) + Integer.parseInt(dbMetaUserTaskProgressNew.getRemark());
+            dbMetaUserTaskProgressNew.setRemark(String.valueOf(remark));
+            dbMetaUserTaskProgressNew.setProgressTime(LocalDateTime.now());
+            metaUserTaskProgressNewRepo.save(dbMetaUserTaskProgressNew);
+            return MetaRestResult.returnSuccess(false);
+        }
+        // 保存进度
+        metaUserTaskProgressNewRepo.save(metaUserTaskProgressNew);
+        List<MetaUserTaskProgressNew> metaUserTaskProgressNews = metaUserTaskProgressNewRepo.findAllByMetaTaskToUserNewIdAndDel(metaUserTaskProgressNew.getMetaTaskToUserNewId(), false);
+        // 是否完成任务
+        switch (metaAtomTask.getTargetType()) {
+            case COLLECT_COLLECTION:
+                String[] split = value.split(" ");
+                List<String> all = Arrays.asList(split);
+                List<String> completed = metaUserTaskProgressNews.stream().map(MetaUserTaskProgressNew::getRemark).collect(Collectors.toList());
+                if (new HashSet<>(completed).containsAll(all)) {
+                    completeTask(metaTaskToUserNew);
+                    return MetaRestResult.returnSuccess(true);
+                }
+                return MetaRestResult.returnSuccess(false);
+            case ACCUMULATE:
+                if (metaUserTaskProgressNews.size() >= Integer.parseInt(value)) {
+                    completeTask(metaTaskToUserNew);
+                    return MetaRestResult.returnSuccess(true);
+                }
+                return MetaRestResult.returnSuccess(false);
+            default:
+                throw new BusinessException(String.format("不存在的任务类型[%S]", metaAtomTask.getTargetType()));
+        }
+    }
+
+
+    /**
+     * 完成任务
+     *
+     * @param metaTaskToUserNew 任务领取记录
+     */
+    private void completeTask(MetaTaskToUserNew metaTaskToUserNew) {
+        metaTaskToUserNew.setFinishTime(LocalDateTime.now());
+        metaTaskToUserNew.setStatus(MetaTaskStatus.COMPLETION);
+        metaTaskToUserNewRepo.save(metaTaskToUserNew);
+        MetaTaskBind metaTaskBind = metaTaskBindRepo.findByTaskIdAndAtomTaskIdAndDel(metaTaskToUserNew.getTaskId(), metaTaskToUserNew.getAtomTaskId(), false);
+        // 节点任务完成自动领取下一个节点任务
+        if (MetaTaskType.NODE.equals(metaTaskBind.getType())) {
+            // 下一个节点任务id
+            Long nextAtomTaskId = metaTaskBindRepo.findNextAtomTaskId(metaTaskToUserNew.getTaskId(), metaTaskBind.getAtomTaskIndex());
+            if (Objects.isNull(nextAtomTaskId)) {
+                return;
+            }
+            MetaTaskToUserNew next = new MetaTaskToUserNew();
+            next.setTaskId(metaTaskToUserNew.getTaskId());
+            next.setAtomTaskId(nextAtomTaskId);
+            next.setUserId(metaTaskToUserNew.getUserId());
+            metaTaskToUserNewService.receiveTask(next, true);
+        }
+
+    }
+
+    /**
+     * 参数校验
+     *
+     * @param metaUserTaskProgressNew 待校验参数
+     * @return 校验结果
+     */
+    private MetaServiceResult checkParams(MetaUserTaskProgressNew metaUserTaskProgressNew) {
+        if (Objects.nonNull(metaUserTaskProgressNew.getId())) {
+            return MetaServiceResult.returnError("Illegal parameter : id must be null");
+        }
+        if (Objects.isNull(metaUserTaskProgressNew.getMetaTaskToUserNewId())) {
+            return MetaServiceResult.returnError("Illegal parameter : metaTaskToUserNewId can not be null");
+        }
+        if (Objects.isNull(metaUserTaskProgressNew.getUserId())) {
+            return MetaServiceResult.returnError("Illegal parameter : userId can not be null");
+        }
+        // 指定备注唯一,校验是否重复
+        if (metaUserTaskProgressNew.isRemarkOnly()) {
+            if (StringUtils.isBlank(metaUserTaskProgressNew.getRemark())) {
+                return MetaServiceResult.returnError("Illegal parameter : remark can not be null");
+            }
+            MetaUserTaskProgressNew dbMetaUserTaskProgressNew = metaUserTaskProgressNewRepo.findByMetaTaskToUserNewIdAndRemarkAndDel(metaUserTaskProgressNew.getMetaTaskToUserNewId(), metaUserTaskProgressNew.getRemark(), false);
+            if (Objects.nonNull(dbMetaUserTaskProgressNew)) {
+                return MetaServiceResult.returnError("重复触发");
+            }
+        }
+        return MetaServiceResult.returnSuccess();
+    }
+}

+ 5 - 5
src/main/java/com/izouma/nineth/service/MetaUserTaskProgressService.java

@@ -6,7 +6,7 @@ import com.izouma.nineth.domain.MetaUserTaskProgress;
 import com.izouma.nineth.dto.MetaRestResult;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.enums.MetaTaskStatus;
-import com.izouma.nineth.enums.MetaTaskType;
+import com.izouma.nineth.enums.MetaTaskTarget;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.MetaTaskRepo;
 import com.izouma.nineth.repo.MetaTaskToUserRepo;
@@ -69,7 +69,7 @@ public class MetaUserTaskProgressService {
             return MetaRestResult.returnError(String.format("状态错误:当前任务状态为[%S]", metaTaskToUser.getStatus().getDescription()));
         }
         // 收集藏品类型任务 remark为藏品id 不可为空
-        if (metaTaskToUser.getTaskType().equals(MetaTaskType.COLLECT_COLLECTION)) {
+        if (metaTaskToUser.getTaskType().equals(MetaTaskTarget.COLLECT_COLLECTION)) {
             if (StringUtils.isBlank(metaUserTaskProgress.getRemark())) {
                 return MetaRestResult.returnError(String.format("类型[%S]的任务状态 remark不可为空", metaTaskToUser.getTaskType().getDescription()));
             }
@@ -77,7 +77,7 @@ public class MetaUserTaskProgressService {
         MetaTask metaTask = metaTaskRepo.findByIdAndDel(metaTaskToUser.getTaskId(), false);
         String value = metaTask.getValue();
         // 收集藏品任务
-        if (metaTaskToUser.getTaskType().equals(MetaTaskType.COLLECT_COLLECTION)) {
+        if (metaTaskToUser.getTaskType().equals(MetaTaskTarget.COLLECT_COLLECTION)) {
             if (StringUtils.isBlank(value)) {
                 return MetaRestResult.returnError("该任务未配置藏品id");
             }
@@ -88,7 +88,7 @@ public class MetaUserTaskProgressService {
             }
         }
         // 累计任务
-        if (metaTaskToUser.getTaskType().equals(MetaTaskType.ACCUMULATE)) {
+        if (metaTaskToUser.getTaskType().equals(MetaTaskTarget.ACCUMULATE)) {
             if (StringUtils.isBlank(value)) {
                 return MetaRestResult.returnError("该任务未配置达标次数");
             }
@@ -109,7 +109,7 @@ public class MetaUserTaskProgressService {
 //            }
 //        }
         // 在线时长任务 如记录存在则更新remark(每日在线时长) 如不存在则每日首次触发该任务
-        if (metaTaskToUser.getTaskType().equals(MetaTaskType.ON_LINE_TIME_DAILY)) {
+        if (metaTaskToUser.getTaskType().equals(MetaTaskTarget.ON_LINE_TIME_DAILY)) {
             MetaUserTaskProgress dbMetaUserTaskProgress = metaUserTaskProgressRepo.findByMetaTaskToUserIdAndDelAndCreatedAtAfter(metaTaskToUser.getId(), false, LocalDateTime.now().withHour(0).withMinute(0).withSecond(0));
             if (Objects.isNull(dbMetaUserTaskProgress)) {
                 save(metaUserTaskProgress, metaTaskToUser);

+ 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());
+    }
 }

+ 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) {

+ 3 - 0
src/main/java/com/izouma/nineth/service/UserHoldCountService.java

@@ -22,8 +22,11 @@ public class UserHoldCountService {
         if (Boolean.FALSE.equals(redisTemplate.hasKey(Constants.USER_HOLD_CACHE_KEY))) {
             throw new BusinessException("key失效,请刷新!如果已经刷新,请等待!");
         }
+        // 当前页
         int page = pageQuery.getPage();
+        // pageSize 每页查询多少条数据
         int size = pageQuery.getSize();
+        // limit 开始偏移量
         int start = page * size;
         List<UserHoldDTO> userHoldDTOS = (List<UserHoldDTO>) redisTemplate.opsForValue().get(Constants.USER_HOLD_CACHE_KEY);
         int totalElements;

+ 53 - 16
src/main/java/com/izouma/nineth/service/nftdomain/DomainAskService.java

@@ -1,20 +1,21 @@
 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.enums.AssetStatus;
-import com.izouma.nineth.enums.DomainAskStatus;
-import com.izouma.nineth.enums.PayMethod;
+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;
@@ -24,17 +25,19 @@ import org.springframework.stereotype.Service;
 import java.math.BigDecimal;
 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 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
@@ -56,6 +59,15 @@ public class DomainAskService {
         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
+                .countByDomainOrderIdAndUserIdAndStatusInAndDelFalse(domainOrderId, userId, domainAskStatuses) > 0) {
+            throw new BusinessException("已有报价,请勿重复报价!");
+        }
         DomainAsk domainAsk = DomainAsk.builder()
                                        .domainOrderId(domainOrderId)
                                        .assetId(asset.getId())
@@ -69,8 +81,10 @@ public class DomainAskService {
                                        .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);
     }
@@ -83,15 +97,9 @@ public class DomainAskService {
         domainAskRepo.save(domainAsk);
     }
 
-    public List<DomainAskGroup> getGroups() {
+    public List<Map<String, Object>> getGroups() {
         Long userId = SecurityUtils.getAuthenticatedUser().getId();
-        Set<DomainAskStatus> domainAskStatuses = new HashSet<>();
-        domainAskStatuses.add(DomainAskStatus.ASKING);
-        domainAskStatuses.add(DomainAskStatus.REFUNDED);
-        domainAskStatuses.add(DomainAskStatus.FAILURE);
-        domainAskStatuses.add(DomainAskStatus.SUCCESS);
-        domainAskStatuses.add(DomainAskStatus.FINISH);
-        return domainAskRepo.askGroup(domainAskStatuses, userId);
+        return domainAskRepo.askGroup(userId);
     }
 
     public void cancel(DomainAsk domainAsk) {
@@ -110,7 +118,36 @@ public class DomainAskService {
     }
 
     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
+                .countByDomainOrderIdAndOwnerIdAndStatusInAndDelFalse(domainAsk.getDomainOrderId(), domainAsk
+                        .getOwnerId(), domainAskStatuses) > 0) {
+            throw new BusinessException("已有通过报价,请勿重复通过!");
+        }
+        assetService.transfer(asset, domainAsk.getPrice(),
+                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);
     }
 
 

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

@@ -0,0 +1,43 @@
+package com.izouma.nineth.utils;
+
+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.MetaTaskTarget;
+
+public class MetaTaskTargetConverter implements Converter<MetaTaskTarget> {
+
+    @Override
+    public Class supportJavaTypeKey() {
+        return MetaTaskTarget.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return null;
+    }
+
+    @Override
+    public MetaTaskTarget convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        try {
+            for (MetaTaskTarget value : MetaTaskTarget.values()) {
+                if (value.getDescription().equals(cellData.getStringValue())) {
+                    return value;
+                }
+            }
+        } catch (Exception ignored) {
+        }
+        return null;
+    }
+
+    @Override
+    public CellData convertToExcelData(MetaTaskTarget value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        if (value != null) {
+            return new CellData(value.getDescription());
+        }
+        return null;
+    }
+}
+

+ 41 - 0
src/main/java/com/izouma/nineth/utils/excel/ChatTypeConverter.java

@@ -0,0 +1,41 @@
+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.ChatType;
+
+public class ChatTypeConverter implements Converter<ChatType> {
+    @Override
+    public Class supportJavaTypeKey() {
+        return ChatType.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return null;
+    }
+
+    @Override
+    public ChatType convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        try {
+            for (ChatType value : ChatType.values()) {
+                if (value.getDescription().equals(cellData.getStringValue())) {
+                    return value;
+                }
+            }
+        } catch (Exception ignored) {
+        }
+        return null;
+    }
+
+    @Override
+    public CellData convertToExcelData(ChatType value, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        if (value != null) {
+            return new CellData(value.getDescription());
+        }
+        return null;
+    }
+}

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

@@ -1,6 +1,7 @@
 package com.izouma.nineth.utils.excel;
 
 import com.alibaba.excel.EasyExcel;
+import com.izouma.nineth.utils.MetaTaskTargetConverter;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
@@ -23,6 +24,7 @@ public class ExcelUtils<T> {
                 .registerConverter(new OrderStatusConverter())
                 .registerConverter(new PayMethodConverter())
                 .registerConverter(new MetaTaskTypeConverter())
+                .registerConverter(new MetaTaskTypeConverter())
                 .registerConverter(new MetaTaskStatusConverter())
                 .registerConverter(new CoordinateDTOConverter())
                 .registerConverter(new EntryModelTypeConverter())
@@ -41,6 +43,15 @@ public class ExcelUtils<T> {
                 .registerConverter(new MoveTypeConverter())
                 .registerConverter(new MetaAwardTypeEnumConverter())
                 .registerConverter(new MetaPurchaseMethodEnumConverter())
+                .registerConverter(new MetaTaskTargetConverter())
+                .registerConverter(new MetaStoreCommodityTypeConverter())
+                .registerConverter(new MetaResourcesTypeConverter())
+                .registerConverter(new ChatTypeConverter())
+                .registerConverter(new MetaSwitchTypeConverter())
+                .registerConverter(new MetaPropTypeConverter())
+                .registerConverter(new MetaLuckyDrawAwardModelConverter())
+                .registerConverter(new MetaPropTriggerTypeConverter())
+                .registerConverter(new MetaPropUsedTypeConverter())
                 .doWrite(data);
     }
 }

+ 41 - 0
src/main/java/com/izouma/nineth/utils/excel/MetaLuckyDrawAwardModelConverter.java

@@ -0,0 +1,41 @@
+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.alibaba.fastjson.JSON;
+import com.izouma.nineth.domain.MetaGameAward;
+import com.izouma.nineth.domain.MetaLuckyDrawAwardModel;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Objects;
+
+public class MetaLuckyDrawAwardModelConverter implements Converter<MetaLuckyDrawAwardModel> {
+    @Override
+    public Class supportJavaTypeKey() {
+        return MetaLuckyDrawAwardModel.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return null;
+    }
+
+    @Override
+    public MetaLuckyDrawAwardModel convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        if (StringUtils.isEmpty(cellData.getStringValue())) {
+            return null;
+        }
+        return JSON.parseObject(cellData.getStringValue(), MetaLuckyDrawAwardModel.class);
+    }
+
+    @Override
+    public CellData convertToExcelData(MetaLuckyDrawAwardModel value, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        if (Objects.nonNull(value)) {
+            return new CellData(JSON.toJSONString(value));
+        }
+        return null;
+    }
+}

+ 42 - 0
src/main/java/com/izouma/nineth/utils/excel/MetaPropTriggerTypeConverter.java

@@ -0,0 +1,42 @@
+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.MetaPropTriggerType;
+import com.izouma.nineth.enums.MetaPropType;
+
+public class MetaPropTriggerTypeConverter implements Converter<MetaPropTriggerType> {
+    @Override
+    public Class supportJavaTypeKey() {
+        return MetaPropTriggerType.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return null;
+    }
+
+    @Override
+    public MetaPropTriggerType convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        try {
+            for (MetaPropTriggerType value : MetaPropTriggerType.values()) {
+                if (value.getDescription().equals(cellData.getStringValue())) {
+                    return value;
+                }
+            }
+        } catch (Exception ignored) {
+        }
+        return null;
+    }
+
+    @Override
+    public CellData convertToExcelData(MetaPropTriggerType value, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        if (value != null) {
+            return new CellData(value.getDescription());
+        }
+        return null;
+    }
+}

+ 41 - 0
src/main/java/com/izouma/nineth/utils/excel/MetaPropTypeConverter.java

@@ -0,0 +1,41 @@
+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.MetaPropType;
+
+public class MetaPropTypeConverter implements Converter<MetaPropType> {
+    @Override
+    public Class supportJavaTypeKey() {
+        return MetaPropType.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return null;
+    }
+
+    @Override
+    public MetaPropType convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        try {
+            for (MetaPropType value : MetaPropType.values()) {
+                if (value.getDescription().equals(cellData.getStringValue())) {
+                    return value;
+                }
+            }
+        } catch (Exception ignored) {
+        }
+        return null;
+    }
+
+    @Override
+    public CellData convertToExcelData(MetaPropType value, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        if (value != null) {
+            return new CellData(value.getDescription());
+        }
+        return null;
+    }
+}

+ 42 - 0
src/main/java/com/izouma/nineth/utils/excel/MetaPropUsedTypeConverter.java

@@ -0,0 +1,42 @@
+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.MetaPropType;
+import com.izouma.nineth.enums.MetaPropUsedType;
+
+public class MetaPropUsedTypeConverter implements Converter<MetaPropUsedType> {
+    @Override
+    public Class supportJavaTypeKey() {
+        return MetaPropUsedType.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return null;
+    }
+
+    @Override
+    public MetaPropUsedType convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        try {
+            for (MetaPropUsedType value : MetaPropUsedType.values()) {
+                if (value.getDescription().equals(cellData.getStringValue())) {
+                    return value;
+                }
+            }
+        } catch (Exception ignored) {
+        }
+        return null;
+    }
+
+    @Override
+    public CellData convertToExcelData(MetaPropUsedType value, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        if (value != null) {
+            return new CellData(value.getDescription());
+        }
+        return null;
+    }
+}

+ 42 - 0
src/main/java/com/izouma/nineth/utils/excel/MetaResourcesTypeConverter.java

@@ -0,0 +1,42 @@
+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.MetaResourcesType;
+
+public class MetaResourcesTypeConverter implements Converter<MetaResourcesType> {
+
+    @Override
+    public Class supportJavaTypeKey() {
+        return MetaResourcesType.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return null;
+    }
+
+    @Override
+    public MetaResourcesType convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        try {
+            for (MetaResourcesType value : MetaResourcesType.values()) {
+                if (value.getDescription().equals(cellData.getStringValue())) {
+                    return value;
+                }
+            }
+        } catch (Exception ignored) {
+        }
+        return null;
+    }
+
+    @Override
+    public CellData convertToExcelData(MetaResourcesType value, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        if (value != null) {
+            return new CellData(value.getDescription());
+        }
+        return null;
+    }
+}

+ 41 - 0
src/main/java/com/izouma/nineth/utils/excel/MetaStoreCommodityTypeConverter.java

@@ -0,0 +1,41 @@
+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.MetaStoreCommodityType;
+
+public class MetaStoreCommodityTypeConverter implements Converter<MetaStoreCommodityType> {
+    @Override
+    public Class supportJavaTypeKey() {
+        return MetaStoreCommodityType.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return null;
+    }
+
+    @Override
+    public MetaStoreCommodityType convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        try {
+            for (MetaStoreCommodityType value : MetaStoreCommodityType.values()) {
+                if (value.getDescription().equals(cellData.getStringValue())) {
+                    return value;
+                }
+            }
+        } catch (Exception ignored) {
+        }
+        return null;
+    }
+
+    @Override
+    public CellData convertToExcelData(MetaStoreCommodityType value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        if (value != null) {
+            return new CellData(value.getDescription());
+        }
+        return null;
+    }
+}

+ 41 - 0
src/main/java/com/izouma/nineth/utils/excel/MetaSwitchTypeConverter.java

@@ -0,0 +1,41 @@
+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.MetaSwitchType;
+
+public class MetaSwitchTypeConverter implements Converter<MetaSwitchType> {
+    @Override
+    public Class supportJavaTypeKey() {
+        return MetaSwitchType.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return null;
+    }
+
+    @Override
+    public MetaSwitchType convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        try {
+            for (MetaSwitchType value : MetaSwitchType.values()) {
+                if (value.getDescription().equals(cellData.getStringValue())) {
+                    return value;
+                }
+            }
+        } catch (Exception ignored) {
+        }
+        return null;
+    }
+
+    @Override
+    public CellData convertToExcelData(MetaSwitchType value, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        if (value != null) {
+            return new CellData(value.getDescription());
+        }
+        return null;
+    }
+}

+ 3 - 0
src/main/java/com/izouma/nineth/web/AirDropController.java

@@ -32,11 +32,13 @@ public class AirDropController extends BaseController {
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/all")
+    @PreAuthorize("hasAnyRole('ADMIN', 'SAAS')")
     public Page<AirDrop> all(@RequestBody PageQuery pageQuery) {
         return airDropService.all(pageQuery);
     }
 
     @GetMapping("/get/{id}")
+    @PreAuthorize("hasAnyRole('ADMIN', 'SAAS')")
     public AirDrop get(@PathVariable Long id) {
         return airDropRepo.findById(id).orElseThrow(new BusinessException("无记录"));
     }
@@ -47,6 +49,7 @@ public class AirDropController extends BaseController {
     }
 
     @GetMapping("/excel")
+    @PreAuthorize("hasAnyRole('ADMIN', 'SAAS')")
     @ResponseBody
     public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
         List<AirDrop> data = all(pageQuery).getContent();

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

@@ -8,6 +8,7 @@ import com.izouma.nineth.domain.Asset;
 import com.izouma.nineth.domain.DomainOrder;
 import com.izouma.nineth.domain.GiftOrder;
 import com.izouma.nineth.dto.*;
+import com.izouma.nineth.enums.AssetStatus;
 import com.izouma.nineth.enums.CollectionType;
 import com.izouma.nineth.enums.OperationSource;
 import com.izouma.nineth.enums.OrderStatus;
@@ -103,6 +104,10 @@ public class AssetController extends BaseController {
     @JsonView(Asset.View.Basic.class)
     public Asset get(@PathVariable Long id) {
         Asset asset = assetRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        if (!asset.isPublicShow() && (SecurityUtils.getAuthenticatedUser() == null
+                || !asset.getUserId().equals(SecurityUtils.getAuthenticatedUser().getId()))) {
+            throw new BusinessException("无记录");
+        }
         if (asset.getType().equals(CollectionType.DOMAIN)) {
             String domainName = asset.getName().substring(9);
             DomainOrder domainOrder = domainOrderRepo
@@ -167,7 +172,7 @@ public class AssetController extends BaseController {
     @ApiOperation("转赠(无gas费)")
     public GiftOrder giftWithoutGasFee(@RequestParam Long assetId, @RequestParam Long toUserId, @RequestParam String tradeCode) {
         return giftOrderService.giftWithoutGasFee(SecurityUtils.getAuthenticatedUser()
-                .getId(), assetId, toUserId, tradeCode);
+                                                               .getId(), assetId, toUserId, tradeCode);
     }
 
     @GetMapping("/tokenHistory")
@@ -232,7 +237,7 @@ public class AssetController extends BaseController {
     @PostMapping("/metaDestroy")
     public void metaDestroy(@RequestBody MetaDestroyParam metaDestroyParam) {
         assetService.metaDestroyWithoutTradeCode(metaDestroyParam, SecurityUtils.getAuthenticatedUser()
-                .getId(), OperationSource.META);
+                                                                                .getId(), OperationSource.META);
     }
 
     @ApiOperation("开盲盒")
@@ -258,7 +263,7 @@ public class AssetController extends BaseController {
             return 0;
         }
         return assetService.getRoyalties(asset.getMinterId(), asset.getRoyalties(), SecurityUtils.getAuthenticatedUser()
-                .getId());
+                                                                                                 .getId());
     }
 
     @PostMapping("/getServicecharge")
@@ -268,7 +273,7 @@ public class AssetController extends BaseController {
             return assetService.getDomainServiceCharge(SecurityUtils.getAuthenticatedUser().getId());
         }
         return assetService.getServicecharge(asset.getServiceCharge(), SecurityUtils.getAuthenticatedUser()
-                .getId());
+                                                                                    .getId());
     }
 
     @GetMapping("/hcChain")
@@ -310,6 +315,16 @@ public class AssetController extends BaseController {
         assetRepo.openTrade(name);
         collectionRepo.openTrade(name);
     }
+
+    @GetMapping("/getId/{name}")
+    public MetaRestResult<Long> getId(@PathVariable String name) {
+        Asset asset = assetRepo.findByNameAndStatusAndCategoryAndDel("RID元宇宙域名 ".concat(name)
+                                                                                     .concat(".nft"), AssetStatus.NORMAL, "元域名", false);
+        if (Objects.isNull(asset)) {
+            return MetaRestResult.returnError("该域名不存在");
+        }
+        return MetaRestResult.returnSuccess("查询成功", asset.getUserId());
+    }
 }
 
 

+ 8 - 2
src/main/java/com/izouma/nineth/web/DomainOrderController.java

@@ -81,7 +81,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')")
@@ -116,6 +119,8 @@ public class DomainOrderController extends BaseController {
         return domainOrderService.domainTop();
     }
 
+    //全局买域名的时候,显示每个域名是否绑定了超链.
+
 
     //自己添加超链
     @PostMapping("/addHyperLink")
@@ -125,7 +130,8 @@ public class DomainOrderController extends BaseController {
         Asset byCollectionIdAndStatus = assetRepo.findByCollectionIdAndStatus(collectionId, AssetStatus.NORMAL);
         String name = byCollectionIdAndStatus.getName();
         String result = name.substring(name.indexOf(" ") + 1);
-        DomainOrder byDomainNameAndOrderStatus = domainOrderRepo.findByDomainNameAndOrderStatus(result, OrderStatus.FINISH);
+        DomainOrder byDomainNameAndOrderStatus = domainOrderRepo
+                .findByDomainNameAndOrderStatus(result, OrderStatus.FINISH);
         byDomainNameAndOrderStatus.setOpenHyperLink(true);
         byDomainNameAndOrderStatus.setHyperLinkType(hyperLinkType);
         byDomainNameAndOrderStatus.setAddress(address);

+ 65 - 0
src/main/java/com/izouma/nineth/web/MetaAtomTaskController.java

@@ -0,0 +1,65 @@
+package com.izouma.nineth.web;
+
+import com.izouma.nineth.domain.MetaAtomTask;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.exception.BusinessException;
+import com.izouma.nineth.repo.MetaAtomTaskRepo;
+import com.izouma.nineth.service.MetaAtomTaskService;
+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.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/metaAtomTask")
+@AllArgsConstructor
+public class MetaAtomTaskController extends BaseController {
+    private MetaAtomTaskService metaAtomTaskService;
+    private MetaAtomTaskRepo metaAtomTaskRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public MetaAtomTask save(@RequestBody MetaAtomTask record) {
+        if (record.getId() != null) {
+            MetaAtomTask orig = metaAtomTaskRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return metaAtomTaskRepo.save(orig);
+        }
+        return metaAtomTaskRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<MetaAtomTask> all(@RequestBody PageQuery pageQuery) {
+        return metaAtomTaskService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public MetaAtomTask get(@PathVariable Long id) {
+        return metaAtomTaskRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        metaAtomTaskRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<MetaAtomTask> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+
+    @GetMapping("/findAll")
+    public List<MetaAtomTask> findAll() {
+        return metaAtomTaskRepo.findAllByDel(false);
+    }
+}
+

+ 2 - 2
src/main/java/com/izouma/nineth/web/MetaProblemController.java

@@ -59,8 +59,8 @@ public class MetaProblemController extends BaseController {
     }
 
     @GetMapping("/findAll")
-    public List<MetaProblem> findAll(){
-        return metaProblemRepo.findAllByDel(false);
+    public MetaRestResult<List<MetaProblem>> findAll(){
+        return MetaRestResult.returnSuccess("查询成功",metaProblemRepo.findAllByDel(false));
     }
 
     @GetMapping("/getAnswer/{id}")

+ 25 - 5
src/main/java/com/izouma/nineth/web/MetaResourcesController.java

@@ -2,6 +2,7 @@ package com.izouma.nineth.web;
 
 import com.izouma.nineth.domain.MetaResources;
 import com.izouma.nineth.domain.MetaResourcesLikeRecord;
+import com.izouma.nineth.dto.MetaResourcesLikeDTO;
 import com.izouma.nineth.dto.MetaRestResult;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.exception.BusinessException;
@@ -83,20 +84,20 @@ public class MetaResourcesController extends BaseController {
         return MetaRestResult.returnSuccess("查询成功", metaResources.getValue());
     }
 
-    @PostMapping("/like")
-    public MetaRestResult<Integer> like(Long id, Long userId) {
-        MetaResources metaResources = metaResourcesRepo.findById(id).orElse(null);
+    @PostMapping("/like/{name}/{userId}")
+    public MetaRestResult<Integer> like(@PathVariable String name, @PathVariable Long userId) {
+        MetaResources metaResources = metaResourcesRepo.findByNameAndDel(name, false);
         if (Objects.isNull(metaResources)) {
             return MetaRestResult.returnError("当前资源不存在!");
         }
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DateTimeUtils.DATE_FORMAT);
         LocalDate likeTime = LocalDate.parse(LocalDate.now().format(formatter), formatter);
-        MetaResourcesLikeRecord metaResourcesLikeRecord = metaResourcesLikeRecordRepo.findByMetaResourcesIdAndUserIdAndLikeTime(id, userId, likeTime);
+        MetaResourcesLikeRecord metaResourcesLikeRecord = metaResourcesLikeRecordRepo.findByMetaResourcesNameAndUserIdAndLikeTime(name, userId, likeTime);
         if (Objects.nonNull(metaResourcesLikeRecord)) {
             return MetaRestResult.returnError("该资源今天已经点过赞,不可重复点赞");
         }
         metaResourcesLikeRecord = new MetaResourcesLikeRecord();
-        metaResourcesLikeRecord.setMetaResourcesId(id);
+        metaResourcesLikeRecord.setMetaResourcesName(name);
         metaResourcesLikeRecord.setUserId(userId);
         metaResourcesLikeRecord.setLikeTime(likeTime);
         metaResourcesLikeRecordRepo.save(metaResourcesLikeRecord);
@@ -104,5 +105,24 @@ public class MetaResourcesController extends BaseController {
         metaResourcesRepo.save(metaResources);
         return MetaRestResult.returnSuccess(metaResources.getLikeNum());
     }
+
+
+    @GetMapping("/getLikeNum/{name}/{userId}")
+    public MetaRestResult<MetaResourcesLikeDTO> getLikeNum(@PathVariable String name, @PathVariable Long userId) {
+        MetaResources metaResources = metaResourcesRepo.findByNameAndDel(name, false);
+        if (Objects.isNull(metaResources)) {
+            return MetaRestResult.returnError("当前资源不存在!");
+        }
+        MetaResourcesLikeDTO metaResourcesLikeDTO = new MetaResourcesLikeDTO();
+        metaResourcesLikeDTO.setNum(metaResources.getLikeNum());
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DateTimeUtils.DATE_FORMAT);
+        LocalDate likeTime = LocalDate.parse(LocalDate.now().format(formatter), formatter);
+        MetaResourcesLikeRecord metaResourcesLikeRecord = metaResourcesLikeRecordRepo.findByMetaResourcesNameAndUserIdAndLikeTime(name, userId, likeTime);
+        if (Objects.nonNull(metaResourcesLikeRecord)) {
+            metaResourcesLikeDTO.setLike(true);
+            return MetaRestResult.returnSuccess(metaResourcesLikeDTO);
+        }
+        return MetaRestResult.returnSuccess(metaResourcesLikeDTO);
+    }
 }
 

+ 135 - 0
src/main/java/com/izouma/nineth/web/MetaStoreController.java

@@ -0,0 +1,135 @@
+package com.izouma.nineth.web;
+
+import com.izouma.nineth.domain.MetaStore;
+import com.izouma.nineth.domain.MetaUserProp;
+import com.izouma.nineth.dto.MetaRestResult;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.enums.MetaPropUsedType;
+import com.izouma.nineth.enums.MetaStoreCommodityType;
+import com.izouma.nineth.exception.BusinessException;
+import com.izouma.nineth.repo.MetaStoreRepo;
+import com.izouma.nineth.repo.MetaUserPropRepo;
+import com.izouma.nineth.service.MetaStoreService;
+import com.izouma.nineth.utils.ObjUtils;
+import com.izouma.nineth.utils.SecurityUtils;
+import com.izouma.nineth.utils.excel.ExcelUtils;
+import lombok.AllArgsConstructor;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.data.domain.Page;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+import java.util.Objects;
+
+@RestController
+@RequestMapping("/metaStore")
+@AllArgsConstructor
+public class MetaStoreController extends BaseController {
+
+    private MetaStoreService metaStoreService;
+
+    private MetaStoreRepo metaStoreRepo;
+
+    private MetaUserPropRepo metaUserPropRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public MetaStore save(@RequestBody MetaStore record) {
+        if (Objects.isNull(record.getId())) {
+            if (MetaStoreCommodityType.META_PROP.equals(record.getCommodityType()) && !checkMetaProp(record.getMetaPropId())) {
+                throw new BusinessException("商店中已经存在该道具");
+            }
+            if (MetaStoreCommodityType.NFT.equals(record.getCommodityType())) {
+                MetaStore metaStore = metaStoreRepo.findByCommodityTypeAndNameAndDel(MetaStoreCommodityType.NFT, record.getName(), false);
+                if (Objects.nonNull(metaStore)) {
+                    throw new BusinessException("商店中已经存在该NFT");
+                }
+            }
+            return metaStoreRepo.save(record);
+        }
+        MetaStore orig = metaStoreRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+        ObjUtils.merge(orig, record);
+        return metaStoreRepo.save(orig);
+    }
+
+    @PostMapping("/{id}/onShelf")
+    public void onShelf(@PathVariable Long id) {
+        MetaStore metaStore = metaStoreRepo.findByIdAndDel(id, false);
+        if (Objects.isNull(metaStore)) {
+            throw new BusinessException("无记录");
+        }
+        if (metaStore.isOnShelf()) {
+            throw new BusinessException("当前商品已经处于上架状态!");
+        }
+        metaStore.setOnShelf(true);
+        metaStoreRepo.save(metaStore);
+    }
+
+    @PostMapping("/{id}/cancelOnShelf")
+    public void cancelOnShelf(@PathVariable Long id) {
+        MetaStore metaStore = metaStoreRepo.findByIdAndDel(id, false);
+        if (Objects.isNull(metaStore)) {
+            throw new BusinessException("无记录");
+        }
+        if (!metaStore.isOnShelf()) {
+            throw new BusinessException("当前商品已经处于下架状态!");
+        }
+        metaStore.setOnShelf(false);
+        metaStoreRepo.save(metaStore);
+    }
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<MetaStore> all(@RequestBody PageQuery pageQuery) {
+        return metaStoreService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public MetaStore get(@PathVariable Long id) {
+        return metaStoreRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        metaStoreRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<MetaStore> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+
+    @GetMapping("/{metaPropId}/checkMetaProp")
+    public boolean checkMetaProp(@PathVariable Long metaPropId) {
+        MetaStore metaStore = metaStoreRepo.findByCommodityTypeAndMetaPropIdAndDel(MetaStoreCommodityType.META_PROP, metaPropId, false);
+        return Objects.isNull(metaStore);
+    }
+
+    @PostMapping("/{id}/purchase")
+    public MetaRestResult<Void> purchase(@PathVariable Long id) {
+        return metaStoreService.purchase(id);
+    }
+
+    @GetMapping("findByType")
+    public MetaRestResult<List<MetaStore>> findByType(MetaStoreCommodityType commodityType) {
+        List<MetaStore> metaStores = metaStoreRepo.findAllByCommodityTypeAndOnShelfAndDel(commodityType, true, false);
+        if (CollectionUtils.isEmpty(metaStores)) {
+            return MetaRestResult.returnSuccess(metaStores);
+        }
+        if (MetaStoreCommodityType.META_PROP.equals(commodityType)) {
+            Long userId = SecurityUtils.getAuthenticatedUser().getId();
+            metaStores.forEach(metaStore -> {
+                MetaUserProp metaUserProp = metaUserPropRepo.findByUserIdAndMetaPropIdAndDel(userId, metaStore.getMetaPropId(), false);
+                if (Objects.nonNull(metaUserProp) && MetaPropUsedType.PERMANENT.equals(metaUserProp.getUsedType()) && metaUserProp.getNum() >= 1) {
+                    metaStore.setCanPurchase(false);
+                }
+            });
+        }
+        return MetaRestResult.returnSuccess(metaStores);
+    }
+}
+

+ 33 - 0
src/main/java/com/izouma/nineth/web/MetaStorePurchaseRecordController.java

@@ -0,0 +1,33 @@
+package com.izouma.nineth.web;
+
+import com.izouma.nineth.domain.MetaStorePurchaseRecord;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.service.MetaStorePurchaseRecordService;
+import com.izouma.nineth.utils.excel.ExcelUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/metaStorePurchaseRecord")
+@AllArgsConstructor
+public class MetaStorePurchaseRecordController extends BaseController {
+
+    private MetaStorePurchaseRecordService metaStorePurchaseRecordService;
+
+    @PostMapping("/all")
+    public Page<MetaStorePurchaseRecord> all(@RequestBody PageQuery pageQuery) {
+        return metaStorePurchaseRecordService.all(pageQuery);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<MetaStorePurchaseRecord> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}

+ 17 - 2
src/main/java/com/izouma/nineth/web/MetaTaskController.java

@@ -1,13 +1,15 @@
 package com.izouma.nineth.web;
 
 import com.izouma.nineth.config.MetaConstants;
+import com.izouma.nineth.domain.MetaProp;
 import com.izouma.nineth.domain.MetaTask;
 import com.izouma.nineth.dto.MetaRestResult;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.enums.MetaAwardTypeEnum;
-import com.izouma.nineth.enums.MetaTaskType;
+import com.izouma.nineth.enums.MetaTaskTarget;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.CollectionRepo;
+import com.izouma.nineth.repo.MetaPropRepo;
 import com.izouma.nineth.repo.MetaTaskRepo;
 import com.izouma.nineth.repo.MetaTaskToUserRepo;
 import com.izouma.nineth.service.MetaTaskService;
@@ -21,22 +23,26 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
 
 @RestController
 @RequestMapping("/metaTask")
 @AllArgsConstructor
 public class MetaTaskController extends BaseController {
     private MetaTaskService metaTaskService;
+
     private MetaTaskRepo metaTaskRepo;
 
     private MetaTaskToUserRepo metaTaskToUserRepo;
 
     private CollectionRepo collectionRepo;
 
+    private MetaPropRepo metaPropRepo;
+
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
     public MetaTask save(@RequestBody MetaTask record) {
-        if (record.getType().equals(MetaTaskType.COLLECT_COLLECTION)) {
+        if (record.getType().equals(MetaTaskTarget.COLLECT_COLLECTION)) {
             String[] split = record.getValue().split(MetaConstants.BLANK);
             Arrays.stream(split).forEach(collectionId -> {
                 collectionRepo.findByIdAndDelFalse(Long.parseLong(collectionId)).orElseThrow(new BusinessException(String.format("不存在collectionId[%S]的藏品", collectionId)));
@@ -95,6 +101,15 @@ public class MetaTaskController extends BaseController {
     @GetMapping("/{userId}/{channelId}/canGet")
     public MetaRestResult<List<MetaTask>> canGet(@PathVariable Long userId, @PathVariable Long channelId) {
         List<MetaTask> metaTasks = metaTaskRepo.canGet(userId, channelId);
+        metaTasks.forEach(metaTask -> {
+            if (MetaAwardTypeEnum.META_PROP.equals(metaTask.getAwardType()) && Objects.nonNull(metaTask.getMetaPropId())) {
+                MetaProp metaProp = metaPropRepo.findByIdAndDel(metaTask.getMetaPropId(), false);
+                if (Objects.isNull(metaProp)) {
+                    throw new BusinessException(String.format("道具[%S]不存在!", metaTask.getMetaPropId()));
+                }
+                metaTask.setMetaProp(metaProp);
+            }
+        });
         return MetaRestResult.returnSuccess(metaTasks);
     }
 

+ 65 - 0
src/main/java/com/izouma/nineth/web/MetaTaskNewController.java

@@ -0,0 +1,65 @@
+package com.izouma.nineth.web;
+
+import com.izouma.nineth.domain.MetaTaskNew;
+import com.izouma.nineth.dto.MetaRestResult;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.repo.MetaTaskNewRepo;
+import com.izouma.nineth.service.MetaTaskNewService;
+import com.izouma.nineth.utils.excel.ExcelUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/metaTaskNew")
+@AllArgsConstructor
+public class MetaTaskNewController extends BaseController {
+
+    private MetaTaskNewService metaTaskNewService;
+
+    private MetaTaskNewRepo metaTaskNewRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public MetaTaskNew save(@RequestBody MetaTaskNew record) {
+        return metaTaskNewService.save(record);
+    }
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<MetaTaskNew> all(@RequestBody PageQuery pageQuery) {
+        return metaTaskNewService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public MetaTaskNew get(@PathVariable Long id) {
+        return metaTaskNewService.get(id);
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        metaTaskNewRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<MetaTaskNew> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+
+    @GetMapping("/findAll")
+    public MetaRestResult<List<MetaTaskNew>> findAll() {
+        List<MetaTaskNew> metaTaskNews = metaTaskNewRepo.findAllByPublishAndDel(true, false);
+        return MetaRestResult.returnSuccess(metaTaskNews);
+    }
+
+    @GetMapping("/{userId}/{channelId}/canGet")
+    public MetaRestResult<List<MetaTaskNew>> canGet(@PathVariable Long userId, @PathVariable Long channelId) {
+        return metaTaskNewService.canGet(userId, channelId);
+    }
+}

+ 64 - 0
src/main/java/com/izouma/nineth/web/MetaTaskToUserNewController.java

@@ -0,0 +1,64 @@
+package com.izouma.nineth.web;
+
+import com.izouma.nineth.domain.MetaTaskToUserNew;
+import com.izouma.nineth.dto.MetaRestResult;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.enums.MetaTaskStatus;
+import com.izouma.nineth.repo.MetaTaskToUserNewRepo;
+import com.izouma.nineth.service.MetaTaskToUserNewService;
+import com.izouma.nineth.utils.excel.ExcelUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+import java.util.Objects;
+
+@RestController
+@RequestMapping("/metaTaskToUserNew")
+@AllArgsConstructor
+public class MetaTaskToUserNewController {
+
+    private MetaTaskToUserNewService metaTaskToUserNewService;
+
+    private MetaTaskToUserNewRepo metaTaskToUserNewRepo;
+
+    @PostMapping("/all")
+    public Page<MetaTaskToUserNew> all(@RequestBody PageQuery pageQuery) {
+        return metaTaskToUserNewService.all(pageQuery);
+    }
+
+    @PostMapping("/autoReceiveTask")
+    public MetaRestResult<Void> autoReceiveTask() {
+        return metaTaskToUserNewService.autoReceiveTask();
+    }
+
+    @PostMapping("/receiveTask")
+    public MetaRestResult<MetaTaskToUserNew> receiveTask(@RequestBody MetaTaskToUserNew metaTaskToUserNew) {
+        return metaTaskToUserNewService.receiveTask(metaTaskToUserNew, true);
+    }
+
+    @GetMapping("/{id}/findProgress")
+    public MetaRestResult<MetaTaskToUserNew> findProgress(@PathVariable Long id) {
+        MetaTaskToUserNew metaTaskToUserNew = metaTaskToUserNewRepo.findByIdAndDel(id, false);
+        if (Objects.isNull(metaTaskToUserNew)) {
+            return MetaRestResult.returnError(String.format("根据id[%S]查询不到用户领取记录", id));
+        }
+        return metaTaskToUserNewService.setSingleProgress(metaTaskToUserNew);
+    }
+
+    @GetMapping("/{userId}/{channelId}/{status}/findByStatus")
+    public MetaRestResult<List<MetaTaskToUserNew>> findByStatus(@PathVariable Long userId, @PathVariable Long channelId, @PathVariable MetaTaskStatus status) {
+        return metaTaskToUserNewService.findByStatus(userId, channelId, status);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<MetaTaskToUserNew> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+
+}

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

@@ -0,0 +1,60 @@
+package com.izouma.nineth.web;
+import com.izouma.nineth.domain.MetaTop;
+import com.izouma.nineth.service.MetaTopService;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.exception.BusinessException;
+import com.izouma.nineth.repo.MetaTopRepo;
+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("/metaTop")
+@AllArgsConstructor
+public class MetaTopController extends BaseController {
+    private MetaTopService metaTopService;
+    private MetaTopRepo metaTopRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public MetaTop save(@RequestBody MetaTop record) {
+        if (record.getId() != null) {
+            MetaTop orig = metaTopRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return metaTopRepo.save(orig);
+        }
+        return metaTopRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<MetaTop> all(@RequestBody PageQuery pageQuery) {
+        return metaTopService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public MetaTop get(@PathVariable Long id) {
+        return metaTopRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        metaTopRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<MetaTop> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 7 - 3
src/main/java/com/izouma/nineth/web/MetaUserGoldController.java

@@ -70,10 +70,14 @@ public class MetaUserGoldController extends BaseController {
 
     @GetMapping("/{userId}/queryNum")
     public MetaRestResult<Integer> queryGoldNum(@PathVariable Long userId) {
-        MetaUserGold metaUserGold = metaUserGoldRepo.findByUserIdAndDel(userId, false);
-        if (Objects.isNull(metaUserGold)) {
+        MetaUserGold metaUserGold = metaUserGoldRepo.findByUserIdAndDel(userId, false).orElseGet(() -> {
             metaUserGoldService.initMetaUserGold(String.valueOf(userId));
-            return MetaRestResult.returnSuccess(0);
+            return metaUserGoldRepo.findByUserIdAndDel(userId, false).orElse(null);
+        });
+        if (Objects.isNull(metaUserGold)) {
+            String errMMsg = String.format("当前用户[%S]金币账户数据不存在且无法初始化数据", userId);
+            log.error(errMMsg);
+            return MetaRestResult.returnError(errMMsg);
         }
         return MetaRestResult.returnSuccess(metaUserGold.getNum());
     }

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

@@ -1,19 +1,29 @@
 package com.izouma.nineth.web;
 
+import cn.hutool.core.collection.CollectionUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.izouma.nineth.config.MetaConstants;
+import com.izouma.nineth.domain.MetaGameBoxPoints;
+import com.izouma.nineth.domain.MetaParamsConfig;
 import com.izouma.nineth.domain.MetaUserGoldRecord;
-import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.dto.*;
 import com.izouma.nineth.exception.BusinessException;
+import com.izouma.nineth.repo.MetaParamsConfigRepo;
 import com.izouma.nineth.repo.MetaUserGoldRecordRepo;
+import com.izouma.nineth.service.MetaParamsConfigService;
 import com.izouma.nineth.service.MetaUserGoldRecordService;
 import com.izouma.nineth.utils.ObjUtils;
 import com.izouma.nineth.utils.excel.ExcelUtils;
 import lombok.AllArgsConstructor;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.data.domain.Page;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 @RestController
 @RequestMapping("/metaUserGoldRecord")
@@ -21,6 +31,7 @@ import java.util.List;
 public class MetaUserGoldRecordController extends BaseController {
     private MetaUserGoldRecordService metaUserGoldRecordService;
     private MetaUserGoldRecordRepo metaUserGoldRecordRepo;
+    private MetaParamsConfigService metaParamsConfigService;
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
@@ -56,5 +67,45 @@ public class MetaUserGoldRecordController extends BaseController {
         List<MetaUserGoldRecord> data = all(pageQuery).getContent();
         ExcelUtils.export(response, data);
     }
+
+    @GetMapping("/excel/top")
+    @ResponseBody
+    public void excelTop(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<MetaGoldTopDTO> data = top(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+
+    @PostMapping("/goldTop")
+    public Page<MetaGoldTopDTO> top(@RequestBody PageQuery pageQuery) {
+        String beginTime = metaParamsConfigService.getString(MetaConstants.META_GOLD_TOP_BEGIN_TIME);
+        String endTime = metaParamsConfigService.getString(MetaConstants.META_GOLD_TOP_END_TIME);
+        List<Map<String, String>> map = metaUserGoldRecordRepo.top(beginTime, endTime);
+        JSONArray jsonArray = new JSONArray();
+        jsonArray.addAll(map);
+        List<MetaGoldTopDTO> metaGoldTopDTOS = jsonArray.toJavaList(MetaGoldTopDTO.class);
+        // 当前页
+        int page = pageQuery.getPage();
+        // pageSize 每页查询多少条数据
+        int size = pageQuery.getSize();
+        // limit 开始偏移量
+        int start = page * size;
+        int totalElements = 0;
+        if (CollectionUtils.isEmpty(metaGoldTopDTOS)) {
+            totalElements = 0;
+            return new PageWrapper<>(new ArrayList<MetaGoldTopDTO>(), page,
+                    size, totalElements).toPage();
+        }
+        totalElements = metaGoldTopDTOS.size();
+        List<MetaGoldTopDTO> newMetaGoldTopDTOS;
+        if (metaGoldTopDTOS.size() < start + size) {
+            newMetaGoldTopDTOS = metaGoldTopDTOS.subList(start, metaGoldTopDTOS.size());
+            return new PageWrapper<>(newMetaGoldTopDTOS, page,
+                    size, totalElements).toPage();
+        }
+        newMetaGoldTopDTOS = metaGoldTopDTOS.subList(start, start + size);
+        return new PageWrapper<>(newMetaGoldTopDTOS, page,
+                size, totalElements).toPage();
+
+    }
 }
 

+ 3 - 2
src/main/java/com/izouma/nineth/web/MetaUserTaskAwardReceivedRecordController.java

@@ -3,6 +3,7 @@ package com.izouma.nineth.web;
 import com.izouma.nineth.dto.MetaRestResult;
 import com.izouma.nineth.service.MetaUserTaskAwardReceivedRecordService;
 import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -14,8 +15,8 @@ public class MetaUserTaskAwardReceivedRecordController {
 
     private MetaUserTaskAwardReceivedRecordService metaUserTaskAwardReceivedRecordService;
 
-    @PostMapping("/receiveAward")
-    public MetaRestResult<Void> receiveAward(Long metaTaskId) {
+    @PostMapping("/receiveAward/{metaTaskId}")
+    public MetaRestResult<Void> receiveAward(@PathVariable Long metaTaskId) {
         return metaUserTaskAwardReceivedRecordService.receiveAward(metaTaskId);
     }
 }

+ 39 - 0
src/main/java/com/izouma/nineth/web/MetaUserTaskAwardReceivedRecordNewController.java

@@ -0,0 +1,39 @@
+package com.izouma.nineth.web;
+
+import com.izouma.nineth.domain.MetaUserTaskAwardReceivedRecordNew;
+import com.izouma.nineth.dto.MetaRestResult;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.service.MetaUserTaskAwardReceivedRecordNewService;
+import com.izouma.nineth.utils.excel.ExcelUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/metaUserTaskAwardReceivedRecordNew")
+@AllArgsConstructor
+public class MetaUserTaskAwardReceivedRecordNewController {
+
+    private MetaUserTaskAwardReceivedRecordNewService metaUserTaskAwardReceivedRecordNewService;
+
+    @PostMapping("/receiveAward/{taskId}/{atomTaskId}")
+    public MetaRestResult<Void> receiveAward(@PathVariable Long taskId, @PathVariable Long atomTaskId) {
+        return metaUserTaskAwardReceivedRecordNewService.receiveAward(taskId, atomTaskId);
+    }
+
+    @PostMapping("/all")
+    public Page<MetaUserTaskAwardReceivedRecordNew> all(@RequestBody PageQuery pageQuery) {
+        return metaUserTaskAwardReceivedRecordNewService.all(pageQuery);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<MetaUserTaskAwardReceivedRecordNew> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}

+ 51 - 0
src/main/java/com/izouma/nineth/web/MetaUserTaskProgressNewController.java

@@ -0,0 +1,51 @@
+package com.izouma.nineth.web;
+
+import com.izouma.nineth.domain.MetaUserTaskProgressNew;
+import com.izouma.nineth.dto.MetaRestResult;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.exception.BusinessException;
+import com.izouma.nineth.repo.MetaUserTaskProgressNewRepo;
+import com.izouma.nineth.service.MetaUserTaskProgressNewService;
+import com.izouma.nineth.utils.excel.ExcelUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/metaUserTaskProgressNew")
+@AllArgsConstructor
+public class MetaUserTaskProgressNewController extends BaseController {
+
+    private MetaUserTaskProgressNewService metaUserTaskProgressNewService;
+
+    private MetaUserTaskProgressNewRepo metaUserTaskProgressNewRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<MetaUserTaskProgressNew> all(@RequestBody PageQuery pageQuery) {
+        return metaUserTaskProgressNewService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public MetaUserTaskProgressNew get(@PathVariable Long id) {
+        return metaUserTaskProgressNewRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<MetaUserTaskProgressNew> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+
+    @PostMapping("/metaSave")
+    public MetaRestResult<Boolean> metaSave(@RequestBody MetaUserTaskProgressNew metaUserTaskProgressNew) {
+        return metaUserTaskProgressNewService.metaSave(metaUserTaskProgressNew);
+    }
+
+}
+

+ 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);
+    }
 }

+ 12 - 1
src/main/java/com/izouma/nineth/web/nftdomain/DomainAskController.java

@@ -19,7 +19,9 @@ 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
@@ -52,16 +54,25 @@ public class DomainAskController extends BaseController {
         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);
     }
 
+    @PostMapping("/accept")
+    public void accept(Long id) {
+        domainAskService.accept(id);
+    }
+
     @PostMapping("/maxPrice")
     public BigDecimal maxPrice(Long domainOrderId) {
         return Optional.ofNullable(domainAskService.getMaxPrice(domainOrderId)).orElse(BigDecimal.ZERO);
     }
 
     @PostMapping("/groupInfo")
-    public List<DomainAskGroup> getGroupInfo() {
+    public List<Map<String, Object>> getGroupInfo() {
         return domainAskService.getGroups();
     }
 

+ 1 - 0
src/main/resources/genjson/MetaAtomTask.json

@@ -0,0 +1 @@
+{"tableName":"MetaAtomTask","className":"MetaAtomTask","remark":"基础任务","genTable":true,"genClass":true,"genList":true,"genForm":true,"genRouter":true,"javaPath":"/Users/xiaohuoban/IdeaProjects/raex_back/src/main/java/com/izouma/nineth","viewPath":"/Users/xiaohuoban/IdeaProjects/raex_back/src/main/vue/src/views","routerPath":"/Users/xiaohuoban/IdeaProjects/raex_back/src/main/vue/src","resourcesPath":"/Users/xiaohuoban/IdeaProjects/raex_back/src/main/resources","dataBaseType":"Mysql","fields":[{"name":"name","modelName":"name","remark":"任务名称","showInList":true,"showInForm":true,"formType":"singleLineText","required":true},{"name":"detail","modelName":"detail","remark":"任务详情","showInList":true,"showInForm":true,"formType":"singleLineText","required":true},{"name":"targetType","modelName":"targetType","remark":"任务目标","showInList":true,"showInForm":true,"formType":"select","required":true,"apiFlag":"1","optionsValue":"[{\"label\":\"收集藏品\",\"value\":\"COLLECT_COLLECTION\"},{\"label\":\"每日在线时长\",\"value\":\"ON_LINE_TIME_DAILY\"},{\"label\":\"累计\",\"value\":\"ACCUMULATE\"}]"},{"name":"targetConfig","modelName":"targetConfig","remark":"目标配置","showInList":true,"showInForm":true,"formType":"singleLineText","required":true},{"name":"awardType","modelName":"awardType","remark":"奖励类型","showInList":true,"showInForm":true,"formType":"select","required":true,"apiFlag":"1","optionsValue":"[{\"label\":\"空\",\"value\":\"NULL\"},{\"label\":\"NFT\",\"value\":\"NFT\"},{\"label\":\"金币\",\"value\":\"GOLD\"},{\"label\":\"元宇宙道具\",\"value\":\"META_PROP\"}]"},{"name":"awardConfig","modelName":"awardConfig","remark":"奖励配置","showInList":true,"showInForm":true,"formType":"singleLineText","required":true}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.nineth","tablePackage":"com.izouma.nineth.domain.MetaAtomTask"}

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
src/main/resources/genjson/MetaStore.json


+ 1 - 0
src/main/resources/genjson/MetaTaskNew.json

@@ -0,0 +1 @@
+{"tableName":"MetaTaskNew","className":"MetaTaskNew","remark":"新任务管理","genTable":true,"genClass":true,"genList":true,"genForm":true,"genRouter":true,"javaPath":"/Users/xiaohuoban/IdeaProjects/raex_back/src/main/java/com/izouma/nineth","viewPath":"/Users/xiaohuoban/IdeaProjects/raex_back/src/main/vue/src/views","routerPath":"/Users/xiaohuoban/IdeaProjects/raex_back/src/main/vue/src","resourcesPath":"/Users/xiaohuoban/IdeaProjects/raex_back/src/main/resources","dataBaseType":"Mysql","fields":[{"name":"name","modelName":"name","remark":"任务名称","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"detail","modelName":"detail","remark":"任务详情","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"type","modelName":"type","remark":"任务分类","showInList":true,"showInForm":true,"formType":"select","apiFlag":"1","optionsValue":"[{\"label\":\"主线任务\",\"value\":\"MAIN_LINE\"},{\"label\":\"支线任务\",\"value\":\"BRANCH_LINE\"},{\"label\":\"日常任务\",\"value\":\"DAILY\"}]"},{"name":"publish","modelName":"publish","remark":"是否发布","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"autoReceive","modelName":"autoReceive","remark":"自动领取","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"channelId","modelName":"channelId","remark":"频道id","showInList":true,"showInForm":true,"formType":"number"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.nineth","tablePackage":"com.izouma.nineth.domain.MetaTaskNew"}

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 1
src/main/resources/static/js/jquery.min.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 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 - 0
src/main/resources/static/web-mobile/assets/main/import/08/08997832d.json


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
src/main/resources/static/web-mobile/assets/main/import/0a/0a68df1d0.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


برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است