FileVersionService.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. package com.example.fms.service;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  6. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  7. import com.example.fms.common.model.dto.*;
  8. import com.example.fms.common.model.vo.FileVersionInfoVO;
  9. import com.example.fms.common.model.vo.ForceSaveVO;
  10. import com.example.fms.common.model.vo.QueryFileVersionHistoryVO;
  11. import com.example.fms.common.model.vo.WebSocketMessageVO;
  12. import com.example.fms.common.utils.FileUtils;
  13. import com.example.fms.common.utils.JWTUtils;
  14. import com.example.fms.common.utils.RandomUtil;
  15. import com.example.fms.domain.FileOperateRecord;
  16. import com.example.fms.domain.FileVersion;
  17. import com.example.fms.domain.Personnel;
  18. import com.example.fms.mapper.FileOperateRecordMapper;
  19. import com.example.fms.mapper.FileVersionMapper;
  20. import com.example.fms.service.permissions.MessageService;
  21. import com.example.fms.service.permissions.PermissionService;
  22. import lombok.RequiredArgsConstructor;
  23. import lombok.extern.slf4j.Slf4j;
  24. import org.apache.commons.compress.utils.IOUtils;
  25. import org.apache.commons.lang3.ObjectUtils;
  26. import org.apache.commons.lang3.StringUtils;
  27. import org.springframework.beans.BeanUtils;
  28. import org.springframework.beans.factory.annotation.Autowired;
  29. import org.springframework.beans.factory.annotation.Value;
  30. import org.springframework.stereotype.Service;
  31. import org.springframework.util.CollectionUtils;
  32. import org.springframework.web.multipart.MultipartFile;
  33. import java.io.*;
  34. import java.util.*;
  35. @RequiredArgsConstructor
  36. @Slf4j
  37. @Service
  38. public class FileVersionService {
  39. @Autowired
  40. private MessageService messageService;
  41. @Autowired
  42. private PermissionService permissionService;
  43. @Autowired
  44. private FileMangerService fileMangerService;
  45. @Autowired
  46. private FileVersionMapper fileVersionMapper;
  47. @Autowired
  48. private FileOperateRecordMapper fileOperateRecordMapper;
  49. /**
  50. * onlyoffice回调函数(文件保存)
  51. *
  52. * @param params
  53. * @param guid
  54. * @param fileName
  55. * @param user
  56. * @param previousVersion
  57. * @return
  58. * @throws IOException
  59. */
  60. public Integer callback(Map<String, Object> params, String guid, String fileName,
  61. String user, String previousVersion) throws Exception {
  62. boolean flag = true;
  63. if (!CollectionUtils.isEmpty(params)) {
  64. int status = Integer.parseInt(params.get("status").toString());
  65. if (status != 2 && status != 6) {
  66. return 0;
  67. }
  68. String url = "";
  69. if (ObjectUtils.isNotEmpty(params.get("url"))) {
  70. url = params.get("url").toString();
  71. }
  72. String changesUrl = "";
  73. if (ObjectUtils.isNotEmpty(params.get("changesurl"))) {
  74. changesUrl = params.get("changesurl").toString();
  75. }
  76. if (status == 6 && StringUtils.isNotEmpty(url)) {
  77. MultipartFile multipartFile = FileUtils.urlToMultipartFile(url, fileName);
  78. String replaceFile = fileMangerService.replaceFile(multipartFile, guid, 6);
  79. if (StringUtils.isEmpty(replaceFile)) {
  80. flag = false;
  81. }
  82. WebSocketMessageVO messageVO = new WebSocketMessageVO();
  83. messageVO.setMessage("版本文件已保存");
  84. messageVO.setCode(702);
  85. messageService.sendMessage(messageVO);
  86. }
  87. if (status == 2) {
  88. if (StringUtils.isNotEmpty(url)) {
  89. MultipartFile multipartFile = FileUtils.urlToMultipartFile(url, fileName);
  90. List<String> list = fileMangerService.uploadFile(Collections.singletonList(multipartFile), 6);
  91. if (!CollectionUtils.isEmpty(list)) {
  92. url = list.get(0);
  93. } else {
  94. url = "";
  95. }
  96. }
  97. if (StringUtils.isNotEmpty(changesUrl)) {
  98. MultipartFile multipartFile1 = FileUtils.urlToMultipartFile(changesUrl, fileName);
  99. List<String> list1 = fileMangerService.uploadFile(Collections.singletonList(multipartFile1), 6);
  100. if (!CollectionUtils.isEmpty(list1)) {
  101. changesUrl = list1.get(0);
  102. } else {
  103. changesUrl = "";
  104. }
  105. }
  106. if (StringUtils.equals(fileName, "undefined")) {
  107. fileName = "";
  108. }
  109. if (StringUtils.equals(user, "undefined")) {
  110. user = "";
  111. }
  112. if (StringUtils.equals(previousVersion, "undefined")) {
  113. previousVersion = "";
  114. }
  115. this.addFileVersion(params, guid, fileName, user, previousVersion, url, changesUrl);
  116. }
  117. }
  118. if (flag) {
  119. return 0;
  120. } else {
  121. return 1;
  122. }
  123. }
  124. public void addFileVersion(Map<String, Object> params, String guid, String fileName,
  125. String user, String previousVersion, String url,
  126. String changesUrl) throws IOException {
  127. String fileType = "";
  128. if (ObjectUtils.isNotEmpty(params.get("filetype"))) {
  129. fileType = params.get("filetype").toString();
  130. }
  131. String changes = "";
  132. String serverVersion = "";
  133. String history = "";
  134. if (ObjectUtils.isNotEmpty(params.get("history"))) {
  135. history = params.get("history").toString();
  136. }
  137. if (StringUtils.isNotEmpty(history)) {
  138. String strip = StringUtils.strip(history, "{}");
  139. int i = strip.indexOf(",");
  140. String s1 = strip.substring(0, i);
  141. serverVersion = s1.trim().substring(s1.indexOf("=") + 1);
  142. String s2 = strip.substring(i + 1);
  143. changes = s2.trim().substring(s2.indexOf("=") + 1);
  144. }
  145. int version = 1;
  146. String originalFile = guid;
  147. FileVersion fileVersion = fileVersionMapper.queryFileVersionByGuid(originalFile);
  148. if (ObjectUtils.isNotEmpty(fileVersion)) {
  149. version = fileVersion.getVersion();
  150. originalFile = fileVersion.getOriginalFile();
  151. } else {
  152. FileVersion fileVersion1 = new FileVersion();
  153. fileVersion1.setFileName(fileName);
  154. fileVersion1.setFileType(fileType);
  155. fileVersion1.setFileKey(RandomUtil.generateInvitationCode());
  156. fileVersion1.setUrl(guid);
  157. fileVersion1.setVersion(version);
  158. fileVersion1.setOriginalFile(guid);
  159. fileVersion1.setUser(user);
  160. fileVersion1.insert();
  161. previousVersion = "1";
  162. }
  163. version += 1;
  164. //添加新版本数据
  165. FileVersion version1 = new FileVersion();
  166. version1.setFileName(fileName);
  167. version1.setFileType(fileType);
  168. version1.setFileKey(RandomUtil.generateInvitationCode());
  169. version1.setUrl(url);
  170. version1.setChangesUrl(changesUrl);
  171. version1.setVersion(version);
  172. version1.setOriginalFile(originalFile);
  173. version1.setChanges(changes);
  174. version1.setServerVersion(serverVersion);
  175. if (StringUtils.isNotEmpty(previousVersion)) {
  176. version1.setPreviousVersion(Integer.valueOf(previousVersion));
  177. }
  178. version1.setUser(user);
  179. version1.insert();
  180. //查询编辑人
  181. List<Personnel> personnels = new ArrayList<>();
  182. if (StringUtils.isNotEmpty(user)) {
  183. String res = permissionService.getPersonnelByIdsFromPCS(Collections.singletonList(user));
  184. JSONObject jsonObject = JSONObject.parseObject(res);
  185. personnels = JSONObject.parseArray(jsonObject.getString("data"), Personnel.class);
  186. }
  187. //添加当前操作版本
  188. FileOperateRecord operateRecord = new FileOperateRecord();
  189. operateRecord.setUserId(user);
  190. Personnel personnel = personnels.stream().filter(i -> i.getId().toString().equals(user)).findFirst().orElse(null);
  191. if (ObjectUtils.isNotEmpty(personnel)) {
  192. operateRecord.setUserName(personnel.getPersonnelName());
  193. }
  194. operateRecord.setCurrentVersion(version);
  195. if (StringUtils.isNotEmpty(previousVersion)) {
  196. operateRecord.setPreviousVersion(Integer.valueOf(previousVersion));
  197. }
  198. operateRecord.setOperate("2");
  199. operateRecord.setOriginalFile(originalFile);
  200. operateRecord.insert();
  201. }
  202. /**
  203. * onlyoffice版本恢复
  204. * @param vo
  205. */
  206. public void restoreFileVersion(RestoreFileVersionDTO vo) {
  207. Integer currentVersion = vo.getRestoreVersion();
  208. Integer previousVersion = vo.getPreviousVersion();
  209. String guid = vo.getGuid();
  210. String userId = vo.getUserId();
  211. String userName = vo.getUserName();
  212. //新增操作记录
  213. FileOperateRecord record = new FileOperateRecord();
  214. record.setPreviousVersion(previousVersion);
  215. record.setCurrentVersion(currentVersion);
  216. record.setOriginalFile(guid);
  217. record.setUserId(userId);
  218. record.setUserName(userName);
  219. record.setOperate("1");
  220. record.insert();
  221. //更新版本
  222. String key = RandomUtil.generateInvitationCode();
  223. LambdaUpdateWrapper<FileVersion> wrapper = new UpdateWrapper<FileVersion>()
  224. .lambda()
  225. .set(FileVersion::getFileKey, key)
  226. .eq(FileVersion::getVersion, currentVersion)
  227. .eq(FileVersion::getOriginalFile, guid);
  228. fileVersionMapper.update(null, wrapper);
  229. //发送websocket
  230. WebSocketMessageVO messageVO = new WebSocketMessageVO();
  231. messageVO.setMessage("版本文件已恢复");
  232. messageVO.setCode(703);
  233. messageService.sendMessage(messageVO);
  234. }
  235. /**
  236. * onlyoffice强制保存
  237. * @param vo
  238. * @return
  239. */
  240. public ForceSaveVO forceSave(ForceSaveDTO vo) throws IOException {
  241. Map<Integer, String> map = new HashMap<>();
  242. map.put(0,"没有错误");
  243. map.put(1,"文档密钥丢失或找不到具有该密钥的文档");
  244. map.put(2,"回调地址不正确");
  245. map.put(3,"内部服务器错误");
  246. map.put(4,"没有对文档进行任何更改");
  247. map.put(5,"key不正确");
  248. map.put(6,"令牌无效");
  249. String officeInfo = permissionService.getOnlyOfficeInfo(vo);
  250. int result = 1;
  251. ForceSaveVO saveVO = new ForceSaveVO();
  252. if (StringUtils.isNotEmpty(officeInfo)) {
  253. JSONObject object = JSON.parseObject(officeInfo);
  254. int error = Integer.parseInt(object.get("error").toString());
  255. saveVO.setMessage(map.get(error));
  256. if (error == 4) {
  257. result = 1;
  258. } else {
  259. if (error == 0){
  260. result = 2;
  261. } else {
  262. return saveVO;
  263. }
  264. }
  265. }
  266. saveVO.setNum(result);
  267. return saveVO;
  268. }
  269. /**
  270. * 获取当前显示版本数据
  271. *
  272. * @param vo
  273. * @return
  274. */
  275. public FileVersionInfoVO getCurrentVersionData(QueryFileVersionDTO vo) {
  276. FileVersion fileVersion = fileVersionMapper.queryCurrentFileVersionInfo(vo.getGuid());
  277. FileVersionInfoVO infoVO = new FileVersionInfoVO();
  278. if (ObjectUtils.isNotEmpty(fileVersion)) {
  279. BeanUtils.copyProperties(fileVersion, infoVO);
  280. infoVO.setFileVersionId(fileVersion.getId());
  281. infoVO.setKey(fileVersion.getFileKey());
  282. }
  283. return infoVO;
  284. }
  285. /**
  286. * onlyoffice查询文件版本历史
  287. * @param vo
  288. * @return
  289. */
  290. public QueryFileVersionHistoryVO queryFileVersionHistory(QueryFileVersionDTO vo) {
  291. QueryFileVersionHistoryVO historyVO = new QueryFileVersionHistoryVO();
  292. List<FileVersion> versions = fileVersionMapper.selectList(new LambdaQueryWrapper<FileVersion>()
  293. .eq(FileVersion::getOriginalFile, vo.getGuid())
  294. .orderByDesc(FileVersion::getVersion));
  295. if (!CollectionUtils.isEmpty(versions)) {
  296. List<FileVersionInfoVO> fileVersionInfoVOS = new ArrayList<>();
  297. versions.forEach(i -> {
  298. FileVersionInfoVO infoVO = new FileVersionInfoVO();
  299. BeanUtils.copyProperties(i, infoVO);
  300. infoVO.setFileVersionId(i.getId());
  301. infoVO.setKey(i.getFileKey());
  302. fileVersionInfoVOS.add(infoVO);
  303. });
  304. historyVO.setHistory(fileVersionInfoVOS);
  305. }
  306. FileOperateRecord operateRecord = fileVersionMapper.queryFileOperateRecord(vo.getGuid());
  307. if (ObjectUtils.isNotEmpty(operateRecord)) {
  308. historyVO.setCurrentVersion(operateRecord.getCurrentVersion());
  309. }
  310. return historyVO;
  311. }
  312. }