许鹏程
2024-08-01 1be1f0f28ecb033290a1ce21996667c2f358fa86
src/main/java/com/product/file/controller/WebOfficeController.java
@@ -46,229 +46,238 @@
@Controller
public class WebOfficeController extends AbstractBaseController {
    @Autowired
    FileManagerService fileManagerService;
   @Autowired
   FileManagerService fileManagerService;
    @Autowired
    OnlineDocumentEditService onlineDocumentEditService;
   @Autowired
   OnlineDocumentEditService onlineDocumentEditService;
    /**
     * weboffice 获取文件
     *
     * @param response
     * @param request
     */
    @PostMapping("/get-nest-red-file/{version}")
    @ApiVersion(1)
    @ResponseBody
    public String getNestRedTemplate(HttpServletResponse response, HttpServletRequest request) {
   /**
    * weboffice 获取文件
    *
    * @param response
    * @param request
    */
   @PostMapping("/get-nest-red-file/{version}")
   @ApiVersion(1)
   @ResponseBody
   public String getNestRedTemplate(HttpServletResponse response, HttpServletRequest request) {
        try {
            //获取参数
            FieldSetEntity fse = null;
            Object bean = request.getAttribute(CoreConst.API_POST_REQUEST_DATA);
            File file = null;
            if (bean != null) {
                RequestParameterEntity reqp = (RequestParameterEntity) bean;
                fse = reqp.getFormData();
                file = reqp.getFiles().values().toArray(new File[1])[0];
            }
            onlineDocumentEditService.nestRedDocument(fse, file);
            //            byte[] document_templates = fileManagerService.getFileContent("1".equals(location) ? fse.getString("document_template") : fse.getString("document_template_tail"));
      try {
         //获取参数
         FieldSetEntity fse = null;
         Object bean = request.getAttribute(CoreConst.API_POST_REQUEST_DATA);
         File file = null;
         if (bean != null) {
            RequestParameterEntity reqp = (RequestParameterEntity) bean;
            fse = reqp.getFormData();
            file = reqp.getFiles().values().toArray(new File[1])[0];
         }
         onlineDocumentEditService.nestRedDocument(fse, file);
         //            byte[] document_templates = fileManagerService.getFileContent("1".equals(location) ? fse.getString("document_template") : fse.getString("document_template_tail"));
//            IoUtil.write(response.getOutputStream(), true, document_templates);
            return OK();
        } catch (BaseException e) {
            e.printStackTrace();
            return error(e);
        } catch (Exception e) {
            e.printStackTrace();
            SpringMVCContextHolder.getSystemLogger().error(e);
            return error(FileCode.NEST_RED_DOCUMENT_FAIL);
        }
    }
         return OK();
      } catch (BaseException e) {
         e.printStackTrace();
         return error(e);
      } catch (Exception e) {
         e.printStackTrace();
         SpringMVCContextHolder.getSystemLogger().error(e);
         return error(FileCode.NEST_RED_DOCUMENT_FAIL);
      }
   }
    /**
     * weboffice 获取文件
     *
     * @param response
     * @param request
     */
    @GetMapping("/get-file/{version}")
    @ApiVersion(1)
    public void getFile(HttpServletResponse response, HttpServletRequest request) {
        try {
            //获取参数
            FieldSetEntity fse = null;
            Object bean = request.getAttribute(CoreConst.API_POST_REQUEST_DATA);
            if (bean != null) {
                RequestParameterEntity reqp = (RequestParameterEntity) bean;
                fse = reqp.getFormData();
            }
            String uuid = fse.getString("uuid");
            onlineDocumentEditService.getFile(response, uuid);
   /**
    * weboffice 获取文件
    *
    * @param response
    * @param request
    */
   @GetMapping("/get-file/{version}")
   @ApiVersion(1)
   public void getFile(HttpServletResponse response, HttpServletRequest request) {
      try {
         //获取参数
         FieldSetEntity fse = null;
         Object bean = request.getAttribute(CoreConst.API_POST_REQUEST_DATA);
         if (bean != null) {
            RequestParameterEntity reqp = (RequestParameterEntity) bean;
            fse = reqp.getFormData();
         }
         String uuid = fse.getString("uuid");
         onlineDocumentEditService.getFile(response, uuid);
//            IoUtil.write(response.getOutputStream(), true, fileManagerService.getFileContent(uuid));
        } catch (Exception e) {
            try {
                OutputStream outputStream = response.getOutputStream();
                outputStream.flush();
                outputStream.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
            SpringMVCContextHolder.getSystemLogger().error(e);
        }
    }
      } catch (Exception e) {
         try {
            OutputStream outputStream = response.getOutputStream();
            outputStream.flush();
            outputStream.close();
         } catch (IOException ex) {
            ex.printStackTrace();
         }
         e.printStackTrace();
         SpringMVCContextHolder.getSystemLogger().error(e);
      }
   }
    /**
     * weboffice 保存文件(自动、手动)
     *
     * @param request
     * @return
     */
    @PostMapping("/save-office/{version}")
    @ApiVersion(1)
    @ResponseBody
    public String saveOffice(HttpServletRequest request) {
        try {
            //获取参数
            FieldSetEntity fse = null;
            Map<String, File> files = null;
            Object bean = request.getAttribute(CoreConst.API_POST_REQUEST_DATA);
            if (bean != null) {
                RequestParameterEntity reqp = (RequestParameterEntity) bean;
                files = reqp.getFiles();
                fse = reqp.getFormData();
            }
            if (fse == null || StringUtils.isEmpty(fse.getUUID()) || files == null || files.size() <= 0 || StringUtils.isEmpty(fse.getString("key"))) {
                return error(FileCode.GET_DATA_FAIL);
            }
            onlineDocumentEditService.uploadFile(fse.getUUID(), files);
            return BaseUtil.success(null);
        } catch (BaseException e) {
            return error(e);
        } catch (Exception e) {
            e.printStackTrace();
            return error(FileCode.OFFICE_SAVE_FILE_FAIL);
        }
    }
   /**
    * weboffice 保存文件(自动、手动)
    *
    * @param request
    * @return
    */
   @PostMapping("/save-office/{version}")
   @ApiVersion(1)
   @ResponseBody
   public String saveOffice(HttpServletRequest request) {
      try {
         //获取参数
         FieldSetEntity fse = null;
         Map<String, File> files = null;
         Object bean = request.getAttribute(CoreConst.API_POST_REQUEST_DATA);
         if (bean != null) {
            RequestParameterEntity reqp = (RequestParameterEntity) bean;
            files = reqp.getFiles();
            fse = reqp.getFormData();
         }
         if (fse == null || StringUtils.isEmpty(fse.getUUID()) || files == null || files.size() <= 0 || StringUtils.isEmpty(fse.getString("key"))) {
            return error(FileCode.GET_DATA_FAIL);
         }
         onlineDocumentEditService.uploadFile(fse.getUUID(), files);
         return BaseUtil.success(null);
      } catch (BaseException e) {
         return error(e);
      } catch (Exception e) {
         e.printStackTrace();
         return error(FileCode.OFFICE_SAVE_FILE_FAIL);
      }
   }
    /**
     * weboffice 跳转 mvc
     *
     * @param model
     * @param request
     * @return
     */
    @GetMapping("/open-office/{version}")
    @ApiVersion(1)
    public String openOffice(Model model, HttpServletRequest request) {
   /**
    * weboffice 跳转 mvc
    *
    * @param model
    * @param request
    * @return
    */
   @GetMapping("/open-office/{version}")
   @ApiVersion(1)
   public String openOffice(Model model, HttpServletRequest request) {
        //获取参数
        FieldSetEntity fse = null;
        Object bean = request.getAttribute(CoreConst.API_POST_REQUEST_DATA);
        if (bean != null) {
            RequestParameterEntity reqp = (RequestParameterEntity) bean;
            fse = reqp.getFormData();
      try {
         //获取参数
         FieldSetEntity fse = null;
         Object bean = request.getAttribute(CoreConst.API_POST_REQUEST_DATA);
         if (bean != null) {
            RequestParameterEntity reqp = (RequestParameterEntity) bean;
            fse = reqp.getFormData();
//            System.out.println(formJson);
            System.out.println(SignUtil.getHmacSHA1(reqp.getFormJson(), Global.getSystemConfig("signature.key", "")));
        }
        //文件名(窗口的名字)
        String file_title = fse.getString("fileName");
        if (file_title == null) {
            file_title = "";
        } else {
            file_title = UnicodeUtil.toString(file_title);
        }
        SystemUser currentUser = SpringMVCContextHolder.getCurrentUser();
        //
        Boolean allowNestRed = false;
        String node_uuid = fse.getString("nodeUuid");
        String fileType = fse.getString("fileType");
        List<Object> nestRedDocumentParams = new ArrayList<>();
        // 判断是否为 流程节点中打开的文档  且是 word 类型
        if (!StringUtils.isEmpty(node_uuid) && ("doc".equals(fileType) || "docx".equals(fileType) || "wps".equals(fileType) || "wpt".equals(fileType))) {
            //获取流程节点信息
            FieldSetEntity node = onlineDocumentEditService.getBaseDao().getFieldSetEntity("product_sys_flow_node", node_uuid, false);
            if (!FieldSetEntity.isEmpty(node)) {
                //允许套红
                allowNestRed = node.getBoolean("allow_nest_red");
                if (allowNestRed) {
                    //查询套红配置模板
                    DataTableEntity dt = onlineDocumentEditService.getBaseDao().listTable("product_sys_document_nest_red_config");
                    if (!DataTableEntity.isEmpty(dt)) {
                        for (int i = 0; i < dt.getRows(); i++) {
                            FieldSetEntity fs = dt.getFieldSetEntity(i);
                            Map<Object, Object> values = fs.getValues();
            System.out.println(SignUtil.getHmacSHA1(reqp.getFormJson(), Global.getSystemConfig("signature.key", "")));
         }
         //文件名(窗口的名字)
         String file_title = fse.getString("fileName");
         FieldSetEntity fieldSetEntity = fileManagerService.getBaseDao().getFieldSetEntity("product_sys_attachments", fse.getString("uuid"), false);
         if (!FieldSetEntity.isEmpty(fieldSetEntity)) {
            file_title = fieldSetEntity.getString("file_name");
         }
//         if (file_title == null) {
//            file_title = "";
//         } else {
//            file_title = UnicodeUtil.toString(file_title);
//         }
         SystemUser currentUser = SpringMVCContextHolder.getCurrentUser();
         //
         Boolean allowNestRed = false;
         String node_uuid = fse.getString("nodeUuid");
         String fileType = fse.getString("fileType");
         List<Object> nestRedDocumentParams = new ArrayList<>();
         // 判断是否为 流程节点中打开的文档  且是 word 类型
         if (!StringUtils.isEmpty(node_uuid) && ("doc".equals(fileType) || "docx".equals(fileType) || "wps".equals(fileType) || "wpt".equals(fileType))) {
            //获取流程节点信息
            FieldSetEntity node = onlineDocumentEditService.getBaseDao().getFieldSetEntity("product_sys_flow_node", node_uuid, false);
            if (!FieldSetEntity.isEmpty(node)) {
               //允许套红
               allowNestRed = node.getBoolean("allow_nest_red");
               if (allowNestRed) {
                  //查询套红配置模板
                  DataTableEntity dt = onlineDocumentEditService.getBaseDao().listTable("product_sys_document_nest_red_config");
                  if (!DataTableEntity.isEmpty(dt)) {
                     for (int i = 0; i < dt.getRows(); i++) {
                        FieldSetEntity fs = dt.getFieldSetEntity(i);
                        Map<Object, Object> values = fs.getValues();
                            values.put("token", SpringMVCContextHolder.getCurrentUser().getToken_info());
                            values.put("~table~", "product_sys_document_nest_red_config");
                            values.put("file_uuid", fse.getUUID());
                            //将模板配置信息 转为字符串
                            HashMap<Object, Object> v = (HashMap<Object, Object>) values;
                            v = (HashMap<Object, Object>) v.clone();
                            v.remove("title");
                            v.remove("description");
                            String params = JSON.toJSONString(v);
                            // 配置信息签名 (用于套红时 GET 请求)
                            String signature = SignUtil.getHmacSHA1(params, Global.getSystemConfig("signature.key", ""));
                            values.put("signature", signature);
                            values.put("formJson", params);
                            nestRedDocumentParams.add(values);
                        }
                    }
                }
            }
        }
        model.addAttribute("nestDocument", nestRedDocumentParams);
        model.addAttribute("allow_nest_red", allowNestRed);
        model.addAttribute("file_title", file_title);
        model.addAttribute(CmnConst.UUID, fse.getUUID());
        model.addAttribute("user_name", currentUser.getUser_name());
        //不能修改此参数,参数和签名绑定修改参数需要更新签名
        model.addAttribute(CoreConst.API_POST_REQUEST_DATA + "Temp", request.getParameter("formData"));
        //使用第一次传输过来的签名用于获取文件 、保存文件
        model.addAttribute("signature", request.getParameter("signature"));
        model.addAttribute("transportProtocols", "http");
        model.addAttribute("port", Global.getSystemConfig("server.port", ""));
        return "webOffice";
    }
                        values.put("token", SpringMVCContextHolder.getCurrentUser().getToken_info());
                        values.put("~table~", "product_sys_document_nest_red_config");
                        values.put("file_uuid", fse.getUUID());
                        //将模板配置信息 转为字符串
                        HashMap<Object, Object> v = (HashMap<Object, Object>) values;
                        v = (HashMap<Object, Object>) v.clone();
                        v.remove("title");
                        v.remove("description");
                        String params = JSON.toJSONString(v);
                        // 配置信息签名 (用于套红时 GET 请求)
                        String signature = SignUtil.getHmacSHA1(params, Global.getSystemConfig("signature.key", ""));
                        values.put("signature", signature);
                        values.put("formJson", params);
                        nestRedDocumentParams.add(values);
                     }
                  }
               }
            }
         }
         model.addAttribute("nestDocument", nestRedDocumentParams);
         model.addAttribute("allow_nest_red", allowNestRed);
         model.addAttribute("file_title", file_title);
         model.addAttribute(CmnConst.UUID, fse.getUUID());
         model.addAttribute("user_name", currentUser.getUser_name());
         //不能修改此参数,参数和签名绑定修改参数需要更新签名
         model.addAttribute(CoreConst.API_POST_REQUEST_DATA + "Temp", request.getParameter("formData"));
         //使用第一次传输过来的签名用于获取文件 、保存文件
         model.addAttribute("signature", request.getParameter("signature"));
         model.addAttribute("transportProtocols", "http");
         model.addAttribute("port", Global.getSystemConfig("server.port", ""));
         return "webOffice";
      } catch (Exception e) {
         e.printStackTrace();
         return "404";
      }
   }
    /**
     * 计划编辑文档
     *
     * @param request
     * @return
     */
    @PostMapping("/document-edit-plan/{version}")
    @ResponseBody
    @ApiVersion(1)
    public String documentEditPlan(HttpServletRequest request) {
        try {
            //获取参数
            FieldSetEntity fse = null;
            Object bean = request.getAttribute(CoreConst.API_POST_REQUEST_DATA);
            if (bean != null) {
                RequestParameterEntity reqp = (RequestParameterEntity) bean;
                fse = reqp.getFormData();
            }
            if (fse == null || StringUtils.isEmpty(fse.getUUID())) {
                return error(FileCode.GET_DATA_FAIL);
            }
            /**
             * 使用同步锁 防止并发打开相同的文件
             */
            synchronized (fse.getUUID().intern()) {
                onlineDocumentEditService.signDocumentEdit(fse.getUUID());
            }
            return OK();
        } catch (BaseException e) {
            return error(e);
        } catch (Exception e) {
            e.printStackTrace();
            return error(FileCode.SIGN_DOCUMENT_EDIT_STATUS_FAIL);
        }
    }
   /**
    * 计划编辑文档
    *
    * @param request
    * @return
    */
   @PostMapping("/document-edit-plan/{version}")
   @ResponseBody
   @ApiVersion(1)
   public String documentEditPlan(HttpServletRequest request) {
      try {
         //获取参数
         FieldSetEntity fse = null;
         Object bean = request.getAttribute(CoreConst.API_POST_REQUEST_DATA);
         if (bean != null) {
            RequestParameterEntity reqp = (RequestParameterEntity) bean;
            fse = reqp.getFormData();
         }
         if (fse == null || StringUtils.isEmpty(fse.getUUID())) {
            return error(FileCode.GET_DATA_FAIL);
         }
         /**
          * 使用同步锁 防止并发打开相同的文件
          */
         synchronized (fse.getUUID().intern()) {
            onlineDocumentEditService.signDocumentEdit(fse.getUUID());
         }
         return OK();
      } catch (BaseException e) {
         return error(e);
      } catch (Exception e) {
         e.printStackTrace();
         return error(FileCode.SIGN_DOCUMENT_EDIT_STATUS_FAIL);
      }
   }
//    /**
//     * 重置文档编辑时间