package cn.wisenergy.chnmuseum.party.web.controller; import cn.wisenergy.chnmuseum.party.common.dfs.FastDFSUtils; import cn.wisenergy.chnmuseum.party.common.enums.AuditStatusEnum; import cn.wisenergy.chnmuseum.party.common.enums.FileTypeEnum; import cn.wisenergy.chnmuseum.party.common.validator.groups.Add; import cn.wisenergy.chnmuseum.party.common.validator.groups.Update; import cn.wisenergy.chnmuseum.party.common.vo.GenericPageParam; import cn.wisenergy.chnmuseum.party.common.vo.VideoVo; import cn.wisenergy.chnmuseum.party.model.Asset; import cn.wisenergy.chnmuseum.party.model.AssetType; import cn.wisenergy.chnmuseum.party.model.CopyrightOwner; import cn.wisenergy.chnmuseum.party.service.AssetService; import cn.wisenergy.chnmuseum.party.service.AssetTypeService; import cn.wisenergy.chnmuseum.party.service.CopyrightOwnerService; import cn.wisenergy.chnmuseum.party.web.controller.base.BaseController; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.tobato.fastdfs.domain.fdfs.MetaData; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.constraints.NotNull; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; /** * <pre> * 视频 前端控制器 * </pre> * * @author Danny Lee * @since 2021-03-16 */ @Slf4j @RestController @RequestMapping("/asset") @Api(tags = {"视频接口"}) public class AssetController extends BaseController { @Resource private AssetService assetService; @Resource private CopyrightOwnerService copyrightOwnerService; @Resource private AssetTypeService assetTypeService; @PostMapping(value = "/save") @RequiresPermissions("asset:save") @ApiOperation(value = "添加视频", notes = "添加视频") public Map<String, Object> saveAsset(@Validated(value = {Add.class}) Asset asset) { final List<VideoVo> filesMetadata = new ArrayList<>(asset.getVideoUrlList().size()); final List<String> videoUrlList = asset.getVideoUrlList(); for (String videoUrl : videoUrlList) { final Set<MetaData> metaData = FastDFSUtils.getFileMetaData(videoUrl); String fileName = metaData.stream().filter(x -> "fileName".equals(x.getName())).map(MetaData::getValue).findFirst().get(); Long fileSize = metaData.stream().filter(x -> "fileSize".equals(x.getName())).map(MetaData::getValue).map(Long::parseLong).findFirst().get(); String fileExtName = metaData.stream().filter(x -> "fileExtName".equals(x.getName())).map(MetaData::getValue).findFirst().get(); String updateTime = metaData.stream().filter(x -> "updateTime".equals(x.getName())).map(MetaData::getValue).findFirst().get(); String md5 = metaData.stream().filter(x -> "MD5".equals(x.getName())).map(MetaData::getValue).findFirst().get(); filesMetadata.add(VideoVo.builder() .fileName(fileName) .fileType(FileTypeEnum.VIDEO.name()) .fileExtName(fileExtName) .fileSize(fileSize) .fileUrl(videoUrl) .updateTime(updateTime) .md5(md5).build()); } asset.setVideoUrl(JSONObject.toJSONString(filesMetadata)); asset.setAuditStatus(AuditStatusEnum.TBC.name()); asset.setPublished(false); // 保存业务节点信息 boolean result = assetService.save(asset); // 返回操作结果 if (result) { return getSuccessResult(); } return getFailResult(); } @PutMapping("/update") @RequiresPermissions("asset:update") @ApiOperation(value = "修改视频信息", notes = "修改视频信息") public Map<String, Object> updateAsset(@Validated(value = {Update.class}) Asset asset) { final List<VideoVo> filesMetadata = new ArrayList<>(asset.getVideoUrlList().size()); final List<String> videoUrlList = asset.getVideoUrlList(); for (String videoUrl : videoUrlList) { final Set<MetaData> metaData = FastDFSUtils.getFileMetaData(videoUrl); String fileName = metaData.stream().filter(x -> "fileName".equals(x.getName())).map(MetaData::getValue).findFirst().get(); Long fileSize = metaData.stream().filter(x -> "fileSize".equals(x.getName())).map(MetaData::getValue).map(Long::parseLong).findFirst().get(); String fileExtName = metaData.stream().filter(x -> "fileExtName".equals(x.getName())).map(MetaData::getValue).findFirst().get(); String updateTime = metaData.stream().filter(x -> "updateTime".equals(x.getName())).map(MetaData::getValue).findFirst().get(); String md5 = metaData.stream().filter(x -> "MD5".equals(x.getName())).map(MetaData::getValue).findFirst().get(); filesMetadata.add(VideoVo.builder() .fileName(fileName) .fileType(FileTypeEnum.VIDEO.name()) .fileExtName(fileExtName) .fileSize(fileSize) .fileUrl(videoUrl) .updateTime(updateTime) .md5(md5).build()); } asset.setVideoUrl(JSONObject.toJSONString(filesMetadata)); asset.setAuditStatus(AuditStatusEnum.TBC.name()); asset.setPublished(false); boolean flag = assetService.updateById(asset); if (flag) { return getSuccessResult(); } return getFailResult(); } @PutMapping("/updateAuditStatus/{id}") @RequiresPermissions("asset:update:audit:status") @ApiOperation(value = "更新视频审核状态", notes = "更新视频审核状态") @ApiImplicitParams(value = { @ApiImplicitParam(name = "id", value = "标识ID", dataType = "String", paramType = "path"), @ApiImplicitParam(name = "status", value = "状态", paramType = "query", dataType = "String") }) public Map<String, Object> updateStatus(@NotNull(message = "视频ID不能为空") @PathVariable("id") String id, @RequestParam("status") AuditStatusEnum status) { UpdateWrapper<Asset> updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("id", id); updateWrapper.eq("audit_status", status.name()); boolean flag = assetService.update(updateWrapper); if (flag) { return getSuccessResult(); } return getFailResult(); } @DeleteMapping("/delete/{id}") @RequiresPermissions("asset:delete") @ApiOperation(value = "根据ID删除视频", notes = "根据ID删除视频") @ApiImplicitParams(value = { @ApiImplicitParam(name = "id", value = "标识ID", paramType = "path", dataType = "String") }) public Map<String, Object> deleteAsset(@PathVariable("id") String id) { // asset.setAuditStatus(AuditStatusEnum.TBC.name()); // asset.setPublished(false); boolean result = assetService.removeById(id); if (result) { return getSuccessResult(); } return getFailResult(); } @GetMapping("/getList") @RequiresPermissions("asset:list") @ApiOperation(value = "获取视频全部列表(无分页)", notes = "获取视频全部列表(无分页)") @ApiImplicitParams(value = { @ApiImplicitParam(name = "auditStatus", value = "审核状态", paramType = "query", dataType = "String") }) public Map<String, Object> getAssetList(@RequestParam(value = "auditStatus", defaultValue = "APPROVED_FINAL", required = false) AuditStatusEnum auditStatus) { List<Asset> assetList = assetService.list(Wrappers.<Asset>lambdaQuery().eq(Asset::getAuditStatus, auditStatus.name()).eq(Asset::getPublished, true)); return getResult(assetList); } @ApiImplicitParams(value = { @ApiImplicitParam(name = "_index", value = "分页起始偏移量", paramType = "query", dataType = "Integer"), @ApiImplicitParam(name = "_size", value = "返回条数", paramType = "query", dataType = "Integer"), @ApiImplicitParam(name = "nameOrCode", value = "名称或编码", paramType = "query", dataType = "String"), @ApiImplicitParam(name = "assetTypeId", value = "视频分类ID", paramType = "query", dataType = "String"), @ApiImplicitParam(name = "assetCopyrightOwnerId", value = "视频版权方ID", paramType = "query", dataType = "String"), @ApiImplicitParam(name = "startDate", value = "创建时间-开始", paramType = "query", dataType = "String"), @ApiImplicitParam(name = "endDate", value = "创建时间-结束", paramType = "query", dataType = "String") }) @PostMapping("/getPageList") @RequiresPermissions("asset:page") @ApiOperation(value = "获取视频分页列表", notes = "获取视频分页列表") public Map<String, Object> getAssetPageList(GenericPageParam genericPageParam) { LambdaQueryWrapper<Asset> queryWrapper = new LambdaQueryWrapper<>(); // 对名称或编码模糊查询 if (StringUtils.isNotBlank(genericPageParam.getNameOrCode())) { queryWrapper.like(Asset::getName, genericPageParam.getNameOrCode()); } // 对版权方模糊查询 if (StringUtils.isNotBlank(genericPageParam.getAssetCopyrightOwnerId())) { queryWrapper.like(Asset::getAssetCopyrightOwnerId, genericPageParam.getAssetCopyrightOwnerId()); } // 对版权方模糊查询 if (StringUtils.isNotBlank(genericPageParam.getAssetTypeId())) { queryWrapper.like(Asset::getAssetTypeId, genericPageParam.getAssetTypeId()); } // 根据创建时间区间检索 if (genericPageParam.getStartDate() != null && genericPageParam.getEndDate() != null) { queryWrapper.ge(Asset::getCreateTime, genericPageParam.getStartDate().atTime(0, 0, 0)) .le(Asset::getCreateTime, genericPageParam.getEndDate().atTime(23, 59, 59)); } // 设置排序规则 queryWrapper.orderByDesc(Asset::getCreateTime); // 设置查询内容 queryWrapper.select( Asset::getId, Asset::getName, Asset::getAuditStatus, Asset::getPublished, Asset::getAssetTypeId, Asset::getAssetCopyrightOwnerId, Asset::getCreateTime, Asset::getUpdateTime); Page<Asset> page = this.assetService.page(getPage(), queryWrapper); for (Asset asset : page.getRecords()) { if (asset.getAssetTypeId() != null) { AssetType assetType = this.assetTypeService.getById(asset.getAssetTypeId()); asset.setAssetTypeName(assetType.getName()); } if (asset.getAssetCopyrightOwnerId() != null) { CopyrightOwner copyrightOwner = this.copyrightOwnerService.getById(asset.getAssetCopyrightOwnerId()); asset.setAssetCopyrightOwnerName(copyrightOwner.getName()); } } return getResult(page); } @ApiOperation(value = "获取视频详情", notes = "获取视频详情") @ApiImplicitParams({ @ApiImplicitParam(name = "id", value = "标识ID", dataType = "String", paramType = "path") }) @GetMapping("/get/{id}") @RequiresPermissions("asset:get:id") public Map<String, Object> getById(@PathVariable("id") String id) { Asset asset = assetService.getById(id); if (asset.getAssetTypeId() != null) { AssetType assetType = this.assetTypeService.getById(asset.getAssetTypeId()); if (assetType != null) { asset.setAssetTypeName(assetType.getName()); } } if (asset.getAssetCopyrightOwnerId() != null) { CopyrightOwner copyrightOwner = this.copyrightOwnerService.getById(asset.getAssetCopyrightOwnerId()); if (copyrightOwner != null) { asset.setAssetCopyrightOwnerName(copyrightOwner.getName()); } } return getResult(asset); } }