许鹏程
2023-08-08 90389e761696fc423cface6fb282514ace92d09f
xn commit
已修改4个文件
436 ■■■■ 文件已修改
src/main/java/com/product/file/controller/WebOfficeController.java 427 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/product/file/service/FileManagerService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/product/file/service/OnlineDocumentEditService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/product/file/util/PdfConcurrenceUtil.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/product/file/controller/WebOfficeController.java
@@ -46,229 +46,234 @@
@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");
            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);
        }
    }
//    /**
//     * 重置文档编辑时间
src/main/java/com/product/file/service/FileManagerService.java
@@ -560,7 +560,8 @@
     */
    public byte[] getFileContent(FieldSetEntity attachmentFse) throws BaseException {
        if (attachmentFse == null || !CmnConst.PRODUCT_SYS_ATTACHMENTS.equals(attachmentFse.getTableName())) {
            return new byte[16];
            //返回一个空的字节数组
            return new byte[0];
        }
        try (ByteArrayOutputStream os = new ByteArrayOutputStream();) {
            FTPService ftpService = new FTPService();
src/main/java/com/product/file/service/OnlineDocumentEditService.java
@@ -288,7 +288,7 @@
                    //正在被编辑
                    String existsKey = keys.toArray(new String[]{})[0];
                    //这里会抛出正在编辑的异常
                    throwBeingEditDocument(existsKey.substring(existsKey.lastIndexOf("-")));
                    throwBeingEditDocument(existsKey.substring(existsKey.lastIndexOf("-")+1));
                } else if (remove) {
                    RedisUtil.setOutTime(key, getExpirationTime());
                    return;
src/main/java/com/product/file/util/PdfConcurrenceUtil.java
@@ -190,7 +190,7 @@
        File outFile = null;
        OfficeManager officeManager = null;
        try {
            if(Global.getPropertyToBoolean("open.office.isEnable", "true")) {//启用oepn office转换
            if(Global.getPropertyToBoolean("open.office.isEnable", "false")) {//启用oepn office转换
                officeManager = officeManagerQueue.take();
                inputFile = new File(input);
                outFile = new File(output);
@@ -200,7 +200,7 @@
            }else{
                outFile = new File(AsposeUtil.OfficeToPdf(input, output,officeType));
            }
        }catch (Exception e) {
            outFile = null;
            throw e;