许鹏程
2024-07-17 a7e5e29bd9771b9cc65cfe09d213c470bbe4166b
src/main/java/com/product/file/service/OnlineDocumentEditService.java
@@ -38,284 +38,319 @@
@Service
@Primary
public class OnlineDocumentEditService extends AbstractBaseService implements IOnlineDocumentEditingService {
    /**
     * 文档编辑标识key
     */
    private final String DOCUMENT_EDIT_KEY = "document-edit:";
   /**
    * 文档编辑标识key
    */
   private final String DOCUMENT_EDIT_KEY = "document-edit:";
    @Autowired
    FileManagerService fileManagerService;
   @Autowired
   FileManagerService fileManagerService;
    @Autowired
    FileUtils fileUtils;
   @Autowired
   FileUtils fileUtils;
    /**
     * 文档套红
     *
     * @param ff
     * @param file
     */
    public void nestRedDocument(FieldSetEntity ff, File file) {
        try {
            String document_template = ff.getString("document_template");
            String document_template_tail = ff.getString("document_template_tail");
            List<File> fileList = new ArrayList<>(3);
            if (!StringUtils.isEmpty(document_template)) {
                fileList.add(fileManagerService.getFile(document_template));
                fileList.add(file);
            } else {
                fileList.add(file);
            }
            if (!StringUtils.isEmpty(document_template_tail)) {
                fileList.add(fileManagerService.getFile(document_template_tail));
            }
            File mergeFile = MergeDoc.mergeDoc(fileList, Global.getSystemConfig("upload.file.temp.path", "./attachment/temp") +
                    File.separator + "nest_red_document_" + IdUtil.randomUUID() + "_" + ff.getString("file_uuid"));
            if (mergeFile != null && mergeFile.isFile()) {
                HashMap<String, File> objectObjectHashMap = new HashMap<>();
                objectObjectHashMap.put("mergeFile", mergeFile);
                uploadFile(ff.getString("file_uuid"), objectObjectHashMap);
            } else {
                throw new BaseException(FileCode.NEST_RED_DOCUMENT_FAIL);
            }
        } catch (BaseException e) {
            throw e;
        } catch (Exception e) {
            throw new BaseException(FileCode.NEST_RED_DOCUMENT_FAIL);
        }
    }
   /**
    * 文档套红
    *
    * @param ff
    * @param file
    */
   public void nestRedDocument(FieldSetEntity ff, File file) {
      try {
         String document_template = ff.getString("document_template");
         String document_template_tail = ff.getString("document_template_tail");
         String fileUuid = ff.getString("file_uuid");
         FieldSetEntity fieldSetEntity = getBaseDao().getFieldSetEntity(CmnConst.PRODUCT_SYS_ATTACHMENTS, fileUuid, false);
         //获取文件类型
         String fileName = fieldSetEntity.getString(CmnConst.FILE_NAME);
         //判断是否为doc文件
         String fileType = fileName.substring(fileName.lastIndexOf(".") + 1);
         if ("doc".equals(fileType)) {
            //将doc文件转换为docx文件
            File f = file;
            file = com.product.file.util.FileUtil.toDocx(file);
            if (f != null) {
               f.delete();
            }
         }
         List<File> fileList = new ArrayList<>(3);
         if (!StringUtils.isEmpty(document_template)) {
            File file1 = fileManagerService.getFile(document_template);
            //判断file1的文件类型
            if (file1.getName().substring(file1.getName().lastIndexOf(".") + 1).equals("doc")) {
               //转换为docx
               File docx = com.product.file.util.FileUtil.toDocx(file1);
               FileUtil.del(file1);
               file1 = docx;
            }
            fileList.add(file1);
            fileList.add(file);
         } else {
            fileList.add(file);
         }
         if (!StringUtils.isEmpty(document_template_tail)) {
            fileList.add(fileManagerService.getFile(document_template_tail));
         }
         File mergeFile = MergeDoc.mergeDoc(fileList, Global.getSystemConfig("upload.file.temp.path", "./attachment/temp") +
               File.separator + "nest_red_document_" + IdUtil.randomUUID() + "_" + ff.getString("file_uuid"));
         if (mergeFile != null && mergeFile.isFile()) {
            if ("doc".equals(fileType)) {
               //将docx文件转换为doc文件
               File f = mergeFile;
               mergeFile = com.product.file.util.FileUtil.toDoc(f);
               if (f != null) {
                  f.delete();
               }
            }
            HashMap<String, File> objectObjectHashMap = new HashMap<>();
            objectObjectHashMap.put("mergeFile", mergeFile);
            uploadFile(ff.getString("file_uuid"), objectObjectHashMap);
         } else {
            throw new BaseException(FileCode.NEST_RED_DOCUMENT_FAIL);
         }
         fileList.forEach(FileUtil::del);
      } catch (BaseException e) {
         throw e;
      } catch (Exception e) {
         e.printStackTrace();
         throw new BaseException(FileCode.NEST_RED_DOCUMENT_FAIL);
      }
   }
    /**
     * 在线预览或编辑获取文件
     *
     * @param response
     * @param uuid
     * @throws IOException
     */
    public void getFile(HttpServletResponse response, String uuid) throws IOException {
        String currentUserId = SpringMVCContextHolder.getCurrentUserId();
        if (StringUtils.isEmpty(currentUserId)) {
            return;
        }
        String redisKey = this.DOCUMENT_EDIT_KEY + uuid + "-" + currentUserId;
        //在redis中获取缓存 根据缓存是否存在判断该文件是否标识为正在编辑的状态
        Map<String, Object> map = (Map<String, Object>) RedisUtil.get(redisKey);  //查询文件记录
        FieldSetEntity fse = getBaseDao().getFieldSetEntity(CmnConst.PRODUCT_SYS_ATTACHMENTS, uuid, false);
        if (FieldSetEntity.isEmpty(fse)) {
            throw new BaseException(FileCode.GET_FILE_RECORD_FAIL);
        }
        if (map != null) {
            //正在编辑 准备输出已编辑过但未提交的文件
            String dir = fse.getString(CmnConst.ATTACHMENT_URL);
            String fileName = fse.getString(CmnConst.ATTACHMENT_TITLE);
            //已编辑未提交的文件路径
            try {
                File sourceFile = fileUtils.getFile(fse.getBoolean(CmnConst.UPLOAD_SIGN), dir, fileName + "_" + currentUserId + "_" + map.get("uniqueKey"), fse.getBoolean(CmnConst.ENCRPT_SIGN));
                if (sourceFile != null && sourceFile.isFile()) {
                    //输出
                    IoUtil.write(response.getOutputStream(), true, FileUtil.readBytes(sourceFile));
                    sourceFile.delete();
                    return;
                }
            } catch (BaseException e) {
                //捕获异常
            }
        }
        IoUtil.write(response.getOutputStream(), true, fileManagerService.getFileContent(fse));
    }
   /**
    * 在线预览或编辑获取文件
    *
    * @param response
    * @param uuid
    * @throws IOException
    */
   public void getFile(HttpServletResponse response, String uuid) throws IOException {
      String currentUserId = SpringMVCContextHolder.getCurrentUserId();
      if (StringUtils.isEmpty(currentUserId)) {
         return;
      }
      String redisKey = this.DOCUMENT_EDIT_KEY + uuid + "-" + currentUserId;
      //在redis中获取缓存 根据缓存是否存在判断该文件是否标识为正在编辑的状态
      Map<String, Object> map = (Map<String, Object>) RedisUtil.get(redisKey);  //查询文件记录
      FieldSetEntity fse = getBaseDao().getFieldSetEntity(CmnConst.PRODUCT_SYS_ATTACHMENTS, uuid, false);
      if (FieldSetEntity.isEmpty(fse)) {
         throw new BaseException(FileCode.GET_FILE_RECORD_FAIL);
      }
      if (map != null) {
         //正在编辑 准备输出已编辑过但未提交的文件
         String dir = fse.getString(CmnConst.ATTACHMENT_URL);
         String fileName = fse.getString(CmnConst.ATTACHMENT_TITLE);
         //已编辑未提交的文件路径
         try {
            File sourceFile = fileUtils.getFile(fse.getBoolean(CmnConst.UPLOAD_SIGN), dir, fileName + "_" + currentUserId + "_" + map.get("uniqueKey"), fse.getBoolean(CmnConst.ENCRPT_SIGN));
            if (sourceFile != null && sourceFile.isFile()) {
               //输出
               IoUtil.write(response.getOutputStream(), true, FileUtil.readBytes(sourceFile));
               sourceFile.delete();
               return;
            }
         } catch (BaseException e) {
            //捕获异常
         }
      }
      IoUtil.write(response.getOutputStream(), true, fileManagerService.getFileContent(fse));
   }
    /**
     * 清空正在编辑文档状态 根据用户
     *
     * @param userId 用户id
     */
    public void clearBeingEditDocumentStatus(String userId) {
        if (StringUtils.isEmpty(userId)) {
            return;
        }
        //正则匹配redis中的key
        try (Jedis jedis = RedisUtil.getJedis()) {
            Set<String> keys = jedis.keys(this.DOCUMENT_EDIT_KEY + "*-" + userId);
            if (keys != null && keys.size() > 0) {
                //清空redis
                RedisUtil.del(keys.toArray(new String[keys.size()]));
            }
        }
    }
   /**
    * 清空正在编辑文档状态 根据用户
    *
    * @param userId 用户id
    */
   public void clearBeingEditDocumentStatus(String userId) {
      if (StringUtils.isEmpty(userId)) {
         return;
      }
      //正则匹配redis中的key
      try (Jedis jedis = RedisUtil.getJedis()) {
         Set<String> keys = jedis.keys(this.DOCUMENT_EDIT_KEY + "*-" + userId);
         if (keys != null && keys.size() > 0) {
            //清空redis
            RedisUtil.del(keys.toArray(new String[keys.size()]));
         }
      }
   }
    /**
     * 业务数据保存时底层调用此方法
     * 调用此方法后将文件标记为已保存 清除正在编辑的状态标识
     *
     * @param fileUuid 文件uuid
     * @param userId   操作人id
     * @return
     */
    @Override
    public boolean saveDocNotice(String fileUuid, int userId) throws BaseException {
   /**
    * 业务数据保存时底层调用此方法
    * 调用此方法后将文件标记为已保存 清除正在编辑的状态标识
    *
    * @param fileUuid 文件uuid
    * @param userId   操作人id
    * @return
    */
   @Override
   public boolean saveDocNotice(String fileUuid, int userId) throws BaseException {
        if (StringUtils.isEmpty(fileUuid)) {
            return false;
        }
        String[] fileUuids = fileUuid.split(",");
        //查询文件记录
        DataTableEntity dt = getBaseDao().listTable(CmnConst.PRODUCT_SYS_ATTACHMENTS, BaseUtil.buildQuestionMarkFilter("uuid", fileUuids, true));
        if (!DataTableEntity.isEmpty(dt)) {
      if (StringUtils.isEmpty(fileUuid)) {
         return false;
      }
      String[] fileUuids = fileUuid.split(",");
      //查询文件记录
      DataTableEntity dt = getBaseDao().listTable(CmnConst.PRODUCT_SYS_ATTACHMENTS, BaseUtil.buildQuestionMarkFilter("uuid", fileUuids, true));
      if (!DataTableEntity.isEmpty(dt)) {
//                throw new BaseException(FileCode.GET_FILE_RECORD_FAIL);
            for (int i = 0; i < dt.getRows(); i++) {
                FieldSetEntity fse = dt.getFieldSetEntity(i);
                try {
                    String redisKey = this.DOCUMENT_EDIT_KEY + fse.getUUID() + "-" + userId;
                    Map<String, Object> map = (Map<String, Object>) RedisUtil.get(redisKey);
                    if (map != null) {
                        String dir = fse.getString(CmnConst.ATTACHMENT_URL);
                        String fileName = fse.getString(CmnConst.ATTACHMENT_TITLE);
                        if (!fileUtils.fileIsExist(fse.getBoolean(CmnConst.UPLOAD_SIGN), dir, fileName)) {
                            continue;
                        }
                        //系统附件存放的根路径
                        File sourceFile = fileUtils.getFile(fse.getBoolean(CmnConst.UPLOAD_SIGN), dir, fileName + "_" + userId + "_" + map.get("uniqueKey"), fse.getBoolean(CmnConst.ENCRPT_SIGN));
                        if (sourceFile != null && sourceFile.isFile()) {
                            File targetFile = fileUtils.getFile(fse.getBoolean(CmnConst.UPLOAD_SIGN), dir, fileName, false);
                            if (targetFile != null && targetFile.isFile()) {
                                //备份源文件
                                fileUtils.uploadOtherFile(fse.getBoolean(CmnConst.ENCRPT_SIGN), dir, targetFile, fileName + "_back_" + userId + "_" + map.get("uniqueKey"));
                                targetFile.delete();
                            }
         for (int i = 0; i < dt.getRows(); i++) {
            FieldSetEntity fse = dt.getFieldSetEntity(i);
            try {
               String redisKey = this.DOCUMENT_EDIT_KEY + fse.getUUID() + "-" + userId;
               if (!RedisUtil.exists(redisKey)) {
                  continue;
               }
               Map<String, Object> map = (Map<String, Object>) RedisUtil.get(redisKey);
               if (map != null) {
                  String dir = fse.getString(CmnConst.ATTACHMENT_URL);
                  String fileName = fse.getString(CmnConst.ATTACHMENT_TITLE);
                  if (!fileUtils.fileIsExist(fse.getBoolean(CmnConst.UPLOAD_SIGN), dir, fileName)) {
                     continue;
                  }
                  //系统附件存放的根路径
                  File sourceFile = fileUtils.getFile(fse.getBoolean(CmnConst.UPLOAD_SIGN), dir, fileName + "_" + userId + "_" + map.get("uniqueKey"), fse.getBoolean(CmnConst.ENCRPT_SIGN));
                  if (sourceFile != null && sourceFile.isFile()) {
                     File targetFile = fileUtils.getFile(fse.getBoolean(CmnConst.UPLOAD_SIGN), dir, fileName, false);
                     if (targetFile != null && targetFile.isFile()) {
                        //备份源文件
                        fileUtils.uploadOtherFile(fse.getBoolean(CmnConst.ENCRPT_SIGN), dir, targetFile, fileName + "_back_" + userId + "_" + map.get("uniqueKey"));
                        targetFile.delete();
                     }
                            //将修改后的文件覆盖到源文件
                            fileUtils.replaceFile(dir, fileName, fse.getString(CmnConst.FILE_NAME), sourceFile, fse.getBoolean(CmnConst.ENCRPT_SIGN), fse.getBoolean(CmnConst.UPLOAD_SIGN), fse.getBoolean(CmnConst.VIEW_ONLINE_SIGN));
                            if (fse.getBoolean(CmnConst.ENCRPT_SIGN)) {
                                fileUtils.deleteFilesServerOnFile(dir, fileName + "_" + userId + "_" + map.get("uniqueKey"));
                            }
                            sourceFile.delete();
                        }
                    }
                    RedisUtil.del(redisKey);
                } catch (Exception e) {
                    e.printStackTrace();
                    SpringMVCContextHolder.getSystemLogger().error(e);
                     //将修改后的文件覆盖到源文件
                     fileUtils.replaceFile(dir, fileName, fse.getString(CmnConst.FILE_NAME), sourceFile, fse.getBoolean(CmnConst.ENCRPT_SIGN), fse.getBoolean(CmnConst.UPLOAD_SIGN), fse.getBoolean(CmnConst.VIEW_ONLINE_SIGN));
                     if (fse.getBoolean(CmnConst.ENCRPT_SIGN)) {
                        fileUtils.deleteFilesServerOnFile(dir, fileName + "_" + userId + "_" + map.get("uniqueKey"));
                     }
                     sourceFile.delete();
                  }
               }
               RedisUtil.del(redisKey);
            } catch (Exception e) {
               e.printStackTrace();
               SpringMVCContextHolder.getSystemLogger().error(e);
//                    return false;
                }
            }
        }
            }
         }
      }
        return true;
    }
      return true;
   }
    /**
     * weboffice 保存文件(手动、自动)
     *
     * @param uuid    文件的uuid
     * @param fileMap 新提交的文件
     * @throws BaseException
     */
    public void uploadFile(String uuid, Map<String, File> fileMap) throws BaseException {
        //查询文件记录
        FieldSetEntity fse = getBaseDao().getFieldSetEntity(CmnConst.PRODUCT_SYS_ATTACHMENTS, uuid, false);
        if (FieldSetEntity.isEmpty(fse)) {
            throw new BaseException(FileCode.GET_FILE_RECORD_FAIL);
        }
        String userId = SpringMVCContextHolder.getCurrentUserId();
        if (StringUtils.isEmpty(userId)) {
            return;
        }
        //获取源文件路径
        String dir = fse.getString(CmnConst.ATTACHMENT_URL);
        String fileName = fse.getString(CmnConst.ATTACHMENT_TITLE);
        if (!fileUtils.fileIsExist(fse.getBoolean(CmnConst.UPLOAD_SIGN), dir, fileName)) {
            throw new BaseException(FileCode.INVALID_FILE_PATH);
        }
        String redisKey = this.DOCUMENT_EDIT_KEY + uuid + "-" + userId;
        Map<String, Object> map = (Map<String, Object>) RedisUtil.get(redisKey);
   /**
    * weboffice 保存文件(手动、自动)
    *
    * @param uuid    文件的uuid
    * @param fileMap 新提交的文件
    * @throws BaseException
    */
   public void uploadFile(String uuid, Map<String, File> fileMap) throws BaseException {
      //查询文件记录
      FieldSetEntity fse = getBaseDao().getFieldSetEntity(CmnConst.PRODUCT_SYS_ATTACHMENTS, uuid, false);
      if (FieldSetEntity.isEmpty(fse)) {
         throw new BaseException(FileCode.GET_FILE_RECORD_FAIL);
      }
      String userId = SpringMVCContextHolder.getCurrentUserId();
      if (StringUtils.isEmpty(userId)) {
         return;
      }
      //获取源文件路径
      String dir = fse.getString(CmnConst.ATTACHMENT_URL);
      String fileName = fse.getString(CmnConst.ATTACHMENT_TITLE);
      if (!fileUtils.fileIsExist(fse.getBoolean(CmnConst.UPLOAD_SIGN), dir, fileName)) {
         throw new BaseException(FileCode.INVALID_FILE_PATH);
      }
      String redisKey = this.DOCUMENT_EDIT_KEY + uuid + "-" + userId;
      Map<String, Object> map = (Map<String, Object>) RedisUtil.get(redisKey);
        //系统附件存放的根路径
        File file = fileMap.values().toArray(new File[]{})[0];
        if (fse.getBoolean(CmnConst.ENCRPT_SIGN)) {
            String filePath = Global.getSystemConfig("temp.dir", "") + "/onlineEdit_" + redisKey;
            //加密文件
            com.product.file.util.FileUtil.copyFile(file, filePath, 1);
            file.delete();
            file = new File(filePath);
        }
        FileUtils.uploadOtherFile(fse.getBoolean(CmnConst.ENCRPT_SIGN), dir, file, fileName + "_" + userId + "_" + map.get("uniqueKey"));
        file.delete();
    }
      //系统附件存放的根路径
      File file = fileMap.values().toArray(new File[]{})[0];
      if (fse.getBoolean(CmnConst.ENCRPT_SIGN)) {
         String filePath = Global.getSystemConfig("temp.dir", "") + "/onlineEdit_" + redisKey;
         //加密文件
         com.product.file.util.FileUtil.copyFile(file, filePath, 1);
         file.delete();
         file = new File(filePath);
      }
      FileUtils.uploadOtherFile(fse.getBoolean(CmnConst.ENCRPT_SIGN), dir, file, fileName + "_" + userId + "_" + map.get("uniqueKey"));
      file.delete();
   }
    public void deleteFile(String dir, String fileName) {
        SystemUser currentUser = SpringMVCContextHolder.getCurrentUser();
        if (currentUser != null && !StringUtils.isEmpty(currentUser.getToken_info())) {
   public void deleteFile(String dir, String fileName) {
      SystemUser currentUser = SpringMVCContextHolder.getCurrentUser();
      if (currentUser != null && !StringUtils.isEmpty(currentUser.getToken_info())) {
//            TokenValidateInterceptor
        }
    }
      }
   }
    /**
     * 获取过期时间
     *
     * @return 过期时间 单位 秒
     */
    private int getExpirationTime() {
        int refreshTokenExpiration = Global.getPropertyToInteger("refresh.token.expiration", "8") * 60 * 60;
        int tokenExpiration = Global.getPropertyToInteger("token.expiration", (8 * 60) + "") * 60;
   /**
    * 获取过期时间
    *
    * @return 过期时间 单位 秒
    */
   private int getExpirationTime() {
      int refreshTokenExpiration = Global.getPropertyToInteger("refresh.token.expiration", "8") * 60 * 60;
      int tokenExpiration = Global.getPropertyToInteger("token.expiration", (8 * 60) + "") * 60;
        return refreshTokenExpiration > tokenExpiration ? refreshTokenExpiration : tokenExpiration;
    }
      return refreshTokenExpiration > tokenExpiration ? refreshTokenExpiration : tokenExpiration;
   }
    /**
     * 标识文档正在编辑
     *
     * @param fileUuid
     * @return
     */
    public void signDocumentEdit(String fileUuid) throws BaseException {
        String userId = SpringMVCContextHolder.getCurrentUserId();
        if (StringUtils.isEmpty(userId)) {
            throw new BaseException(FileCode.GET_FILE_RECORD_FAIL);
        }
        String key = this.DOCUMENT_EDIT_KEY + fileUuid + "-" + userId;
        try (Jedis jedis = RedisUtil.getJedis()) {
            //模糊匹配key
            Set<byte[]> keyBytes = jedis.keys((this.DOCUMENT_EDIT_KEY + fileUuid + "-*").getBytes(StandardCharsets.UTF_8));
            if (!CollectionUtil.isEmpty(keyBytes)) {
                Set<String> keys = keyBytes.stream().map(item -> new String(item, StandardCharsets.UTF_8)).collect(Collectors.toSet());
                boolean remove = keys.remove(this.DOCUMENT_EDIT_KEY + fileUuid + "-" + userId);
                if (keys != null && keys.size() > 0) {
                    //正在被编辑
                    String existsKey = keys.toArray(new String[]{})[0];
                    //这里会抛出正在编辑的异常
                    throwBeingEditDocument(existsKey.substring(existsKey.lastIndexOf("-")));
                } else if (remove) {
                    RedisUtil.setOutTime(key, getExpirationTime());
                    return;
                }
            }
   /**
    * 标识文档正在编辑
    *
    * @param fileUuid
    * @return
    */
   public void signDocumentEdit(String fileUuid) throws BaseException {
      String userId = SpringMVCContextHolder.getCurrentUserId();
      if (StringUtils.isEmpty(userId)) {
         throw new BaseException(FileCode.GET_FILE_RECORD_FAIL);
      }
      String key = this.DOCUMENT_EDIT_KEY + fileUuid + "-" + userId;
      try (Jedis jedis = RedisUtil.getJedis()) {
         //模糊匹配key
         Set<byte[]> keyBytes = jedis.keys((this.DOCUMENT_EDIT_KEY + fileUuid + "-*").getBytes(StandardCharsets.UTF_8));
         if (!CollectionUtil.isEmpty(keyBytes)) {
            Set<String> keys = keyBytes.stream().map(item -> new String(item, StandardCharsets.UTF_8)).collect(Collectors.toSet());
            boolean remove = keys.remove(this.DOCUMENT_EDIT_KEY + fileUuid + "-" + userId);
            if (keys != null && keys.size() > 0) {
               //正在被编辑
               String existsKey = keys.toArray(new String[]{})[0];
               //这里会抛出正在编辑的异常
               throwBeingEditDocument(existsKey.substring(existsKey.lastIndexOf("-") + 1));
            } else if (remove) {
               RedisUtil.setOutTime(key, getExpirationTime());
               return;
            }
         }
            Map<String, Object> params = new HashMap<>();
            params.put("userId", userId);
            params.put("fileUuid", fileUuid);
            params.put("uniqueKey", IdUtil.randomUUID());
            RedisUtil.set(key, params);
            RedisUtil.setOutTime(key, getExpirationTime());
        }
    }
         Map<String, Object> params = new HashMap<>();
         params.put("userId", userId);
         params.put("fileUuid", fileUuid);
         params.put("uniqueKey", IdUtil.randomUUID());
         RedisUtil.set(key, params);
         RedisUtil.setOutTime(key, getExpirationTime());
      }
   }
    /**
     * 正在编辑文档错误抛出
     *
     * @param userId
     * @throws BaseException
     */
    private void throwBeingEditDocument(Object userId) throws BaseException {
        FieldSetEntity userInfo = BaseUtil.getSingleInfoByCache("用户缓存", new String[]{String.valueOf(userId)});
        String user_name;
        if (userInfo != null && !StringUtils.isEmpty(userInfo.getString("user_name"))) {
            user_name = userInfo.getString("user_name");
        } else {
            user_name = "未知用户";
        }
        throw new BaseException(FileCode.DOCUMENT_BEING_EDITED.getValue(), FileCode.DOCUMENT_BEING_EDITED.getText().replace("{{userName}}", user_name));
    }
   /**
    * 正在编辑文档错误抛出
    *
    * @param userId
    * @throws BaseException
    */
   private void throwBeingEditDocument(Object userId) throws BaseException {
      FieldSetEntity userInfo = BaseUtil.getSingleInfoByCache("用户缓存", new String[]{String.valueOf(userId)});
      String user_name;
      if (userInfo != null && !StringUtils.isEmpty(userInfo.getString("user_name"))) {
         user_name = userInfo.getString("user_name");
      } else {
         user_name = "未知用户";
      }
      throw new BaseException(FileCode.DOCUMENT_BEING_EDITED.getValue(), FileCode.DOCUMENT_BEING_EDITED.getText().replace("{{userName}}", user_name));
   }
}