package com.izouma.nineth.service; import com.izouma.nineth.annotations.RedisLock; import com.izouma.nineth.config.Constants; import com.izouma.nineth.domain.Asset; import com.izouma.nineth.domain.UserAssetSummary; import com.izouma.nineth.dto.PageQuery; import com.izouma.nineth.enums.CollectionType; import com.izouma.nineth.repo.AssetRepo; import com.izouma.nineth.repo.MetaShowRoomAssetRepo; import com.izouma.nineth.repo.UserAssetSummaryRepo; import com.izouma.nineth.utils.JpaUtils; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.BeanUtils; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; import javax.transaction.Transactional; import java.util.ArrayList; import java.util.List; import java.util.Objects; @Service @AllArgsConstructor @Slf4j public class UserAssetSummaryService { private AssetRepo assetRepo; private UserAssetSummaryRepo userAssetSummaryRepo; private MetaShowRoomAssetRepo metaShowRoomAssetRepo; public Page all(PageQuery pageQuery) { return userAssetSummaryRepo.findAll(JpaUtils.toSpecification(pageQuery, UserAssetSummary.class), JpaUtils.toPageRequest(pageQuery)); } @Transactional @RedisLock("#userId") public void calculateNum(Long assetId, Long userId, Long companyId) { log.info("开始重新计算用户:{},companyId:{}的资产数量", userId, companyId); List userAssetSummaries = new ArrayList<>(); // 查询盲盒数量 List blindBoxAssets = assetRepo.findAllByUserIdAndTypeAndOpenedAndCompanyId(userId, CollectionType.BLIND_BOX, Boolean.FALSE, companyId); blindBoxAssets.forEach(asset -> { userAssetSummaries.add(new UserAssetSummary(asset)); }); // 查询非盲盒数量 List notBlindBoxAssets = userAssetSummaryRepo.find(userId, companyId); notBlindBoxAssets.forEach(userAssetSummary -> { UserAssetSummary newUserAssetSummary = new UserAssetSummary(); BeanUtils.copyProperties(userAssetSummary, newUserAssetSummary); newUserAssetSummary.setId(null); userAssetSummaries.add(newUserAssetSummary); }); List isExist = userAssetSummaryRepo.findByUserIdAndCompanyId(userId, companyId); if (CollectionUtils.isNotEmpty(isExist)) { userAssetSummaryRepo.deleteByUserIdAndCompanyId(userId, companyId); } userAssetSummaryRepo.saveAll(userAssetSummaries); // 如果资产状态为已转让,已销毁, 已转增, 已拍卖删除展厅中藏品 if (Objects.nonNull(assetId)) { Asset asset = assetRepo.findById(assetId).orElse(null); if (Objects.nonNull(asset)) { if (Constants.META_INOPERABLE_STATUS.contains(asset.getStatus())) { metaShowRoomAssetRepo.deleteByAssetId(asset.getId()); } } } } }