package com.izouma.nineth.service; import com.izouma.nineth.domain.Asset; import com.izouma.nineth.domain.AssetSuperimposition; import com.izouma.nineth.dto.PageQuery; import com.izouma.nineth.enums.AssetOperationType; import com.izouma.nineth.enums.AssetShowStatus; import com.izouma.nineth.enums.CollectionType; import com.izouma.nineth.exception.BusinessException; import com.izouma.nineth.repo.AssetSuperimpositionRepo; import com.izouma.nineth.repo.CollectionRepo; import com.izouma.nineth.utils.JpaUtils; 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 java.util.Objects; @Service @AllArgsConstructor @Slf4j public class AssetSuperimpositionService { private final int NUM = 1; private AssetSuperimpositionRepo assetSuperimpositionRepo; private CollectionRepo collectionRepo; public Page all(PageQuery pageQuery) { return assetSuperimpositionRepo.findAll(JpaUtils.toSpecification(pageQuery, AssetSuperimposition.class), JpaUtils.toPageRequest(pageQuery)); } /** * 调整各操作藏品叠加的数量信息 * * @param asset 资产信息 * @param type 操作类型 * @param toUserId 相关用户id(买入人,被赠送人) */ public void adjustNum(Asset asset, AssetOperationType type, Long toUserId) { AssetSuperimposition assetSuperimposition; if (asset.getType().equals(CollectionType.BLIND_BOX) && !asset.isOpened()) { assetSuperimposition = assetSuperimpositionRepo.findByBlindBoxAssetId(asset.getId()).orElse(null); if (Objects.isNull(assetSuperimposition) && !AssetOperationType.BUY.equals(type)) { throw new BusinessException("资产叠加表中没有该盲盒信息"); } } else { assetSuperimposition = assetSuperimpositionRepo.findByUserIdAndPrefixName(asset.getUserId(), asset.getPrefixName()).orElse(null); } if (Objects.isNull(type)) { throw new BusinessException("操作类型不能为空"); } if (StringUtils.isBlank(asset.getPrefixName())) { throw new BusinessException("prefixName不能为空"); } if (Objects.isNull(asset.getUserId())) { throw new BusinessException("用户id不能为空"); } if (Objects.isNull(assetSuperimposition)) { assetSuperimposition = new AssetSuperimposition(asset, asset.getUserId()); } switch (type) { case OPEN_BLIND_BOX: log.info("调整{}数量 -> 开盲盒", asset.getId()); AssetSuperimposition openBlindBox = assetSuperimpositionRepo.findByUserIdAndPrefixName(assetSuperimposition.getUserId(), assetSuperimposition.getPrefixName()).orElse(null); if (Objects.isNull(openBlindBox)) { openBlindBox = new AssetSuperimposition(asset, asset.getUserId()); } openBlindBox.setAuctioningNum(openBlindBox.getAuctionedNum() + assetSuperimposition.getAuctionedNum()); openBlindBox.setConsignmentNum(openBlindBox.getConsignmentNum() + assetSuperimposition.getConsignmentNum()); openBlindBox.setNum(openBlindBox.getNum() + assetSuperimposition.getNum()); openBlindBox.setCloseShowNum(openBlindBox.getCloseShowNum() + assetSuperimposition.getCloseShowNum()); openBlindBox.setOpenShowNum(openBlindBox.getOpenShowNum() + assetSuperimposition.getOpenShowNum()); setAssetStatus(openBlindBox); assetSuperimpositionRepo.save(openBlindBox); assetSuperimpositionRepo.deleteById(assetSuperimposition.getId()); break; case OPEN: log.info("调整{}数量 -> 公开展示", asset.getId()); if (!asset.isConsignment()) { assetSuperimposition.setCloseShowNum(assetSuperimposition.getCloseShowNum() - NUM); assetSuperimposition.setOpenShowNum(assetSuperimposition.getOpenShowNum() + NUM); } break; case CLOSE: log.info("调整{}数量 -> 关闭公开展示", asset.getId()); if (!asset.isConsignment()) { assetSuperimposition.setCloseShowNum(assetSuperimposition.getCloseShowNum() + NUM); assetSuperimposition.setOpenShowNum(assetSuperimposition.getOpenShowNum() - NUM); } break; case CONSIGNMENT: log.info("调整{}数量 -> 寄售", asset.getId()); publicShowOrFalseReduce(assetSuperimposition, asset); assetSuperimposition.setConsignmentNum(assetSuperimposition.getConsignmentNum() + NUM); break; case CANCEL_CONSIGNMENT: log.info("调整{}数量 -> 取消寄售", asset.getId()); publicShowOrFalseAdd(assetSuperimposition, asset); assetSuperimposition.setConsignmentNum(assetSuperimposition.getConsignmentNum() - NUM); break; case CONSIGNMENT_SUCCESS: log.info("调整{}数量 -> 转让成功", asset.getId()); assetSuperimposition.setNum(assetSuperimposition.getNum() - NUM); assetSuperimposition.setConsignmentNum(assetSuperimposition.getConsignmentNum() - NUM); relatedUserAdjustNum(toUserId, asset.getPrefixName(), asset); break; case AUCTIONING: log.info("调整{}数量 -> 拍卖", asset.getId()); assetSuperimposition.setAuctioningNum(assetSuperimposition.getAuctionedNum() + NUM); break; case AUCTIONING_FAIL: log.info("调整{}数量 -> 拍卖失败/取消", asset.getId()); assetSuperimposition.setAuctioningNum(assetSuperimposition.getAuctionedNum() - NUM); break; case AUCTIONING_SUCCESS: log.info("调整{}数量 -> 拍卖成功", asset.getId()); assetSuperimposition.setNum(assetSuperimposition.getNum() - NUM); assetSuperimposition.setAuctioningNum(assetSuperimposition.getAuctionedNum() - NUM); publicShowOrFalseReduce(assetSuperimposition, asset); relatedUserAdjustNum(toUserId, asset.getPrefixName(), asset); break; case GIFTING: log.info("调整{}数量 -> 赠送", asset.getId()); assetSuperimposition.setNum(assetSuperimposition.getNum() - NUM); publicShowOrFalseReduce(assetSuperimposition, asset); relatedUserAdjustNum(toUserId, asset.getPrefixName(), asset); break; case BUY: log.info("调整{}数量 -> 购买", asset.getId()); assetSuperimposition.setNum(assetSuperimposition.getNum() + NUM); assetSuperimposition.setCloseShowNum(assetSuperimposition.getCloseShowNum() + NUM); break; case DESTORY: log.info("调整{}数量 -> 销毁", asset.getId()); assetSuperimposition.setNum(assetSuperimposition.getNum() - NUM); assetSuperimposition.setCloseShowNum(assetSuperimposition.getCloseShowNum() - NUM); break; } setAssetStatus(assetSuperimposition); assetSuperimpositionRepo.save(assetSuperimposition); } /** * 当该分类下的资产数量为1的时候,添加相关状态 * * @param assetSuperimposition */ private void setAssetStatus(AssetSuperimposition assetSuperimposition) { if (assetSuperimposition.getNum() != 1) { return; } if (assetSuperimposition.getAuctioningNum() == 1) { assetSuperimposition.setAssetStatus(AssetShowStatus.AUCTIONING); return; } if (assetSuperimposition.getConsignmentNum() == 1) { assetSuperimposition.setAssetStatus(AssetShowStatus.CONSIGNMENT); return; } if (assetSuperimposition.getOpenShowNum() == 1) { assetSuperimposition.setAssetStatus(AssetShowStatus.OPEN_SHOW); } } /** * 根据藏品是否展示判断仅展示或未展示对应数量减去一 * * @param assetSuperimposition 资产叠加数量信息 * @param asset 资产信息 * @return 资产叠加数量信息 */ private void publicShowOrFalseReduce(AssetSuperimposition assetSuperimposition, Asset asset) { if (asset.isPublicShow()) { assetSuperimposition.setOpenShowNum(assetSuperimposition.getOpenShowNum() - NUM); return; } assetSuperimposition.setCloseShowNum(assetSuperimposition.getCloseShowNum() - NUM); } /** * 根据藏品是否展示判断仅展示或未展示对应数量加一 * * @param assetSuperimposition 资产叠加数量信息 * @param asset 资产信息 * @return 资产叠加数量信息 */ private void publicShowOrFalseAdd(AssetSuperimposition assetSuperimposition, Asset asset) { if (asset.isPublicShow()) { assetSuperimposition.setOpenShowNum(assetSuperimposition.getOpenShowNum() + NUM); return; } assetSuperimposition.setCloseShowNum(assetSuperimposition.getCloseShowNum() + NUM); } /** * 相关用户藏品叠加数量(买入人,被转增人等) * * @param toUserId 相关用户id * @param prefixName 叠加分类 * @param asset 资产信息 */ private void relatedUserAdjustNum(Long toUserId, String prefixName, Asset asset) { AssetSuperimposition assetSuperimposition; if (Objects.isNull(toUserId)) { throw new BusinessException("涉及相关用户id为空"); } if (asset.getType().equals(CollectionType.BLIND_BOX) && !asset.isOpened()) { AssetSuperimposition blindBoxAsset = assetSuperimpositionRepo.findByBlindBoxAssetId(asset.getId()).orElseThrow(new BusinessException("盲盒信息为空")); blindBoxAsset.setUserId(toUserId); blindBoxAsset.setCloseShowNum(NUM); blindBoxAsset.setNum(NUM); blindBoxAsset.setAuctioningNum(0); blindBoxAsset.setConsignmentNum(0); blindBoxAsset.setOpenShowNum(0); assetSuperimpositionRepo.save(blindBoxAsset); return; } assetSuperimposition = assetSuperimpositionRepo.findByUserIdAndPrefixName(toUserId, prefixName).orElse(null); if (Objects.isNull(assetSuperimposition)) { assetSuperimposition = new AssetSuperimposition(asset, toUserId); } assetSuperimposition.setNum(assetSuperimposition.getNum() + NUM); assetSuperimposition.setCloseShowNum(assetSuperimposition.getCloseShowNum() + NUM); assetSuperimpositionRepo.save(assetSuperimposition); } }