Asset.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  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.enums.MetaSize;
  13. import com.izouma.nineth.utils.CollectionTagSerializer;
  14. import io.swagger.annotations.ApiModel;
  15. import io.swagger.annotations.ApiModelProperty;
  16. import lombok.AllArgsConstructor;
  17. import lombok.Builder;
  18. import lombok.Data;
  19. import lombok.NoArgsConstructor;
  20. import org.hibernate.annotations.DynamicUpdate;
  21. import javax.persistence.*;
  22. import java.math.BigDecimal;
  23. import java.math.BigInteger;
  24. import java.time.LocalDateTime;
  25. import java.util.*;
  26. @Data
  27. @Entity
  28. @Table(indexes = {
  29. @Index(columnList = "userId"),
  30. @Index(columnList = "tokenId"),
  31. @Index(columnList = "collectionId"),
  32. @Index(columnList = "minterId"),
  33. @Index(columnList = "ownerId"),
  34. })
  35. @DynamicUpdate
  36. @AllArgsConstructor
  37. @NoArgsConstructor
  38. @Builder
  39. @ApiModel("资产")
  40. public class Asset extends CollectionBaseEntity {
  41. public interface View {
  42. interface Basic {
  43. }
  44. interface Detail {
  45. }
  46. }
  47. @ApiModelProperty("用户ID")
  48. private Long userId;
  49. @ApiModelProperty("藏品ID")
  50. private Long collectionId;
  51. @ApiModelProperty("订单ID")
  52. private Long orderId;
  53. @ApiModelProperty("编号")
  54. private Integer number;
  55. @ApiModelProperty("名称")
  56. @Searchable
  57. private String name;
  58. @ApiModelProperty("详情")
  59. @Column(columnDefinition = "TEXT")
  60. private String detail;
  61. @Column(columnDefinition = "TEXT")
  62. @Convert(converter = PropertyListConverter.class)
  63. @ApiModelProperty("特性")
  64. private List<CollectionProperty> properties;
  65. @Column(columnDefinition = "TEXT")
  66. @Convert(converter = PrivilegeListConverter.class)
  67. @ApiModelProperty("特权")
  68. private List<Privilege> privileges;
  69. @ApiModelProperty("分类")
  70. private String category;
  71. @ApiModelProperty("是否可转售")
  72. private boolean canResale;
  73. @ApiModelProperty("版税比例")
  74. private double royalties;
  75. @ApiModelProperty("手续费比例")
  76. private double serviceCharge;
  77. @ApiModelProperty("铸造者")
  78. @Searchable
  79. private String minter;
  80. @ApiModelProperty("铸造者ID")
  81. private Long minterId;
  82. @ApiModelProperty("铸造者头像")
  83. private String minterAvatar;
  84. @ApiModelProperty("持有者")
  85. @Searchable
  86. private String owner;
  87. @ApiModelProperty("持有者ID")
  88. private Long ownerId;
  89. @ApiModelProperty("持有者头像")
  90. private String ownerAvatar;
  91. @ApiModelProperty("图片")
  92. @Convert(converter = FileObjectListConverter.class)
  93. @Column(columnDefinition = "TEXT")
  94. private List<FileObject> pic;
  95. @Column(columnDefinition = "TEXT")
  96. @Convert(converter = FileObjectConverter.class)
  97. private FileObject model3d;
  98. @ApiModelProperty("tokenId")
  99. private String tokenId;
  100. @ApiModelProperty("tokenId")
  101. private String chainTokenId;
  102. @ApiModelProperty("购买hash")
  103. private String txHash;
  104. @ApiModelProperty("消耗gas")
  105. private BigInteger gasUsed;
  106. @ApiModelProperty("区块高度")
  107. private BigInteger blockNumber;
  108. @ApiModelProperty("ipfs地址")
  109. private String ipfsUrl;
  110. @ApiModelProperty("购买价格")
  111. @Column(precision = 10, scale = 2)
  112. private BigDecimal price;
  113. @ApiModelProperty("转让价格")
  114. @Column(precision = 10, scale = 2)
  115. private BigDecimal sellPrice;
  116. @ApiModelProperty("转让hash")
  117. private String outTxHash;
  118. @ApiModelProperty("转让订单ID")
  119. private Long outOrderId;
  120. @ApiModelProperty("状态")
  121. @Enumerated(EnumType.STRING)
  122. private AssetStatus status;
  123. @ApiModelProperty("是否公开展示")
  124. private boolean publicShow;
  125. @ApiModelProperty("是否寄售")
  126. private boolean consignment;
  127. private Long publicCollectionId;
  128. private int likes;
  129. private Long fromAssetId;
  130. //地块ID
  131. private Long oasisId;
  132. private Long raceId;
  133. private Long groupId;
  134. private Long itemId;
  135. @ApiModelProperty("类型")
  136. @Enumerated(EnumType.STRING)
  137. private CollectionType type;
  138. @ApiModelProperty("持有几天")
  139. private Integer holdDays;
  140. @ApiModelProperty("持有几天")
  141. private Integer oldHoldDays;
  142. // @ApiModelProperty("vip权利")
  143. // private Boolean vip;
  144. @ApiModelProperty("来源")
  145. @Enumerated(EnumType.STRING)
  146. @Column(length = 20)
  147. private AssetSource source = AssetSource.OFFICIAL;
  148. // @Transient
  149. @Column(columnDefinition = "tinyint unsigned default 1")
  150. private boolean opened = true;
  151. @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.MERGE})
  152. @JoinTable(
  153. name = "asset_tag",
  154. joinColumns = {@JoinColumn(name = "asset_id", referencedColumnName = "id", foreignKey = @ForeignKey(
  155. foreignKeyDefinition = "FOREIGN KEY (asset_id) REFERENCES asset(id) ON DELETE CASCADE"))},
  156. inverseJoinColumns = {@JoinColumn(name = "tag_id", referencedColumnName = "id", foreignKey = @ForeignKey(
  157. foreignKeyDefinition = "FOREIGN KEY (tag_id) REFERENCES tag(id) ON DELETE CASCADE"
  158. ))})
  159. @JsonSerialize(using = CollectionTagSerializer.class, as = HashSet.class)
  160. @JsonView(View.Detail.class)
  161. private Set<Tag> tags = new HashSet<>();
  162. private String hcTxHash;
  163. private BigInteger hcBlockNumber;
  164. private BigInteger hcGasUsed;
  165. private String hcTokenId;
  166. @Column(columnDefinition = "bit(1) default 0")
  167. private boolean safeFlag;
  168. private String prefixName;
  169. @ApiModelProperty("赋能列表")
  170. @Column(columnDefinition = "TEXT")
  171. private String empower;
  172. private LocalDateTime lockAt;
  173. private LocalDateTime lockTo;
  174. @Column(columnDefinition = "bigint default 1 not null")
  175. private Long companyId;
  176. @ApiModelProperty("bit 0: 蚂蚁链, bit 1: 华储链")
  177. @Column(columnDefinition = "int default 3 not null")
  178. private int chainFlag;
  179. @Transient
  180. private LocalDateTime endTime;
  181. @Transient
  182. @ApiModelProperty("元宇宙展厅是否上架")
  183. private boolean metaPutOn;
  184. @ApiModelProperty("元宇宙尺寸")
  185. @Enumerated(EnumType.STRING)
  186. private MetaSize metaSize;
  187. public static Asset create(Collection collection, User user) {
  188. Set<Tag> tags;
  189. if (collection.getTags() != null) {
  190. if (collection.getTags().size() > 0) {
  191. tags = new HashSet<>(collection.getTags());
  192. } else {
  193. tags = new HashSet<>();
  194. }
  195. } else {
  196. tags = new HashSet<>();
  197. }
  198. return Asset.builder()
  199. .userId(user.getId())
  200. .collectionId(collection.getId())
  201. .minter(collection.getMinter())
  202. .minterId(collection.getMinterId())
  203. .minterAvatar(collection.getMinterAvatar())
  204. .name(collection.getName())
  205. .detail(collection.getDetail())
  206. .pic(collection.getPic())
  207. .model3d(collection.getModel3d())
  208. .properties(collection.getProperties())
  209. .privileges(collection.getPrivileges())
  210. .category(collection.getCategory())
  211. .canResale(collection.isCanResale())
  212. .royalties(collection.getRoyalties())
  213. .serviceCharge(collection.getServiceCharge())
  214. .price(collection.getPrice())
  215. .status(AssetStatus.NORMAL)
  216. .owner(user.getNickname())
  217. .ownerId(user.getId())
  218. .ownerAvatar(user.getAvatar())
  219. .type(collection.getType())
  220. .holdDays(collection.getHoldDays())
  221. .oldHoldDays(collection.getHoldDays())
  222. .source(AssetSource.OFFICIAL)
  223. .tags(tags)
  224. .prefixName(collection.getPrefixName())
  225. .empower(collection.getEmpower())
  226. .companyId(collection.getCompanyId())
  227. .chainFlag(collection.getChainFlag())
  228. .metaSize(collection.getMetaSize())
  229. .build();
  230. }
  231. public static Asset create(BlindBoxItem item, User user, Integer holdDays) {
  232. return Asset.builder()
  233. .userId(user.getId())
  234. .collectionId(item.getCollectionId())
  235. .minter(item.getMinter())
  236. .minterId(item.getMinterId())
  237. .minterAvatar(item.getMinterAvatar())
  238. .name(item.getName())
  239. .detail(item.getDetail())
  240. .pic(item.getPic())
  241. .model3d(item.getModel3d())
  242. .properties(item.getProperties())
  243. .privileges(item.getPrivileges())
  244. .category(item.getCategory())
  245. .canResale(item.isCanResale())
  246. .royalties(item.getRoyalties())
  247. .serviceCharge(item.getServiceCharge())
  248. .price(item.getPrice())
  249. .status(AssetStatus.NORMAL)
  250. .owner(user.getNickname())
  251. .ownerId(user.getId())
  252. .ownerAvatar(user.getAvatar())
  253. .type(CollectionType.BLIND_BOX)
  254. .holdDays(holdDays)
  255. .oldHoldDays(holdDays)
  256. .source(AssetSource.OFFICIAL)
  257. .opened(false)
  258. .companyId(item.getCollection().getCompanyId())
  259. .chainFlag(item.getCollection().getChainFlag())
  260. .build();
  261. }
  262. public static Asset create(PhotoAsset photoAsset, User user) {
  263. return Asset.builder()
  264. .userId(user.getId())
  265. .collectionId(photoAsset.getId())
  266. .minter(user.getNickname())
  267. .minterId(user.getId())
  268. .minterAvatar(user.getAvatar())
  269. .name(photoAsset.getPicName())
  270. .detail(photoAsset.getPicDesc())
  271. .pic(Collections.singletonList(photoAsset.getPic()))
  272. .model3d(null)
  273. .category("星图")
  274. .canResale(false)
  275. .royalties(0)
  276. .serviceCharge(0)
  277. .price(BigDecimal.ZERO)
  278. .status(AssetStatus.NORMAL)
  279. .owner(user.getNickname())
  280. .ownerId(user.getId())
  281. .ownerAvatar(user.getAvatar())
  282. .type(CollectionType.PICTURE)
  283. .holdDays(null)
  284. .oldHoldDays(null)
  285. .source(AssetSource.OFFICIAL)
  286. .companyId(1L)
  287. .chainFlag(2)
  288. .build();
  289. }
  290. public static Asset create(DomainOrder domainOrder, User user) {
  291. return Asset.builder()
  292. .userId(user.getId())
  293. .collectionId(domainOrder.getId())
  294. .minter(user.getNickname())
  295. .minterId(user.getId())
  296. .minterAvatar(user.getAvatar())
  297. .name("RID元宇宙域名 " + domainOrder.getDomainName())
  298. .pic(domainOrder.getPic())
  299. .model3d(null)
  300. .category("元域名")
  301. .canResale(false)
  302. .royalties(0)
  303. .serviceCharge(0)
  304. .price(BigDecimal.ZERO)
  305. .status(AssetStatus.NORMAL)
  306. .owner(user.getNickname())
  307. .ownerId(user.getId())
  308. .ownerAvatar(user.getAvatar())
  309. .type(CollectionType.DOMAIN)
  310. .holdDays(null)
  311. .oldHoldDays(null)
  312. .source(AssetSource.OFFICIAL)
  313. .companyId(1L)
  314. .chainFlag(2)
  315. .build();
  316. }
  317. public static Asset create(TradeAuction tradeAuction, User user) {
  318. return Asset.builder()
  319. .userId(user.getId())
  320. .collectionId(tradeAuction.getId())
  321. .minter(tradeAuction.getMinter())
  322. .minterId(Long.valueOf(tradeAuction.getMinterId()))
  323. .minterAvatar(tradeAuction.getMinterAvatar())
  324. .name(tradeAuction.getName())
  325. .pic(tradeAuction.getPic())
  326. .model3d(null)
  327. .category("易拍")
  328. .canResale(true)
  329. .privileges(tradeAuction.getPrivileges())
  330. .properties(tradeAuction.getProperties())
  331. .royalties(tradeAuction.getRoyalties())
  332. .serviceCharge(0)
  333. .price(tradeAuction.getRecommendPrice())
  334. .status(AssetStatus.NORMAL)
  335. .owner(user.getNickname())
  336. .ownerId(user.getId())
  337. .ownerAvatar(user.getAvatar())
  338. .type(CollectionType.DEFAULT)
  339. .holdDays(null)
  340. .oldHoldDays(null)
  341. .source(AssetSource.OFFICIAL)
  342. .companyId(1L)
  343. .chainFlag(2)
  344. .build();
  345. }
  346. }