瀏覽代碼

1.将文件转换放在文件上传成功之后
2.增加资源管理-彻底删除接口

honorfire 8 月之前
父節點
當前提交
9ad012025a

+ 15 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CourseAuditRecordController.java

@@ -14,6 +14,7 @@ package vip.xiaonuo.disk.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollStreamUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.github.xiaoymin.knife4j.annotations.ApiSupport;
@@ -143,6 +144,7 @@ public class CourseAuditRecordController {
         if("2".equals(funcType))
         {
             String userId=StpLoginUserUtil.getLoginUser().getId();
+            param.put("sortflag", "1");
         }
 
         //资源中心必须全部是审核通过已发布的
@@ -308,7 +310,17 @@ public class CourseAuditRecordController {
     @PostMapping("/disk/courseauditrecord/delete")
     public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
                                                CommonValidList<CourseAuditRecordIdParam> courseAuditRecordIdParamList) {
+        Map param=new HashMap();
+        List<String> deleteIdList=CollStreamUtil.toList(courseAuditRecordIdParamList, CourseAuditRecordIdParam::getId);
+        param.put("ids", deleteIdList);
+        //查询出所有关联的用户附件信息
+        List<CourseAuditRecord> deleteCourseAuditRecordList=courseAuditRecordService.queryCourseAuditRecordList(param);
+        List<String> userfileIdList=CollStreamUtil.toList(deleteCourseAuditRecordList, CourseAuditRecord::getUserfileId);
+        resourceUserfileService.removeByIds(userfileIdList);
+        //删除资源管理记录本身
         courseAuditRecordService.delete(courseAuditRecordIdParamList);
+
+
         return CommonResult.ok();
     }
 
@@ -328,6 +340,7 @@ public class CourseAuditRecordController {
         Map<String,Object> result=courseAuditRecordService.queryInfo(param);
         //获取关键词
         String keyword= String.valueOf(result.get("keyword"));
+        keyword=StringUtils.deleteWhitespace(keyword);
         if(StringUtils.isNotEmpty(keyword))
         {
             String[] keywordIdArray=keyword.split(",");
@@ -362,6 +375,7 @@ public class CourseAuditRecordController {
         result.put("isCollet",isCollet);
         //获取关键词
         String keyword= String.valueOf(result.get("keyword"));
+        keyword=StringUtils.deleteWhitespace(keyword);
         if(StringUtils.isNotEmpty(keyword))
         {
             String[] keywordIdArray = keyword.split(",");
@@ -392,6 +406,7 @@ public class CourseAuditRecordController {
         Map<String,Object> result=courseAuditRecordService.queryRecentlyRecord(param);
         //获取关键词
         String keyword= String.valueOf(result.get("keyword"));
+        keyword=StringUtils.deleteWhitespace(keyword);
         if(StringUtils.isNotEmpty(keyword))
         {
             String[] keywordIdArray=keyword.split(",");

+ 0 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/courseauditrecord/CourseAuditRecordAddParam.java

@@ -55,7 +55,6 @@ public class CourseAuditRecordAddParam {
 
     /** 所属专业ID */
     @ApiModelProperty(value = "所属专业ID", position = 19)
-    @NotBlank(message = "所属专业ID不能为空")
     private String majorId;
 
     /** 关键字 */

+ 5 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/file/TranscodingResourceReqDTO.java

@@ -20,4 +20,9 @@ public class TranscodingResourceReqDTO {
      * 文档:pdf doc docx ppt pptx xls xlsx
      */
     private String format;
+
+    /**
+     * 用户id
+     */
+    private String userId;
 }

+ 2 - 2
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/CourseAuditRecordMapper.xml

@@ -67,7 +67,7 @@
             and t1.COURSE_TYPE=#{param.courseType}
         </if>
         <if test="param.suffix!=null and param.suffix != ''">
-            and t1.EXTEND_NAME like CONCAT('%',#{param.suffix}, '%')
+            and t2.EXTEND_NAME like CONCAT('%',#{param.suffix}, '%')
         </if>
         order by t1.ID desc
     </select>
@@ -123,7 +123,7 @@
             and t1.COURSE_TYPE=#{param.courseType}
         </if>
         <if test="param.suffix!=null and param.suffix != ''">
-            and t1.EXTEND_NAME like CONCAT('%',#{param.suffix}, '%')
+            and t2.EXTEND_NAME like CONCAT('%',#{param.suffix}, '%')
         </if>
         <if test="param.funcType!=null and param.funcType != ''">
             <if test=" param.funcType == 1">

+ 1 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/TranscodingService.java

@@ -20,4 +20,5 @@ public interface TranscodingService {
     CommonResult<String> transcodingVideo(TranscodingReqDTO transcodingReqDTO);
 
     CommonResult<String> transcodingResource(TranscodingResourceReqDTO transcodingResourceReqDTO);
+    void transcodingResourceParallel(TranscodingResourceReqDTO transcodingResourceReqDTO);
 }

+ 4 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/CourseAuditRecordServiceImpl.java

@@ -73,6 +73,10 @@ public class CourseAuditRecordServiceImpl extends ServiceImpl<CourseAuditRecordM
         if (ObjectUtil.isNotEmpty(param.get("courseId"))) {
             queryWrapper.lambda().eq(CourseAuditRecord::getCourseId, param.get("courseId"));
         }
+        if (ObjectUtil.isNotEmpty(param.get("ids"))) {
+            List<String> idList= (List<String>) param.get("ids");
+            queryWrapper.lambda().in(CourseAuditRecord::getId, idList);
+        }
         return this.list(queryWrapper);
     }
 

+ 27 - 5
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/ResourceFileServiceImpl.java

@@ -27,13 +27,11 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import vip.xiaonuo.disk.component.ResourceFileDealComp;
 import vip.xiaonuo.disk.domain.*;
-import vip.xiaonuo.disk.dto.file.DownloadFileDTO;
-import vip.xiaonuo.disk.dto.file.EachOtherExchangeDTO;
-import vip.xiaonuo.disk.dto.file.PreviewDTO;
-import vip.xiaonuo.disk.dto.file.UploadFileDTO;
+import vip.xiaonuo.disk.dto.file.*;
 import vip.xiaonuo.disk.io.QiwenFile;
 import vip.xiaonuo.disk.mapper.*;
 import vip.xiaonuo.disk.service.ResourceFileService;
+import vip.xiaonuo.disk.service.TranscodingService;
 import vip.xiaonuo.disk.util.OperationLogUtil;
 import vip.xiaonuo.disk.vo.file.UploadFileVo;
 
@@ -48,6 +46,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 import java.util.zip.Adler32;
 import java.util.zip.CheckedOutputStream;
@@ -76,6 +76,8 @@ public class ResourceFileServiceImpl extends ServiceImpl<ResourceFileMapper, Res
     ImageMapper imageMapper;
     @Resource
     PictureFileMapper pictureFileMapper;
+    @Resource
+    private TranscodingService transcodingService;
 
 
 
@@ -87,7 +89,8 @@ public class ResourceFileServiceImpl extends ServiceImpl<ResourceFileMapper, Res
     public static final String CURRENT_MODULE = "文件传输接口";
 
     public static final String FAIL = "操作失败";
-    public static Executor exec = Executors.newFixedThreadPool(300);
+    public static ScheduledExecutorService exec = Executors.newScheduledThreadPool(300);
+
 
     @Override
     public UploadFileVo uploadFileSpeed(HttpServletRequest request,String userId,UploadFileDTO uploadFileDTO) {
@@ -119,6 +122,18 @@ public class ResourceFileServiceImpl extends ServiceImpl<ResourceFileMapper, Res
                 resourceUserFile.setFuncType(funcType);
                 resourceUserFileMapper.insert(resourceUserFile);
                 uploadFileVo.setUploadStatus("1");
+                //上传成功同时用新线程异步转换格式用来创建预览用的文件
+                if(StringUtils.isEmpty(file.getPreviewFileUrl()))
+                {
+                    exec.schedule(() -> {
+                        TranscodingResourceReqDTO transcodingResourceReqDTO = new TranscodingResourceReqDTO();
+                        transcodingResourceReqDTO.setUserFileId(resourceUserFile.getUserFileId());
+                        transcodingResourceReqDTO.setUserId(userId);
+                        transcodingService.transcodingResourceParallel(transcodingResourceReqDTO);
+                    }, 10, TimeUnit.SECONDS);
+                }
+
+
             } catch (Exception e) {
                 log.warn("极速上传文件冲突重命名处理: {}", JSON.toJSONString(resourceUserFile));
 
@@ -236,6 +251,13 @@ public class ResourceFileServiceImpl extends ServiceImpl<ResourceFileMapper, Res
                 }
                 uploadFileVo.setUserFileId(resourceUserFile.getUserFileId());
                 uploadFileVo.setUploadStatus("1");
+                //上传成功同时用新线程异步转换格式用来创建预览用的文件
+                exec.schedule(() -> {
+                    TranscodingResourceReqDTO transcodingResourceReqDTO = new TranscodingResourceReqDTO();
+                    transcodingResourceReqDTO.setUserFileId(resourceUserFile.getUserFileId());
+                    transcodingResourceReqDTO.setUserId(userId);
+                    transcodingService.transcodingResourceParallel(transcodingResourceReqDTO);
+                }, 10, TimeUnit.SECONDS);
 
                 if (relativePath.contains("/")) {
                     QiwenFile finalQiwenFile = qiwenFile;

+ 90 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/TranscodingServiceImpl.java

@@ -201,6 +201,96 @@ public class TranscodingServiceImpl implements TranscodingService {
         return CommonResult.ok("格式转换成功");
     }
 
+    @Override
+    public void transcodingResourceParallel(TranscodingResourceReqDTO transcodingResourceReqDTO) {
+        // 校验目标文件是否存在,是否是本人的
+        String userId = transcodingResourceReqDTO.getUserId();
+        QueryWrapper<ResourceUserFile> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(ResourceUserFile::getUserFileId, transcodingResourceReqDTO.getUserFileId());
+        ResourceUserFile userFile = resourceUserFileMapper.selectOne(queryWrapper);
+        if (userFile == null || !userFile.getUserId().equals(userId)) {
+            System.out.println("文件不存在或不是本人的");
+        }
+
+        List<String> videoList= Arrays.asList("wmv","avi","flv","mpeg","mpg","rmvb","mov","mkv");
+
+        List<String> wordList= Arrays.asList("doc","docx","ppt","pptx","xls","xlsx");
+
+
+        ResourceFile fileBean = resourceFileMapper.selectById(userFile.getFileId());
+        if (fileBean == null) {
+            System.out.println("文件不存在");
+        }
+        if(videoList.contains(userFile.getExtendName())){
+            transcodingResourceReqDTO.setTranscodingType(0);
+            transcodingResourceReqDTO.setFormat("mp4");
+        }
+
+        if(wordList.contains(userFile.getExtendName())){
+            transcodingResourceReqDTO.setTranscodingType(1);
+            transcodingResourceReqDTO.setFormat("pdf");
+        }
+
+
+        // 构建转码格式列表
+        ArrayList<String> formatList = new ArrayList<>();
+        formatList.add(transcodingResourceReqDTO.getFormat());
+        // 判断视频还是图片
+        if(transcodingResourceReqDTO.getTranscodingType()!= null)
+        {
+            if (transcodingResourceReqDTO.getTranscodingType() == 0) {
+                try {
+                    // 转码视频
+                    // mp4 wmv avi flv mpeg mpg rmvb mov 互相转
+                    videoConverter.convertAndUpload(fileBean.getFileUrl(), fileBean.getFileId(), new String[]{transcodingResourceReqDTO.getFormat()});
+                    //根据文件id修改预览地址
+                    if(videoList.contains(userFile.getExtendName())||wordList.contains(userFile.getExtendName())){
+                        ResourceFile newFile = new ResourceFile();
+                        newFile.setFileId(fileBean.getFileId());
+                        newFile.setPreviewFileUrl("converted/" + fileBean.getFileId() + "." + transcodingResourceReqDTO.getFormat());
+                        resourceFileMapper.updateById(newFile);
+                    }
+                } catch (Exception ex) {
+                    log.error(ex.getMessage());
+                    System.out.println("格式转换失败");
+                }
+            } else if (transcodingResourceReqDTO.getTranscodingType() == 1) {
+                // 转码文档
+                // pdf doc docx ppt pptx xls xlsx
+                // doc转docx,ppt转pptx,xls转xlsx 所有均转pdf
+                // 判断目标格式
+
+                try {
+                    if ("pdf".equals(transcodingResourceReqDTO.getFormat())) {
+                        pdfUtils.convertToPdf(fileBean.getFileUrl(), fileBean.getFileId() + "." + transcodingResourceReqDTO.getFormat());
+                    } else {
+                        officeConverter.convertAndUpload(fileBean.getFileUrl(), fileBean.getFileId() + "." + transcodingResourceReqDTO.getFormat());
+                    }
+                    //根据文件id修改预览地址
+                    ResourceFile newFile = new ResourceFile();
+                    newFile.setFileId(fileBean.getFileId());
+                    if(videoList.contains(userFile.getExtendName())||wordList.contains(userFile.getExtendName())){
+                        newFile.setPreviewFileUrl("converted/" + fileBean.getFileId() + "." + transcodingResourceReqDTO.getFormat());
+                    }else{
+                        newFile.setPreviewFileUrl(fileBean.getFileUrl());
+                    }
+                    resourceFileMapper.updateById(newFile);
+                } catch (Exception ex) {
+                    log.error("格式转换:"+ex.getMessage());
+                    System.out.println("格式转换失败");
+                }
+            }
+        }
+        else
+        {
+            ResourceFile newFile = new ResourceFile();
+            newFile.setFileId(fileBean.getFileId());
+            newFile.setPreviewFileUrl(fileBean.getFileUrl());
+            resourceFileMapper.updateById(newFile);
+        }
+        System.out.println("格式转换成功");
+    }
+
 
 
     /**