Asset.java 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. package com.izouma.nineth.domain;
  2. import com.fasterxml.jackson.annotation.JsonView;
  3. import com.fasterxml.jackson.databind.annotation.JsonSerialize;
  4. import com.izouma.nineth.annotations.Searchable;
  5. import com.izouma.nineth.converter.FileObjectConverter;
  6. import com.izouma.nineth.converter.FileObjectListConverter;
  7. import com.izouma.nineth.converter.PrivilegeListConverter;
  8. import com.izouma.nineth.converter.PropertyListConverter;
  9. import com.izouma.nineth.enums.AssetSource;
  10. import com.izouma.nineth.enums.AssetStatus;
  11. import com.izouma.nineth.enums.CollectionType;
  12. import com.izouma.nineth.utils.CollectionTagSerializer;
  13. import io.swagger.annotations.ApiModel;
  14. import io.swagger.annotations.ApiModelProperty;
  15. import lombok.AllArgsConstructor;
  16. import lombok.Builder;
  17. import lombok.Data;
  18. import lombok.NoArgsConstructor;
  19. import org.hibernate.annotations.DynamicUpdate;
  20. import javax.persistence.*;
  21. import java.math.BigDecimal;
  22. import java.math.BigInteger;
  23. import java.time.LocalDateTime;
  24. import java.util.HashSet;
  25. import java.util.List;
  26. import java.util.Set;
  27. @Data
  28. @Entity
  29. @Table(indexes = {
  30. @Index(columnList = "userId"),
  31. @Index(columnList = "tokenId"),
  32. @Index(columnList = "collectionId"),
  33. @Index(columnList = "minterId"),
  34. @Index(columnList = "ownerId"),
  35. })
  36. @DynamicUpdate
  37. @AllArgsConstructor
  38. @NoArgsConstructor
  39. @Builder
  40. @ApiModel("资产")
  41. public class Asset extends CollectionBaseEntity {
  42. public interface View {
  43. interface Basic {
  44. }
  45. interface Detail {
  46. }
  47. }
  48. @ApiModelProperty("用户ID")
  49. private Long userId;
  50. @ApiModelProperty("藏品ID")
  51. private Long collectionId;
  52. @ApiModelProperty("订单ID")
  53. private Long orderId;
  54. @ApiModelProperty("编号")
  55. private Integer number;
  56. @ApiModelProperty("名称")
  57. @Searchable
  58. private String name;
  59. @ApiModelProperty("详情")
  60. @Column(columnDefinition = "TEXT")
  61. private String detail;
  62. @Column(columnDefinition = "TEXT")
  63. @Convert(converter = PropertyListConverter.class)
  64. @ApiModelProperty("特性")
  65. private List<CollectionProperty> properties;
  66. @Column(columnDefinition = "TEXT")
  67. @Convert(converter = PrivilegeListConverter.class)
  68. @ApiModelProperty("特权")
  69. private List<Privilege> privileges;
  70. @ApiModelProperty("分类")
  71. private String category;
  72. @ApiModelProperty("是否可转售")
  73. private boolean canResale;
  74. @ApiModelProperty("版税比例")
  75. private double royalties;
  76. @ApiModelProperty("手续费比例")
  77. private double serviceCharge;
  78. @ApiModelProperty("铸造者")
  79. @Searchable
  80. private String minter;
  81. @ApiModelProperty("铸造者ID")
  82. private Long minterId;
  83. @ApiModelProperty("铸造者头像")
  84. private String minterAvatar;
  85. @ApiModelProperty("持有者")
  86. @Searchable
  87. private String owner;
  88. @ApiModelProperty("持有者ID")
  89. private Long ownerId;
  90. @ApiModelProperty("持有者头像")
  91. private String ownerAvatar;
  92. @ApiModelProperty("图片")
  93. @Convert(converter = FileObjectListConverter.class)
  94. @Column(columnDefinition = "TEXT")
  95. private List<FileObject> pic;
  96. @Column(columnDefinition = "TEXT")
  97. @Convert(converter = FileObjectConverter.class)
  98. private FileObject model3d;
  99. @ApiModelProperty("tokenId")
  100. private String tokenId;
  101. @ApiModelProperty("tokenId")
  102. private String chainTokenId;
  103. @ApiModelProperty("购买hash")
  104. private String txHash;
  105. @ApiModelProperty("消耗gas")
  106. private BigInteger gasUsed;
  107. @ApiModelProperty("区块高度")
  108. private BigInteger blockNumber;
  109. @ApiModelProperty("ipfs地址")
  110. private String ipfsUrl;
  111. @ApiModelProperty("购买价格")
  112. @Column(precision = 10, scale = 2)
  113. private BigDecimal price;
  114. @ApiModelProperty("转让价格")
  115. @Column(precision = 10, scale = 2)
  116. private BigDecimal sellPrice;
  117. @ApiModelProperty("转让hash")
  118. private String outTxHash;
  119. @ApiModelProperty("转让订单ID")
  120. private Long outOrderId;
  121. @ApiModelProperty("状态")
  122. @Enumerated(EnumType.STRING)
  123. private AssetStatus status;
  124. @ApiModelProperty("是否公开展示")
  125. private boolean publicShow;
  126. @ApiModelProperty("是否寄售")
  127. private boolean consignment;
  128. private Long publicCollectionId;
  129. private int likes;
  130. private Long fromAssetId;
  131. //地块ID
  132. private Long oasisId;
  133. @ApiModelProperty("类型")
  134. @Enumerated(EnumType.STRING)
  135. private CollectionType type;
  136. @ApiModelProperty("持有几天")
  137. private Integer holdDays;
  138. @ApiModelProperty("持有几天")
  139. private Integer oldHoldDays;
  140. // @ApiModelProperty("vip权利")
  141. // private Boolean vip;
  142. @ApiModelProperty("来源")
  143. @Enumerated(EnumType.STRING)
  144. @Column(length = 20)
  145. private AssetSource source = AssetSource.OFFICIAL;
  146. // @Transient
  147. @Column(columnDefinition = "tinyint unsigned default 1")
  148. private boolean opened = true;
  149. @ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
  150. @JoinTable(
  151. name = "asset_tag",
  152. joinColumns = {@JoinColumn(name = "asset_id", referencedColumnName = "id", foreignKey = @ForeignKey(
  153. foreignKeyDefinition = "FOREIGN KEY (asset_id) REFERENCES asset(id) ON DELETE CASCADE"))},
  154. inverseJoinColumns = {@JoinColumn(name = "tag_id", referencedColumnName = "id", foreignKey = @ForeignKey(
  155. foreignKeyDefinition = "FOREIGN KEY (tag_id) REFERENCES tag(id) ON DELETE CASCADE"
  156. ))})
  157. @JsonSerialize(using = CollectionTagSerializer.class, as = HashSet.class)
  158. @JsonView(View.Detail.class)
  159. private Set<Tag> tags = new HashSet<>();
  160. private String hcTxHash;
  161. private BigInteger hcBlockNumber;
  162. private BigInteger hcGasUsed;
  163. private String hcTokenId;
  164. @Column(columnDefinition = "bit(1) default 0")
  165. private boolean safeFlag;
  166. private String prefixName;
  167. @ApiModelProperty("赋能列表")
  168. @Column(columnDefinition = "TEXT")
  169. private String empower;
  170. @Transient
  171. private int num;
  172. private LocalDateTime lockAt;
  173. private LocalDateTime lockTo;
  174. public static Asset create(Collection collection, User user) {
  175. return Asset.builder()
  176. .userId(user.getId())
  177. .collectionId(collection.getId())
  178. .minter(collection.getMinter())
  179. .minterId(collection.getMinterId())
  180. .minterAvatar(collection.getMinterAvatar())
  181. .name(collection.getName())
  182. .detail(collection.getDetail())
  183. .pic(collection.getPic())
  184. .model3d(collection.getModel3d())
  185. .properties(collection.getProperties())
  186. .privileges(collection.getPrivileges())
  187. .category(collection.getCategory())
  188. .canResale(collection.isCanResale())
  189. .royalties(collection.getRoyalties())
  190. .serviceCharge(collection.getServiceCharge())
  191. .price(collection.getPrice())
  192. .status(AssetStatus.NORMAL)
  193. .owner(user.getNickname())
  194. .ownerId(user.getId())
  195. .ownerAvatar(user.getAvatar())
  196. .type(collection.getType())
  197. .holdDays(collection.getHoldDays())
  198. .oldHoldDays(collection.getHoldDays())
  199. .source(AssetSource.OFFICIAL)
  200. .tags(new HashSet<>(collection.getTags()))
  201. .prefixName(collection.getPrefixName())
  202. .empower(collection.getEmpower())
  203. .build();
  204. }
  205. public static Asset create(BlindBoxItem item, User user, Integer holdDays) {
  206. return Asset.builder()
  207. .userId(user.getId())
  208. .collectionId(item.getCollectionId())
  209. .minter(item.getMinter())
  210. .minterId(item.getMinterId())
  211. .minterAvatar(item.getMinterAvatar())
  212. .name(item.getName())
  213. .detail(item.getDetail())
  214. .pic(item.getPic())
  215. .model3d(item.getModel3d())
  216. .properties(item.getProperties())
  217. .privileges(item.getPrivileges())
  218. .category(item.getCategory())
  219. .canResale(item.isCanResale())
  220. .royalties(item.getRoyalties())
  221. .serviceCharge(item.getServiceCharge())
  222. .price(item.getPrice())
  223. .status(AssetStatus.NORMAL)
  224. .owner(user.getNickname())
  225. .ownerId(user.getId())
  226. .ownerAvatar(user.getAvatar())
  227. .type(CollectionType.BLIND_BOX)
  228. .holdDays(holdDays)
  229. .oldHoldDays(holdDays)
  230. .source(AssetSource.OFFICIAL)
  231. .opened(false)
  232. .build();
  233. }
  234. }