package com.izouma.nineth.service; import com.izouma.nineth.annotations.RedisLock; import com.izouma.nineth.config.GeneralProperties; import com.izouma.nineth.domain.Asset; import com.izouma.nineth.domain.PhotoAsset; import com.izouma.nineth.dto.PageQuery; import com.izouma.nineth.enums.CollectionStatus; import com.izouma.nineth.enums.OperationSource; import com.izouma.nineth.enums.*; import com.izouma.nineth.exception.BusinessException; import com.izouma.nineth.repo.AssetRepo; import com.izouma.nineth.repo.PhotoAssetRepo; import com.izouma.nineth.repo.UserRepo; import com.izouma.nineth.utils.JpaUtils; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.core.env.Environment; import org.springframework.data.annotation.Transient; import org.springframework.data.domain.Page; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; @Service @AllArgsConstructor @Slf4j public class PhotoAssetService { private PhotoAssetRepo photoAssetRepo; private AssetRepo assetRepo; private AssetService assetService; private UserRepo userRepo; private ContentAuditService contentAuditService; private GeneralProperties generalProperties; private Environment env; public Page all(PageQuery pageQuery) { return photoAssetRepo .findAll(JpaUtils.toSpecification(pageQuery, PhotoAsset.class), JpaUtils.toPageRequest(pageQuery)); } public PhotoAsset save(PhotoAsset record) { record.setStatus(CollectionStatus.PENDING); record.setOwnerId(record.getOwnerId()); record.setGifted(false); if (record.isDestroyed()) { //将选取的藏品取消上架 record.setOrderStatus(OrderStatus.NOT_PAID); // record.setPayMethod(PayMethod.DESTROY); Asset asset = assetService.cancelConsignmentAndStore(record.getDestroyAssetId()); record.setUserAvatar(asset.getOwnerAvatar()); record.setUserName(asset.getOwner()); record.setDestroyAssetName(asset.getName()); if (asset.getNumber() != null) { record.setDestroyAssetNumber(asset.getNumber().toString()); } if (asset.getPic() != null) { record.setDestroyAssetPicture(asset.getPic().get(0)); } } else { record.setOrderStatus(OrderStatus.NOT_PAID); } return photoAssetRepo.save(record); } public void pass(PhotoAsset photoAsset) { //销毁原来的藏品 if (photoAsset.isDestroyed()) { assetService.destroyWithoutTradeCode(photoAsset.getDestroyAssetId(), photoAsset.getUserId(), OperationSource.RAEX); } //生成新的藏品 if (photoAsset.getOrderStatus().equals(OrderStatus.FINISH)) { Long createId = assetService.createAsset(photoAsset, userRepo.findById(photoAsset.getUserId()) .orElseThrow(new BusinessException("无用户记录")), null, BigDecimal.ZERO, "星图", null, false).getId(); photoAsset.setStatus(CollectionStatus.SUCCESS); photoAsset.setCreateAssetId(createId); photoAsset.setOwnerId(photoAsset.getUserId()); photoAssetRepo.save(photoAsset); } } public void deny(Long id) { PhotoAsset photoAsset = photoAssetRepo.findById(id).orElseThrow(new BusinessException("无记录")); photoAsset.setStatus(CollectionStatus.FAIL); // Asset asset = assetRepo.findById(photoAsset.getDestroyAssetId()).orElseThrow(new BusinessException("无藏品记录")); // asset.setStatus(AssetStatus.NORMAL); // assetRepo.saveAndFlush(asset); assetService.destroyWithoutTradeCode(photoAsset.getDestroyAssetId(), photoAsset.getUserId(), OperationSource.RAEX);; photoAssetRepo.save(photoAsset); } @Scheduled(fixedRate = 60000) @RedisLock(value = "autoPictureAudit", expire = 30, unit = TimeUnit.MINUTES) public void autoValidate() { if (generalProperties.isNotifyServer()) return; if (Arrays.asList(env.getActiveProfiles()).contains("dev")) { return; } try { List list = photoAssetRepo .findAllByStatusAndOrderStatus(CollectionStatus.PENDING, OrderStatus.FINISH); list.parallelStream().forEach(this::imageAudit); } catch (Exception e) { log.error("批量图片审核出错", e); } } public void imageAudit(PhotoAsset photoAsset) { boolean result = contentAuditService.auditImage(photoAsset.getPic().getUrl()); if (!result) { photoAsset.setAuditResult("涉及色情性感内容或暴恐,需要人工审核."); photoAssetRepo.save(photoAsset); } else { pass(photoAsset); } } @Transient public void notify(Long id, PayMethod payMethod, String transactionId) { PhotoAsset photoAsset = photoAssetRepo.findById(id).orElseThrow(new BusinessException("未找到星图")); if (!photoAsset.getOrderStatus().equals(OrderStatus.NOT_PAID)) { throw new BusinessException("订单已经处理"); } photoAsset.setOrderStatus(OrderStatus.FINISH); photoAsset.setPayMethod(payMethod); photoAsset.setTransactionId(transactionId); photoAssetRepo.save(photoAsset); } // @Scheduled(fixedRate = 30000) // public void batchCancelPicOrder() { // List orders = photoAssetRepo // .findAllByOrderStatus(OrderStatus.NOT_PAID); // orders.parallelStream().forEach(o -> { // try { // PhotoAsset order = photoAssetRepo.findById(o.getId()).orElseThrow(new BusinessException("订单不存在")); // if (order.getOrderStatus() == OrderStatus.NOT_PAID) { // cancel(order); // } // } catch (Exception e) { // log.error("取消拍卖订单错误 " + o.getId(), e); // } // }); // } public void cancel(PhotoAsset photoAsset) { photoAsset.setOrderStatus(OrderStatus.CANCELLED); photoAsset.setStatus(CollectionStatus.FAIL); photoAssetRepo.save(photoAsset); } }