package com.izouma.nineth.service; import com.izouma.nineth.config.Constants; import com.izouma.nineth.domain.Asset; import com.izouma.nineth.domain.MetaAccessories; import com.izouma.nineth.domain.MetaAccessoriesPurchaseRecord; import com.izouma.nineth.domain.MetaUserGold; import com.izouma.nineth.dto.MetaRestResult; import com.izouma.nineth.dto.PageQuery; import com.izouma.nineth.enums.MetaPurchaseMethodEnum; import com.izouma.nineth.repo.AssetRepo; import com.izouma.nineth.repo.MetaAccessoriesPurchaseRecordRepo; import com.izouma.nineth.repo.MetaAccessoriesRepo; import com.izouma.nineth.utils.JpaUtils; import com.izouma.nineth.web.MetaUserGoldController; import lombok.AllArgsConstructor; import org.apache.commons.collections.CollectionUtils; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; import javax.transaction.Transactional; import java.util.List; import java.util.Objects; @Service @AllArgsConstructor public class MetaAccessoriesService { private MetaAccessoriesRepo metaAccessoriesRepo; private MetaAccessoriesPurchaseRecordRepo metaAccessoriesPurchaseRecordRepo; private MetaUserGoldService metaUserGoldService; private MetaUserGoldController metaUserGoldController; private AssetRepo assetRepo; public Page all(PageQuery pageQuery) { return metaAccessoriesRepo.findAll(JpaUtils.toSpecification(pageQuery, MetaAccessories.class), JpaUtils.toPageRequest(pageQuery)); } @Transactional public MetaRestResult purchase(Long userId, List metaAccessoriesIds) { List exist = metaAccessoriesPurchaseRecordRepo.findByUserIdAndMetaAccessoriesIdIn(userId, metaAccessoriesIds); if (CollectionUtils.isNotEmpty(exist)) { return MetaRestResult.returnError("部分配饰已经购买过,请重新选择配饰!"); } int total = 0; for (Long id : metaAccessoriesIds) { MetaAccessories metaAccessories = metaAccessoriesRepo.findByIdAndDel(id, false); if (Objects.isNull(metaAccessories)) { return MetaRestResult.returnError(String.format("id:[%S]的配饰信息不存在!", id)); } if (!MetaPurchaseMethodEnum.GOLD.equals(metaAccessories.getPurchaseMethod())) { return MetaRestResult.returnError(String.format("当前配饰[%S]不允许金币购买!", id)); } total = total + metaAccessories.getPrice(); } MetaRestResult restResultForNum = metaUserGoldController.queryGoldNum(userId); if (Constants.MetaRestCode.success != restResultForNum.getCode()) { return MetaRestResult.returnError(restResultForNum.getMessage()); } if (total > restResultForNum.getData()) { return MetaRestResult.returnError(String.format("金币不足:当前配饰总共需要金币[%S]个,当前用户剩余金币[%S]个", total, restResultForNum.getData())); } MetaRestResult restResult = metaUserGoldService.changeNum(userId, -total, String.format("玩家[%S]购买配饰[%S],支出[%S]个金币", userId, metaAccessoriesIds, total)); if (Constants.MetaRestCode.success != restResult.getCode()) { return MetaRestResult.returnError(restResult.getMessage()); } metaAccessoriesIds.forEach(id -> { metaAccessoriesPurchaseRecordRepo.save(new MetaAccessoriesPurchaseRecord(userId, id)); }); return MetaRestResult.returnSuccess("购买成功", restResult.getData().getNum()); } public MetaRestResult> hold(Long userId) { List list = metaAccessoriesRepo.findByDel(false); if (CollectionUtils.isEmpty(list)) { return MetaRestResult.returnError("当前未配置任何配饰!"); } list.forEach(metaAccessories -> { if (MetaPurchaseMethodEnum.GOLD.equals(metaAccessories.getPurchaseMethod())) { MetaAccessoriesPurchaseRecord metaAccessoriesPurchaseRecord = metaAccessoriesPurchaseRecordRepo.findByUserIdAndMetaAccessoriesId(userId, metaAccessories.getId()); if (Objects.nonNull(metaAccessoriesPurchaseRecord)) { metaAccessories.setHold(true); } } if (MetaPurchaseMethodEnum.NFT.equals(metaAccessories.getPurchaseMethod())) { List assets = assetRepo .findAllByUserIdAndStatusInAndNameLike(userId, Constants.META_NORMAL_STATUS, "%" + metaAccessories .getCollectionName() + "%"); metaAccessories.setHold(CollectionUtils.isNotEmpty(assets)); } }); return MetaRestResult.returnSuccess(list); } }