package com.oo.demo.service; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.oo.demo.dao.OnFileMapper; import com.oo.demo.entity.OnFile; import com.oo.demo.entity.WebsocketResult; import com.oo.onlyoffice.api.OnlyServiceAPI; import com.oo.onlyoffice.dto.edit.FileUser; import com.oo.onlyoffice.tools.SecurityUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Map; /** * @BelongsProject: onlyoffice-demo * @BelongsPackage: com.oo.demo.service * @CreateTime: 2023-08-02 09:57 * @Description: TODO * @Version: 1.0 */ @Slf4j @Service public class FileService { @Autowired private OnlyServiceAPI onlyServiceAPI; @Autowired private DemoService demoService; @Autowired private OnFileService onFileService; /** * 文档服务器 保存文件回调 * Defines the status of the document. Can have the following values: * 1 - document is being edited, * 2 - document is ready for saving, * 3 - document saving error has occurred, * 4 - document is closed with no changes, * 6 - document is being edited, but the current document state is saved, * 7 - error has occurred while force saving the document. * * @param jsonObject */ @Transactional(rollbackFor = Exception.class) public WebsocketResult documentSave(JSONObject jsonObject) { WebsocketResult result = new WebsocketResult(); String key = ""; String fileId = jsonObject.getString("fileId"); try { int status = jsonObject.getIntValue("status"); log.info("status[{}]", status); if (6 == status) { log.info("开始保存文件"); log.info("dayin:" + JSON.toJSONString(jsonObject)); JSONArray jsonArray = jsonObject.getJSONObject("history").getJSONArray("changes"); log.info("历史版本:" + JSON.toJSONString(jsonArray)); JSONObject object = jsonArray.getJSONObject(0); String userId = object.getJSONObject("user").getString("id"); FileUser fileUser = new FileUser(); fileUser.setId(userId); SecurityUtils.setUserSession(fileUser); log.info("fileuser:" + JSON.toJSONString(fileUser)); key = jsonObject.getString("key"); log.info("key:" + JSON.toJSONString(key)); //文件id Boolean isexistid = false; if (fileId != null && !"".equals(fileId)) { isexistid = true; } if (!isexistid) { fileId = onlyServiceAPI.getFileId(key); } log.info("fileId:" + JSON.toJSONString(fileId)); if (fileId != null && !"".equals(fileId)) { //查询之前FileId对应的文件信息 OnFile onfile = onFileService.getFileById(fileId); jsonObject.put("caseId", onfile.getCaseId()); } //判断是否是最后一人进行保存 int users = onlyServiceAPI.getUserNum(key); // if (users > 1) { // return null; // } //历史版本最大个数 获取当前文件的历史版本数量 Integer histNum = onlyServiceAPI.getHistNum(); log.info("历史版本最大个数" + histNum); /** * 如果有需要保存历史记录 可以进行相关操作 */ if (null != histNum) { } //处理文件的保存 OnFile file = onlyServiceAPI.handlerStatus(jsonObject); //查询相同案件最新版本的文件信息 if (fileId != null && !"".equals(fileId)) { file = getNewFileInofoByFileId(fileId); } else { file = getNewFileInofoByCaseId(file.getCaseId()); } result = WebsocketResult.builder().onFile(file).userId(SecurityUtils.getUserSession().getId()).build(); log.info("处理文件的保存:" + JSON.toJSONString(jsonObject)); log.info("保存文件结束"); SecurityUtils.removeUserSession(); return result; } else if (0 == status || 2 == status || 4 == status) { onlyServiceAPI.close(jsonObject); log.info("文件关闭====",status); } else if (3 == status || 7 == status) { //保存文档错误 onlyServiceAPI.close(jsonObject); log.info("保存文档错误====",status); } else if (1 == status) { log.info("文件正在编辑====",status); //文件服务的回调 获取key判断当前文档有多少人在这使用 List actions = JSONObject.parseArray(jsonObject.getString("actions"), Map.class); if ((Integer) actions.get(0).get("type") == 1) { log.info("当前用户有[{}]", jsonObject.getString("users")); List users = JSONObject.parseArray(jsonObject.getString("users"), String.class); onlyServiceAPI.iskey(jsonObject.getString("key"), users.size()); } if ((Integer) actions.get(0).get("type") == 0) { onlyServiceAPI.iskey(jsonObject.getString("key"), null); } } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } return result; } @Autowired OnFileMapper onFileMapper; /** * 查询相同案件最新版本的文件信息 * * @param caseId * @return */ private OnFile getNewFileInofoByCaseId(String caseId) { OnFile file = new OnFile(); QueryWrapper fileQueryWrapper = new QueryWrapper<>(); fileQueryWrapper.eq("case_id", caseId); fileQueryWrapper.orderByDesc("created_time"); List onFiles = onFileMapper.selectList(fileQueryWrapper); if (onFiles != null && onFiles.size() > 0) { file = onFiles.get(0); } log.info("caseId:" + caseId + ":fileinfo:" + JSON.toJSONString(file)); return file; } /** * 根据文件的fileid查询文件信息 */ private OnFile getNewFileInofoByFileId(String fileId) { OnFile file = onFileMapper.selectById(fileId); if (file != null) { log.info("caseId:" + file.getCaseId() + ":fileinfo:" + JSON.toJSONString(file)); } else { log.info("根据文件id未查询到文件信息"); } return file; } }