AssetSuperimpositionService.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. package com.izouma.nineth.service;
  2. import com.izouma.nineth.domain.Asset;
  3. import com.izouma.nineth.domain.AssetSuperimposition;
  4. import com.izouma.nineth.dto.PageQuery;
  5. import com.izouma.nineth.enums.AssetOperationType;
  6. import com.izouma.nineth.enums.AssetShowStatus;
  7. import com.izouma.nineth.enums.CollectionType;
  8. import com.izouma.nineth.exception.BusinessException;
  9. import com.izouma.nineth.repo.AssetSuperimpositionRepo;
  10. import com.izouma.nineth.repo.CollectionRepo;
  11. import com.izouma.nineth.utils.JpaUtils;
  12. import lombok.AllArgsConstructor;
  13. import lombok.extern.slf4j.Slf4j;
  14. import org.apache.commons.lang3.StringUtils;
  15. import org.springframework.data.domain.Page;
  16. import org.springframework.stereotype.Service;
  17. import java.util.Objects;
  18. @Service
  19. @AllArgsConstructor
  20. @Slf4j
  21. public class AssetSuperimpositionService {
  22. private final int NUM = 1;
  23. private AssetSuperimpositionRepo assetSuperimpositionRepo;
  24. private CollectionRepo collectionRepo;
  25. public Page<AssetSuperimposition> all(PageQuery pageQuery) {
  26. return assetSuperimpositionRepo.findAll(JpaUtils.toSpecification(pageQuery, AssetSuperimposition.class), JpaUtils.toPageRequest(pageQuery));
  27. }
  28. /**
  29. * 调整各操作藏品叠加的数量信息
  30. *
  31. * @param asset 资产信息
  32. * @param type 操作类型
  33. * @param toUserId 相关用户id(买入人,被赠送人)
  34. */
  35. public void adjustNum(Asset asset, AssetOperationType type, Long toUserId) {
  36. AssetSuperimposition assetSuperimposition;
  37. if (asset.getType().equals(CollectionType.BLIND_BOX) && !asset.isOpened()) {
  38. assetSuperimposition = assetSuperimpositionRepo.findByBlindBoxAssetId(asset.getId()).orElse(null);
  39. if (Objects.isNull(assetSuperimposition) && !AssetOperationType.BUY.equals(type)) {
  40. throw new BusinessException("资产叠加表中没有该盲盒信息");
  41. }
  42. } else {
  43. assetSuperimposition = assetSuperimpositionRepo.findByUserIdAndPrefixName(asset.getUserId(), asset.getPrefixName()).orElse(null);
  44. }
  45. if (Objects.isNull(type)) {
  46. throw new BusinessException("操作类型不能为空");
  47. }
  48. if (StringUtils.isBlank(asset.getPrefixName())) {
  49. throw new BusinessException("prefixName不能为空");
  50. }
  51. if (Objects.isNull(asset.getUserId())) {
  52. throw new BusinessException("用户id不能为空");
  53. }
  54. if (Objects.isNull(assetSuperimposition)) {
  55. assetSuperimposition = new AssetSuperimposition(asset, asset.getUserId());
  56. }
  57. switch (type) {
  58. case OPEN_BLIND_BOX:
  59. log.info("调整{}数量 -> 开盲盒", asset.getId());
  60. AssetSuperimposition openBlindBox = assetSuperimpositionRepo.findByUserIdAndPrefixName(assetSuperimposition.getUserId(), assetSuperimposition.getPrefixName()).orElse(null);
  61. if (Objects.isNull(openBlindBox)) {
  62. openBlindBox = new AssetSuperimposition(asset, asset.getUserId());
  63. }
  64. openBlindBox.setAuctioningNum(openBlindBox.getAuctionedNum() + assetSuperimposition.getAuctionedNum());
  65. openBlindBox.setConsignmentNum(openBlindBox.getConsignmentNum() + assetSuperimposition.getConsignmentNum());
  66. openBlindBox.setNum(openBlindBox.getNum() + assetSuperimposition.getNum());
  67. openBlindBox.setCloseShowNum(openBlindBox.getCloseShowNum() + assetSuperimposition.getCloseShowNum());
  68. openBlindBox.setOpenShowNum(openBlindBox.getOpenShowNum() + assetSuperimposition.getOpenShowNum());
  69. setAssetStatus(openBlindBox);
  70. assetSuperimpositionRepo.save(openBlindBox);
  71. assetSuperimpositionRepo.deleteById(assetSuperimposition.getId());
  72. break;
  73. case OPEN:
  74. log.info("调整{}数量 -> 公开展示", asset.getId());
  75. if (!asset.isConsignment()) {
  76. assetSuperimposition.setCloseShowNum(assetSuperimposition.getCloseShowNum() - NUM);
  77. assetSuperimposition.setOpenShowNum(assetSuperimposition.getOpenShowNum() + NUM);
  78. }
  79. break;
  80. case CLOSE:
  81. log.info("调整{}数量 -> 关闭公开展示", asset.getId());
  82. if (!asset.isConsignment()) {
  83. assetSuperimposition.setCloseShowNum(assetSuperimposition.getCloseShowNum() + NUM);
  84. assetSuperimposition.setOpenShowNum(assetSuperimposition.getOpenShowNum() - NUM);
  85. }
  86. break;
  87. case CONSIGNMENT:
  88. log.info("调整{}数量 -> 寄售", asset.getId());
  89. publicShowOrFalseReduce(assetSuperimposition, asset);
  90. assetSuperimposition.setConsignmentNum(assetSuperimposition.getConsignmentNum() + NUM);
  91. break;
  92. case CANCEL_CONSIGNMENT:
  93. log.info("调整{}数量 -> 取消寄售", asset.getId());
  94. publicShowOrFalseAdd(assetSuperimposition, asset);
  95. assetSuperimposition.setConsignmentNum(assetSuperimposition.getConsignmentNum() - NUM);
  96. break;
  97. case CONSIGNMENT_SUCCESS:
  98. log.info("调整{}数量 -> 转让成功", asset.getId());
  99. assetSuperimposition.setNum(assetSuperimposition.getNum() - NUM);
  100. assetSuperimposition.setConsignmentNum(assetSuperimposition.getConsignmentNum() - NUM);
  101. relatedUserAdjustNum(toUserId, asset.getPrefixName(), asset);
  102. break;
  103. case AUCTIONING:
  104. log.info("调整{}数量 -> 拍卖", asset.getId());
  105. assetSuperimposition.setAuctioningNum(assetSuperimposition.getAuctionedNum() + NUM);
  106. break;
  107. case AUCTIONING_FAIL:
  108. log.info("调整{}数量 -> 拍卖失败/取消", asset.getId());
  109. assetSuperimposition.setAuctioningNum(assetSuperimposition.getAuctionedNum() - NUM);
  110. break;
  111. case AUCTIONING_SUCCESS:
  112. log.info("调整{}数量 -> 拍卖成功", asset.getId());
  113. assetSuperimposition.setNum(assetSuperimposition.getNum() - NUM);
  114. assetSuperimposition.setAuctioningNum(assetSuperimposition.getAuctionedNum() - NUM);
  115. publicShowOrFalseReduce(assetSuperimposition, asset);
  116. relatedUserAdjustNum(toUserId, asset.getPrefixName(), asset);
  117. break;
  118. case GIFTING:
  119. log.info("调整{}数量 -> 赠送", asset.getId());
  120. assetSuperimposition.setNum(assetSuperimposition.getNum() - NUM);
  121. publicShowOrFalseReduce(assetSuperimposition, asset);
  122. relatedUserAdjustNum(toUserId, asset.getPrefixName(), asset);
  123. break;
  124. case BUY:
  125. log.info("调整{}数量 -> 购买", asset.getId());
  126. assetSuperimposition.setNum(assetSuperimposition.getNum() + NUM);
  127. assetSuperimposition.setCloseShowNum(assetSuperimposition.getCloseShowNum() + NUM);
  128. break;
  129. case DESTORY:
  130. log.info("调整{}数量 -> 销毁", asset.getId());
  131. assetSuperimposition.setNum(assetSuperimposition.getNum() - NUM);
  132. assetSuperimposition.setCloseShowNum(assetSuperimposition.getCloseShowNum() - NUM);
  133. break;
  134. }
  135. setAssetStatus(assetSuperimposition);
  136. assetSuperimpositionRepo.save(assetSuperimposition);
  137. }
  138. /**
  139. * 当该分类下的资产数量为1的时候,添加相关状态
  140. *
  141. * @param assetSuperimposition
  142. */
  143. private void setAssetStatus(AssetSuperimposition assetSuperimposition) {
  144. if (assetSuperimposition.getNum() != 1) {
  145. return;
  146. }
  147. if (assetSuperimposition.getAuctioningNum() == 1) {
  148. assetSuperimposition.setAssetStatus(AssetShowStatus.AUCTIONING);
  149. return;
  150. }
  151. if (assetSuperimposition.getConsignmentNum() == 1) {
  152. assetSuperimposition.setAssetStatus(AssetShowStatus.CONSIGNMENT);
  153. return;
  154. }
  155. if (assetSuperimposition.getOpenShowNum() == 1) {
  156. assetSuperimposition.setAssetStatus(AssetShowStatus.OPEN_SHOW);
  157. }
  158. }
  159. /**
  160. * 根据藏品是否展示判断仅展示或未展示对应数量减去一
  161. *
  162. * @param assetSuperimposition 资产叠加数量信息
  163. * @param asset 资产信息
  164. * @return 资产叠加数量信息
  165. */
  166. private void publicShowOrFalseReduce(AssetSuperimposition assetSuperimposition, Asset asset) {
  167. if (asset.isPublicShow()) {
  168. assetSuperimposition.setOpenShowNum(assetSuperimposition.getOpenShowNum() - NUM);
  169. return;
  170. }
  171. assetSuperimposition.setCloseShowNum(assetSuperimposition.getCloseShowNum() - NUM);
  172. }
  173. /**
  174. * 根据藏品是否展示判断仅展示或未展示对应数量加一
  175. *
  176. * @param assetSuperimposition 资产叠加数量信息
  177. * @param asset 资产信息
  178. * @return 资产叠加数量信息
  179. */
  180. private void publicShowOrFalseAdd(AssetSuperimposition assetSuperimposition, Asset asset) {
  181. if (asset.isPublicShow()) {
  182. assetSuperimposition.setOpenShowNum(assetSuperimposition.getOpenShowNum() + NUM);
  183. return;
  184. }
  185. assetSuperimposition.setCloseShowNum(assetSuperimposition.getCloseShowNum() + NUM);
  186. }
  187. /**
  188. * 相关用户藏品叠加数量(买入人,被转增人等)
  189. *
  190. * @param toUserId 相关用户id
  191. * @param prefixName 叠加分类
  192. * @param asset 资产信息
  193. */
  194. private void relatedUserAdjustNum(Long toUserId, String prefixName, Asset asset) {
  195. AssetSuperimposition assetSuperimposition;
  196. if (Objects.isNull(toUserId)) {
  197. throw new BusinessException("涉及相关用户id为空");
  198. }
  199. if (asset.getType().equals(CollectionType.BLIND_BOX) && !asset.isOpened()) {
  200. AssetSuperimposition blindBoxAsset = assetSuperimpositionRepo.findByBlindBoxAssetId(asset.getId()).orElseThrow(new BusinessException("盲盒信息为空"));
  201. blindBoxAsset.setUserId(toUserId);
  202. blindBoxAsset.setCloseShowNum(NUM);
  203. blindBoxAsset.setNum(NUM);
  204. blindBoxAsset.setAuctioningNum(0);
  205. blindBoxAsset.setConsignmentNum(0);
  206. blindBoxAsset.setOpenShowNum(0);
  207. assetSuperimpositionRepo.save(blindBoxAsset);
  208. return;
  209. }
  210. assetSuperimposition = assetSuperimpositionRepo.findByUserIdAndPrefixName(toUserId, prefixName).orElse(null);
  211. if (Objects.isNull(assetSuperimposition)) {
  212. assetSuperimposition = new AssetSuperimposition(asset, toUserId);
  213. }
  214. assetSuperimposition.setNum(assetSuperimposition.getNum() + NUM);
  215. assetSuperimposition.setCloseShowNum(assetSuperimposition.getCloseShowNum() + NUM);
  216. assetSuperimpositionRepo.save(assetSuperimposition);
  217. }
  218. }