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.Collection; import com.izouma.nineth.domain.IdentityAuth; import com.izouma.nineth.domain.PhotoAsset; import com.izouma.nineth.dto.PageQuery; import com.izouma.nineth.enums.AssetStatus; import com.izouma.nineth.enums.AuthStatus; import com.izouma.nineth.enums.CollectionStatus; 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 com.izouma.nineth.utils.ObjUtils; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.core.env.Environment; 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.Map; 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) { //将选取的藏品取消上架 Asset asset = assetService.cancelConsignmentAndStore(record.getDestroyAssetId()); record.setStatus(CollectionStatus.PENDING); record.setUserAvatar(asset.getOwnerAvatar()); record.setUserName(asset.getOwner()); record.setDestroyAssetName(asset.getName()); if (asset.getNumber() != null) { record.setDestroyAssetNumber(asset.getNumber().toString()); } return photoAssetRepo.save(record); } public void pass(PhotoAsset photoAsset) { //销毁原来的藏品 assetService.destroyWithoutTradecode(photoAsset.getDestroyAssetId(), photoAsset.getUserId()); //生成新的藏品 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); 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); 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.findAllByStatusAndAuditResultNotNull(CollectionStatus.PENDING); 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); } } }