package cn.wisenergy.chnmuseum.party.web.controller; import cn.wisenergy.chnmuseum.party.common.dfs.FastDFSUtils; import cn.wisenergy.chnmuseum.party.common.enums.AuditOperationEnum; import cn.wisenergy.chnmuseum.party.common.enums.AuditStatusEnum; import cn.wisenergy.chnmuseum.party.common.enums.AuditTypeEnum; 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.AudioVo; 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.Audit; import cn.wisenergy.chnmuseum.party.model.ExhibitionBoard; import cn.wisenergy.chnmuseum.party.service.*; import cn.wisenergy.chnmuseum.party.web.controller.base.BaseController; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; import com.alibaba.fastjson.parser.Feature; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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; import java.util.stream.Collectors; /** * <pre> * 展板 前端控制器 * </pre> * * @author Danny Lee * @since 2021-03-19 */ @Slf4j @RestController @RequestMapping("/exhibitionBoard") @Api(tags = {"展板操作接口"}) public class ExhibitionBoardController extends BaseController { @Resource private ExhibitionBoardService exhibitionBoardService; @Resource private ExhibitionBoardCatService exhibitionBoardCatService; @Resource private CopyrightOwnerService copyrightOwnerService; @Resource private AuditService auditService; @Resource private AssetService assetService; @PostMapping("/save") @RequiresPermissions("exhibition:board:save") @ApiOperation(value = "添加展板", notes = "添加展板") public Map<String, Object> saveExhibitionBoard(@Validated(value = {Add.class}) ExhibitionBoard exhibitionBoard) { final List<AudioVo> filesMetadata = new ArrayList<>(exhibitionBoard.getAudioUrlList().size()); final List<String> audioUrlList = exhibitionBoard.getAudioUrlList(); for (String audioUrl : audioUrlList) { final Set<MetaData> metaData = FastDFSUtils.getFileMetaData(audioUrl); 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(); filesMetadata.add(AudioVo.builder() .fileName(fileName) .fileType(FileTypeEnum.AUDIO.name()) .fileExtName(fileExtName) .fileSize(fileSize) .fileUrl(audioUrl) .updateTime(updateTime) .build()); } exhibitionBoard.setGuideAudioUrl(JSONObject.toJSONString(filesMetadata)); filesMetadata.clear(); final List<String> materialUrlList = exhibitionBoard.getMaterialUrlList(); for (String materialUrl : materialUrlList) { // 原始文件名 final Set<MetaData> metaData = FastDFSUtils.getFileMetaData(materialUrl); 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(); filesMetadata.add(AudioVo.builder() .fileName(fileName) .fileType(FileTypeEnum.DATUM.name()) .fileExtName(fileExtName) .fileSize(fileSize) .fileUrl(materialUrl) .updateTime(updateTime) .build()); } exhibitionBoard.setRefMaterialUrl(JSONObject.toJSONString(filesMetadata)); exhibitionBoard.setAuditStatus(AuditStatusEnum.TBC.name()); exhibitionBoard.setPublished(false); // 保存业务节点信息 boolean result = exhibitionBoardService.save(exhibitionBoard); // 返回操作结果 if (result) { final Audit audit = Audit.builder().content("") .isDeleted(false) .operation(AuditOperationEnum.ADD.name()) .refItemId(exhibitionBoard.getId()) .status(AuditStatusEnum.TBC.name()) .type(AuditTypeEnum.EXHIBITION_BOARD.name()).build(); this.auditService.save(audit); return getSuccessResult(); } else { // 保存失败 return getFailResult(); } } @PutMapping("/update") @RequiresPermissions("exhibition:board:update") @ApiOperation(value = "修改展板信息", notes = "修改展板信息") public Map<String, Object> updateExhibitionBoard(@Validated(value = {Update.class}) ExhibitionBoard exhibitionBoard) { final List<AudioVo> filesMetadata = new ArrayList<>(exhibitionBoard.getAudioUrlList().size()); final List<String> audioUrlList = exhibitionBoard.getAudioUrlList(); for (String audioUrl : audioUrlList) { final Set<MetaData> metaData = FastDFSUtils.getFileMetaData(audioUrl); 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(); filesMetadata.add(AudioVo.builder() .fileName(fileName) .fileType(FileTypeEnum.AUDIO.name()) .fileExtName(fileExtName) .fileSize(fileSize) .fileUrl(audioUrl) .updateTime(updateTime) .build()); } exhibitionBoard.setGuideAudioUrl(JSONObject.toJSONString(filesMetadata)); filesMetadata.clear(); final List<String> materialUrlList = exhibitionBoard.getMaterialUrlList(); for (String materialUrl : materialUrlList) { // 原始文件名 final Set<MetaData> metaData = FastDFSUtils.getFileMetaData(materialUrl); 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(); filesMetadata.add(AudioVo.builder() .fileName(fileName) .fileType(FileTypeEnum.DATUM.name()) .fileExtName(fileExtName) .fileSize(fileSize) .fileUrl(materialUrl) .updateTime(updateTime) .build()); } exhibitionBoard.setRefMaterialUrl(JSONObject.toJSONString(filesMetadata)); exhibitionBoard.setAuditStatus(AuditStatusEnum.TBC.name()); exhibitionBoard.setPublished(false); boolean flag = exhibitionBoardService.updateById(exhibitionBoard); if (flag) { final Audit audit = Audit.builder().content("") .isDeleted(false) .operation(AuditOperationEnum.EDIT.name()) .refItemId(exhibitionBoard.getId()) .status(AuditStatusEnum.TBC.name()) .type(AuditTypeEnum.EXHIBITION_BOARD.name()) .build(); this.auditService.save(audit); return getSuccessResult(); } return getFailResult(); } @PutMapping("/updateAuditStatus/{id}") @RequiresPermissions("exhibition:board: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) { ExhibitionBoard exhibitionBoard = new ExhibitionBoard(); exhibitionBoard.setId(id); exhibitionBoard.setAuditStatus(status.name()); boolean flag = exhibitionBoardService.updateById(exhibitionBoard); if (flag) { return getSuccessResult(); } return getFailResult(); } @DeleteMapping("/delete/{id}") @RequiresPermissions("exhibition:board:delete") @ApiOperation(value = "根据ID删除展板", notes = "根据ID删除展板") @ApiImplicitParams(value = { @ApiImplicitParam(name = "id", value = "标识ID", paramType = "path", dataType = "String") }) public Map<String, Object> deleteExhibitionBoard(@PathVariable("id") String id) { final Audit audit = Audit.builder().content("") .isDeleted(false) .operation(AuditOperationEnum.REMOVE.name()) .refItemId(id) .status(AuditStatusEnum.TBC.name()) .type(AuditTypeEnum.EXHIBITION_BOARD.name()) .build(); final boolean result = this.auditService.save(audit); if (result) { return getSuccessResult(); } return getFailResult(); } @GetMapping("/getList") @RequiresPermissions("exhibition:board:list") @ApiOperation(value = "获取展板全部列表(无分页)", notes = "获取展板全部列表(无分页)") @ApiImplicitParams(value = { @ApiImplicitParam(name = "auditStatus", value = "审核状态", paramType = "query", dataType = "String") }) public Map<String, Object> getExhibitionBoardList( @RequestParam(value = "exhibitionBoardCatIdList", required = false) List<String> exhibitionBoardCatIdList, @RequestParam(value = "boardCopyrightOwnerIdList", required = false) List<String> boardCopyrightOwnerIdList, @RequestParam(value = "auditStatus", defaultValue = "APPROVED_FINAL", required = false) AuditStatusEnum auditStatus) { final LambdaQueryWrapper<ExhibitionBoard> lambdaQueryWrapper = Wrappers.<ExhibitionBoard>lambdaQuery().eq(ExhibitionBoard::getAuditStatus, auditStatus.name()).eq(ExhibitionBoard::getPublished, true); if (exhibitionBoardCatIdList != null && !exhibitionBoardCatIdList.isEmpty()) { lambdaQueryWrapper.in(ExhibitionBoard::getExhibitionBoardCatId, exhibitionBoardCatIdList); } if (boardCopyrightOwnerIdList != null && !boardCopyrightOwnerIdList.isEmpty()) { lambdaQueryWrapper.in(ExhibitionBoard::getBoardCopyrightOwnerId, boardCopyrightOwnerIdList); } List<ExhibitionBoard> exhibitionBoardList = exhibitionBoardService.list(); for (ExhibitionBoard exhibitionBoard : exhibitionBoardList) { if (exhibitionBoard.getAssetCopyrightOwnerId() != null) { String name = this.copyrightOwnerService.getById(exhibitionBoard.getAssetCopyrightOwnerId()).getName(); exhibitionBoard.setBoardCopyrightOwnerName(name); } if (exhibitionBoard.getExhibitionBoardCatId() != null) { String name = this.exhibitionBoardCatService.getById(exhibitionBoard.getExhibitionBoardCatId()).getName(); exhibitionBoard.setExhibitionBoardCatName(name); } } return getResult(exhibitionBoardList); } @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 = "copyrightOwner", value = "版权方", paramType = "query", dataType = "String"), @ApiImplicitParam(name = "startDate", value = "创建时间-开始", paramType = "query", dataType = "String"), @ApiImplicitParam(name = "endDate", value = "创建时间-结束", paramType = "query", dataType = "String") }) @PostMapping("/getPageList") @RequiresPermissions("exhibition:board:page") @ApiOperation(value = "获取展板分页列表", notes = "获取展板分页列表") public Map<String, Object> getExhibitionBoardPageList(GenericPageParam genericPageParam) { LambdaQueryWrapper<ExhibitionBoard> queryWrapper = new LambdaQueryWrapper<>(); // 对名称或编码模糊查询 if (StringUtils.isNotBlank(genericPageParam.getNameOrCode())) { queryWrapper.like(ExhibitionBoard::getName, genericPageParam.getNameOrCode()); } // 对版权方模糊查询 if (StringUtils.isNotBlank(genericPageParam.getBoardCopyrightOwnerId())) { queryWrapper.like(ExhibitionBoard::getAssetCopyrightOwnerId, genericPageParam.getBoardCopyrightOwnerId()); } // 根据创建时间区间检索 if (genericPageParam.getStartDate() != null && genericPageParam.getEndDate() != null) { queryWrapper.ge(ExhibitionBoard::getCreateTime, genericPageParam.getStartDate().atTime(0, 0, 0)) .le(ExhibitionBoard::getCreateTime, genericPageParam.getEndDate().atTime(23, 59, 59)); } // 设置排序规则 queryWrapper.orderByDesc(ExhibitionBoard::getCreateTime); // 设置查询内容 queryWrapper.select( ExhibitionBoard::getId, ExhibitionBoard::getName, ExhibitionBoard::getAuditStatus, ExhibitionBoard::getPublished, ExhibitionBoard::getAssetCopyrightOwnerId, ExhibitionBoard::getExhibitionBoardCatId, ExhibitionBoard::getCreateTime, ExhibitionBoard::getUpdateTime); Page<ExhibitionBoard> page = this.exhibitionBoardService.page(getPage(), queryWrapper); for (ExhibitionBoard exhibitionBoard : page.getRecords()) { if (exhibitionBoard.getAssetCopyrightOwnerId() != null) { String name = this.copyrightOwnerService.getById(exhibitionBoard.getAssetCopyrightOwnerId()).getName(); exhibitionBoard.setBoardCopyrightOwnerName(name); } if (exhibitionBoard.getExhibitionBoardCatId() != null) { String name = this.exhibitionBoardCatService.getById(exhibitionBoard.getExhibitionBoardCatId()).getName(); exhibitionBoard.setExhibitionBoardCatName(name); } } return getResult(page); } @ApiOperation(value = "获取展板详情", notes = "获取展板详情") @ApiImplicitParams({ @ApiImplicitParam(name = "id", value = "标识ID", dataType = "String", paramType = "path") }) @GetMapping("/get/{id}") @RequiresPermissions("exhibition:board:get:id") public Map<String, Object> getById(@PathVariable("id") String id) { ExhibitionBoard exhibitionBoard = exhibitionBoardService.getById(id); String exhibitionBoardCatId = exhibitionBoard.getExhibitionBoardCatId(); if (exhibitionBoardCatId != null) { exhibitionBoard.setExhibitionBoardCatName(this.exhibitionBoardCatService.getById(exhibitionBoardCatId).getName()); } String boardCopyrightOwnerId = exhibitionBoard.getBoardCopyrightOwnerId(); if (boardCopyrightOwnerId != null) { exhibitionBoard.setBoardCopyrightOwnerName(this.copyrightOwnerService.getById(boardCopyrightOwnerId).getName()); } final String guideAudioUrl = exhibitionBoard.getGuideAudioUrl(); final List<AudioVo> audioVoList = JSONObject.parseObject(guideAudioUrl, new TypeReference<List<AudioVo>>() { }, Feature.OrderedField); exhibitionBoard.setAudioUrlList(audioVoList.stream().map(AudioVo::getFileUrl).collect(Collectors.toList())); final String refMaterialUrl = exhibitionBoard.getRefMaterialUrl(); final List<AudioVo> refMaterialVoList = JSONObject.parseObject(refMaterialUrl, new TypeReference<List<AudioVo>>() { }, Feature.OrderedField); exhibitionBoard.setMaterialUrlList(refMaterialVoList.stream().map(AudioVo::getFileUrl).collect(Collectors.toList())); String assetId = exhibitionBoard.getAssetId(); if (assetId != null) { final Asset asset = this.assetService.getById(assetId); exhibitionBoard.setAssetName(this.assetService.getById(assetId).getName()); final String assetCopyrightOwnerId = asset.getAssetCopyrightOwnerId(); final String assetCopyrightOwnerName = this.copyrightOwnerService.getById(assetCopyrightOwnerId).getName(); exhibitionBoard.setAssetCopyrightOwnerName(assetCopyrightOwnerName); final String videoUrl = asset.getVideoUrl(); final List<VideoVo> videoVoList = JSONObject.parseObject(videoUrl, new TypeReference<List<VideoVo>>() { }, Feature.OrderedField); exhibitionBoard.setVideoUrlList(videoVoList.stream().map(VideoVo::getFileUrl).collect(Collectors.toList())); } return getResult(exhibitionBoard); } }