Ver Fonte

add file version

zero há 7 meses atrás
pai
commit
250d0294d2

+ 16 - 0
pom.xml

@@ -17,6 +17,7 @@
         <java.version>1.8</java.version>
         <maven.compiler.source>13</maven.compiler.source>
         <maven.compiler.target>13</maven.compiler.target>
+        <fastjson.version>2.0.12</fastjson.version>
     </properties>
     <dependencies>
         <dependency>
@@ -66,6 +67,21 @@
             <version>2.0.4</version>
         </dependency>
         <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+            <version>3.18.2</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>${fastjson.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+            <version>1.3.3</version>
+        </dependency>
+        <dependency>
             <groupId>com.aliyun.oss</groupId>
             <artifactId>aliyun-sdk-oss</artifactId>
             <version>3.10.2</version>

+ 15 - 0
src/main/java/com/example/fms/common/model/dto/ForceSaveDTO.java

@@ -0,0 +1,15 @@
+package com.example.fms.common.model.dto;
+
+import lombok.Data;
+
+@Data
+public class ForceSaveDTO {
+
+    private String key;
+
+    private String c;
+
+    private String userdata;
+
+    private String token;
+}

+ 17 - 0
src/main/java/com/example/fms/common/model/dto/RestoreFileVersionDTO.java

@@ -0,0 +1,17 @@
+package com.example.fms.common.model.dto;
+
+import lombok.Data;
+
+@Data
+public class RestoreFileVersionDTO {
+
+    private String originalFile;
+
+    private Integer previousVersion;
+
+    private Integer restoreVersion;
+
+    private String userId;
+
+    private String userName;
+}

+ 11 - 0
src/main/java/com/example/fms/common/model/vo/ForceSaveVO.java

@@ -0,0 +1,11 @@
+package com.example.fms.common.model.vo;
+
+import lombok.Data;
+
+@Data
+public class ForceSaveVO {
+
+    private Integer num;
+
+    private String message;
+}

+ 13 - 0
src/main/java/com/example/fms/common/model/vo/QueryFileVersionHistoryVO.java

@@ -0,0 +1,13 @@
+package com.example.fms.common.model.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class QueryFileVersionHistoryVO {
+
+    private Integer currentVersion;
+
+    private List<FileVersionInfoVO> fileVersionInfoVOS;
+}

+ 44 - 0
src/main/java/com/example/fms/common/utils/JWTUtils.java

@@ -0,0 +1,44 @@
+package com.example.fms.common.utils;
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.JWTCreator;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.auth0.jwt.exceptions.JWTVerificationException;
+import com.auth0.jwt.interfaces.Claim;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import com.auth0.jwt.interfaces.JWTVerifier;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.JwtBuilder;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+import io.jsonwebtoken.impl.DefaultClaims;
+import org.apache.commons.codec.binary.Base64;
+import org.springframework.stereotype.Component;
+
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
+import java.lang.reflect.Type;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+public class JWTUtils {
+
+    static String SECRETKEY = "VI71S3cGtXg96HgFWzQhblz1KwMc1Jzk";
+
+    public static String createJWT2(String jsons) {
+        Gson gson = new Gson();
+        Type type = new TypeToken<Map<String, Object>>() {}.getType();
+        Map<String, Object> payload = gson.fromJson(jsons, type);
+        // 创建JWT的payload
+        JWTCreator.Builder builder = JWT.create();
+        builder.withPayload(payload);
+        String jwtToken = builder.sign(Algorithm.HMAC256(SECRETKEY));
+        // 输出生成的JWT token
+        System.out.println("Generated JWT Token for ONLYOFFICE: " + jwtToken);
+        return jwtToken;
+    }
+}

+ 8 - 0
src/main/java/com/example/fms/common/utils/Response.java

@@ -26,6 +26,14 @@ public class Response {
         return JsonUtils.objectToJson(response);
     }
 
+    public static String success(Object data, String message) {
+        Response response = new Response();
+        response.setCode(ResponseEnum.SUCCESS.getCode());
+        response.setData(data);
+        response.setMessage(message);
+        return JsonUtils.objectToJson(response);
+    }
+
     public static String success(Object data, BaseVO baseVO) {
         Response response = new Response();
         response.setResultEnum(ResponseEnum.SUCCESS);

+ 31 - 1
src/main/java/com/example/fms/controller/FileVersionController.java

@@ -1,8 +1,12 @@
 package com.example.fms.controller;
 
+import com.example.fms.common.model.dto.ForceSaveDTO;
 import com.example.fms.common.model.dto.QueryFileVersionDTO;
+import com.example.fms.common.model.dto.RestoreFileVersionDTO;
 import com.example.fms.common.model.vo.FileVersionCallbackVO;
 import com.example.fms.common.model.vo.FileVersionInfoVO;
+import com.example.fms.common.model.vo.ForceSaveVO;
+import com.example.fms.common.model.vo.QueryFileVersionHistoryVO;
 import com.example.fms.common.utils.Response;
 import com.example.fms.service.FileVersionService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -37,10 +41,36 @@ public class FileVersionController {
         return callbackVO;
     }
 
+    @PostMapping("/restoreFileVersion")
+    @Operation(summary = "onlyoffice版本恢复")
+    public String restoreFileVersion(@RequestBody RestoreFileVersionDTO vo) {
+        fileVersionService.restoreFileVersion(vo);
+        return Response.success();
+    }
+
+    @PostMapping("/forceSave")
+    @Operation(summary = "onlyoffice强制保存")
+    public String forceSave(@RequestBody ForceSaveDTO vo) throws IOException {
+        ForceSaveVO saveVO = fileVersionService.forceSave(vo);
+        if (saveVO.getNum() != null) {
+            return Response.success(saveVO.getNum(), saveVO.getMessage());
+        } else {
+            return Response.success("", saveVO.getMessage());
+        }
+    }
+
     @PostMapping("/getCurrentVersionData")
     @Operation(summary = "获取当前显示版本数据")
-    public String getCurrentVersionData(@RequestBody QueryFileVersionDTO vo) throws IOException {
+    public String getCurrentVersionData(@RequestBody QueryFileVersionDTO vo) {
         FileVersionInfoVO versionData = fileVersionService.getCurrentVersionData(vo);
         return Response.success(versionData);
     }
+
+    @PostMapping("/queryFileVersionHistory")
+    @Operation(summary = "onlyoffice查询文件版本历史")
+    public String queryFileVersionHistory(@RequestBody QueryFileVersionDTO vo) {
+        QueryFileVersionHistoryVO historyVO = fileVersionService.queryFileVersionHistory(vo);
+        return Response.success(historyVO);
+    }
+
 }

+ 3 - 0
src/main/java/com/example/fms/mapper/FileVersionMapper.java

@@ -1,6 +1,7 @@
 package com.example.fms.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.example.fms.domain.FileOperateRecord;
 import com.example.fms.domain.FileVersion;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -13,4 +14,6 @@ public interface FileVersionMapper extends BaseMapper<FileVersion> {
     FileVersion queryFileVersionByGuid(@Param("guid") String guid);
 
     FileVersion queryCurrentFileVersionInfo(@Param("guid") String guid);
+
+    FileOperateRecord queryFileOperateRecord(@Param("guid") String guid);
 }

+ 109 - 2
src/main/java/com/example/fms/service/FileVersionService.java

@@ -1,12 +1,20 @@
 package com.example.fms.service;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.example.fms.common.model.dto.FileVersionCallbackHistoryDTO;
+import com.example.fms.common.model.dto.ForceSaveDTO;
 import com.example.fms.common.model.dto.QueryFileVersionDTO;
+import com.example.fms.common.model.dto.RestoreFileVersionDTO;
 import com.example.fms.common.model.vo.FileVersionInfoVO;
+import com.example.fms.common.model.vo.ForceSaveVO;
+import com.example.fms.common.model.vo.QueryFileVersionHistoryVO;
 import com.example.fms.common.model.vo.WebSocketMessageVO;
 import com.example.fms.common.utils.FileUtils;
+import com.example.fms.common.utils.JWTUtils;
 import com.example.fms.common.utils.RandomUtil;
 import com.example.fms.domain.FileOperateRecord;
 import com.example.fms.domain.FileVersion;
@@ -21,6 +29,7 @@ import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.multipart.MultipartFile;
@@ -51,6 +60,7 @@ public class FileVersionService {
 
     /**
      * onlyoffice回调函数(文件保存)
+     *
      * @param params
      * @param guid
      * @param fileName
@@ -74,7 +84,7 @@ public class FileVersionService {
                     flag = false;
                 }
                 WebSocketMessageVO messageVO = new WebSocketMessageVO();
-                messageVO.setMessage("文件已保存");
+                messageVO.setMessage("版本文件已保存");
                 messageVO.setCode(702);
                 messageService.sendMessage(messageVO);
             }
@@ -99,7 +109,7 @@ public class FileVersionService {
                         changesUrl = "";
                     }
                 }
-                this.addFileVersion(params,guid,fileName,user,previousVersion,url,changesUrl);
+                this.addFileVersion(params, guid, fileName, user, previousVersion, url, changesUrl);
             }
         }
         if (flag) {
@@ -177,7 +187,77 @@ public class FileVersionService {
     }
 
     /**
+     * onlyoffice版本恢复
+     * @param vo
+     */
+    public void restoreFileVersion(RestoreFileVersionDTO vo) {
+        Integer currentVersion = vo.getRestoreVersion();
+        Integer previousVersion = vo.getPreviousVersion();
+        String guid = vo.getOriginalFile();
+        String userId = vo.getUserId();
+        String userName = vo.getUserName();
+        //新增操作记录
+        FileOperateRecord record = new FileOperateRecord();
+        record.setPreviousVersion(previousVersion);
+        record.setCurrentVersion(currentVersion);
+        record.setOriginalFile(guid);
+        record.setUserId(userId);
+        record.setUserName(userName);
+        record.setOperate("1");
+        record.insert();
+        //更新版本
+        String key = RandomUtil.generateInvitationCode();
+        LambdaUpdateWrapper<FileVersion> wrapper = new UpdateWrapper<FileVersion>()
+                .lambda()
+                .set(FileVersion::getFileKey, key)
+                .eq(FileVersion::getVersion, currentVersion)
+                .eq(FileVersion::getOriginalFile, guid);
+        fileVersionMapper.update(null, wrapper);
+        //发送websocket
+        WebSocketMessageVO messageVO = new WebSocketMessageVO();
+        messageVO.setMessage("版本文件已恢复");
+        messageVO.setCode(703);
+        messageService.sendMessage(messageVO);
+    }
+
+    /**
+     * onlyoffice强制保存
+     * @param vo
+     * @return
+     */
+    public ForceSaveVO forceSave(ForceSaveDTO vo) throws IOException {
+        Map<Integer, String> map = new HashMap<>();
+        map.put(0,"没有错误");
+        map.put(1,"文档密钥丢失或找不到具有该密钥的文档");
+        map.put(2,"回调地址不正确");
+        map.put(3,"内部服务器错误");
+        map.put(4,"没有对文档进行任何更改");
+        map.put(5,"key不正确");
+        map.put(6,"令牌无效");
+        String officeInfo = permissionService.getOnlyOfficeInfo(vo);
+        int result = 1;
+        ForceSaveVO saveVO = new ForceSaveVO();
+        if (StringUtils.isNotEmpty(officeInfo)) {
+            JSONObject object = JSON.parseObject(officeInfo);
+            int error = Integer.parseInt(object.get("error").toString());
+            saveVO.setMessage(map.get(error));
+            if (error == 4) {
+                result = 1;
+            } else {
+                if (error == 0){
+                    result = 2;
+                } else {
+                    return saveVO;
+                }
+            }
+        }
+        saveVO.setNum(result);
+        return saveVO;
+    }
+
+    /**
      * 获取当前显示版本数据
+     *
      * @param vo
      * @return
      */
@@ -190,4 +270,31 @@ public class FileVersionService {
         }
         return infoVO;
     }
+
+    /**
+     * onlyoffice查询文件版本历史
+     * @param vo
+     * @return
+     */
+    public QueryFileVersionHistoryVO queryFileVersionHistory(QueryFileVersionDTO vo) {
+        QueryFileVersionHistoryVO historyVO = new QueryFileVersionHistoryVO();
+        List<FileVersion> versions = fileVersionMapper.selectList(new LambdaQueryWrapper<FileVersion>()
+                .eq(FileVersion::getOriginalFile, vo.getGuid())
+                .orderByDesc(FileVersion::getVersion));
+        if (!CollectionUtils.isEmpty(versions)) {
+            List<FileVersionInfoVO> fileVersionInfoVOS = new ArrayList<>();
+            versions.forEach(i -> {
+                FileVersionInfoVO infoVO = new FileVersionInfoVO();
+                BeanUtils.copyProperties(i, infoVO);
+                infoVO.setFileVersionId(i.getId());
+                fileVersionInfoVOS.add(infoVO);
+            });
+            historyVO.setFileVersionInfoVOS(fileVersionInfoVOS);
+        }
+        FileOperateRecord operateRecord = fileVersionMapper.queryFileOperateRecord(vo.getGuid());
+        if (ObjectUtils.isNotEmpty(operateRecord)) {
+            historyVO.setCurrentVersion(operateRecord.getCurrentVersion());
+        }
+        return historyVO;
+    }
 }

+ 24 - 0
src/main/java/com/example/fms/service/permissions/PermissionService.java

@@ -1,6 +1,8 @@
 package com.example.fms.service.permissions;
 
 import com.alibaba.fastjson.JSON;
+import com.example.fms.common.model.dto.ForceSaveDTO;
+import com.example.fms.common.utils.JWTUtils;
 import com.google.gson.Gson;
 import okhttp3.MediaType;
 import okhttp3.OkHttpClient;
@@ -22,6 +24,8 @@ import java.util.concurrent.TimeUnit;
 public class PermissionService {
     @Value("${authorUrl}")
     private String PCSUrl;
+    @Value("${OnlyOfficeUrl}")
+    private String OnlyOfficeUrl;
 
     /**
      * 根据名称模糊查询人员接口
@@ -248,4 +252,24 @@ public class PermissionService {
         return ids;
 
     }
+
+    public String getOnlyOfficeInfo(ForceSaveDTO vo) throws IOException {
+        vo.setC("forcesave");
+        vo.setUserdata("sample userdata");
+        String param = new Gson().toJson(vo);
+        String jwt = JWTUtils.createJWT2(param);
+        vo.setToken(jwt);
+        String param1 = new Gson().toJson(vo);
+        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param1);
+        OkHttpClient okHttpClient = new OkHttpClient.Builder()
+                .connectTimeout(60, TimeUnit.SECONDS)
+                .writeTimeout(60, TimeUnit.SECONDS)
+                .readTimeout(60, TimeUnit.SECONDS)
+                .build();
+        Request request = new Request.Builder()
+                .url(OnlyOfficeUrl + "/coauthoring/CommandService.ashx")
+                .post(requestBody)
+                .build();
+        return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
+    }
 }

+ 2 - 1
src/main/resources/application-dev.yml

@@ -30,4 +30,5 @@ spring:
 queueName: emailProd.queue
 authorUrl: http://192.168.2.109:8880
 PCSUrl: http://192.168.2.109:8880
-PASUrl: http://localhost:8879
+PASUrl: http://localhost:8879
+OnlyOfficeUrl: http://192.168.2.24:9997

+ 1 - 1
src/main/resources/configSetting.json

@@ -11,7 +11,7 @@
   {
     "sourceId": "1",
     "sourceName": "FSS",
-    "name": "192.168.1.24",
+    "name": "192.168.2.24",
     "id": 2,
     "userName": "root",
     "passWord": "xiaoshi221101",

+ 13 - 0
src/main/resources/mapper/FileVersionMapper.xml

@@ -7,6 +7,11 @@
         original_file,changes,server_version,previous_version,user,created
     </sql>
 
+    <sql id="Base_Column_File_Operate_Record">
+        id,file_name,file_type,file_key,url,changes_url,version,
+        original_file,changes,server_version,previous_version,user,created
+    </sql>
+
     <select id="queryFileVersionByGuid" resultType="com.example.fms.domain.FileVersion">
         select <include refid="Base_Column_File_Version"/>
         from FILE_VERSION
@@ -22,4 +27,12 @@
         and version = (select current_version from FILE_OPERATE_RECORD where original_file = #{guid} order by ID desc limit 1)
     </select>
 
+    <select id="queryFileOperateRecord" resultType="com.example.fms.domain.FileOperateRecord">
+        select <include refid="Base_Column_File_Operate_Record"/>
+        from FILE_OPERATE_RECORD
+        where original_file = #{guid}
+        order by ID desc
+        limit 1
+    </select>
+
 </mapper>

+ 31 - 0
src/test/java/com/example/fms/FileVersionTest.java

@@ -1,7 +1,11 @@
 package com.example.fms;
 
+import com.example.fms.common.model.dto.ForceSaveDTO;
 import com.example.fms.common.model.dto.QueryFileVersionDTO;
+import com.example.fms.common.model.dto.RestoreFileVersionDTO;
 import com.example.fms.common.model.vo.FileVersionInfoVO;
+import com.example.fms.common.model.vo.ForceSaveVO;
+import com.example.fms.common.model.vo.QueryFileVersionHistoryVO;
 import com.example.fms.service.FileVersionService;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -32,10 +36,37 @@ public class FileVersionTest {
     }
 
     @Test
+    public void restoreFileVersion() {
+        RestoreFileVersionDTO vo = new RestoreFileVersionDTO();
+        vo.setRestoreVersion(2);
+        vo.setPreviousVersion(1);
+        vo.setOriginalFile("1");
+        fileVersionService.restoreFileVersion(vo);
+        System.out.println("finished");
+    }
+
+    @Test
+    public void forceSave() throws IOException {
+        ForceSaveDTO vo = new ForceSaveDTO();
+        vo.setKey("shdfjkshkhds");
+        ForceSaveVO saveVO = fileVersionService.forceSave(vo);
+        System.out.println(saveVO);
+    }
+
+    @Test
     public void getCurrentVersionData() {
         QueryFileVersionDTO versionDTO = new QueryFileVersionDTO();
         versionDTO.setGuid("1");
         FileVersionInfoVO versionData = fileVersionService.getCurrentVersionData(versionDTO);
         System.out.println(versionData);
     }
+
+    @Test
+    public void queryFileVersionHistory() {
+        QueryFileVersionDTO versionDTO = new QueryFileVersionDTO();
+        versionDTO.setGuid("1");
+        QueryFileVersionHistoryVO historyVO = fileVersionService.queryFileVersionHistory(versionDTO);
+        System.out.println(historyVO);
+    }
+
 }