From 34d46299a55db23c50bdcf28ca25372e6bf9d62c Mon Sep 17 00:00:00 2001 From: liuy <37787198+LiuyCodes@users.noreply.github.com> Date: Mon, 4 Nov 2024 17:47:29 +0800 Subject: [PATCH] =?UTF-8?q?feat(report):=20=E6=B7=BB=E5=8A=A0=E9=94=80?= =?UTF-8?q?=E5=94=AE=E6=8A=A5=E8=A1=A8=E5=AF=BC=E5=87=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 application-lets.yml 和 application-letsprod.yml 中添加报告相关配置 - 修改 TocofsSaleoutServiceImpl 中的导出逻辑,支持从配置文件读取模板路径 - 新增公共文件下载方法,用于处理导出文件下载 - 优化测试用例中的代码示例 --- .../src/main/resources/application-lets.yml | 5 ++ .../main/resources/application-letsprod.yml | 5 ++ .../outsourc/ConsignmachiningInTest.java | 2 +- excelfile/-4230453427123371202.xlsx | Bin 0 -> 4115 bytes .../impl/TocofsSaleoutServiceImpl.java | 58 ++++++++---- .../controler/EntranceController.java | 83 ++++++++++++------ .../entrance/util/FileDownloadUtil.java | 55 ++++++++++++ 7 files changed, 163 insertions(+), 45 deletions(-) create mode 100644 excelfile/-4230453427123371202.xlsx create mode 100644 webapp/src/main/java/com/hzya/frame/webapp/entrance/util/FileDownloadUtil.java diff --git a/buildpackage/src/main/resources/application-lets.yml b/buildpackage/src/main/resources/application-lets.yml index 619d0cb6..ce7ecb8a 100644 --- a/buildpackage/src/main/resources/application-lets.yml +++ b/buildpackage/src/main/resources/application-lets.yml @@ -51,6 +51,11 @@ letsofs: appKey: 2097046829 secret: 35282f251476a3af4f00c7b36 +#report +report: + templatesurl: /Users/liuyang/workspaces/hzya/kangarooDataCenterV3/service/src/main/resources/template/TOCTOB正向流程导出模版.xlsx + tempFile: /Users/liuyang/workspaces/hzya/tempfile + #钉钉 DING: U8C_TEST_AGENTID: 3281181231 diff --git a/buildpackage/src/main/resources/application-letsprod.yml b/buildpackage/src/main/resources/application-letsprod.yml index f93f402c..ece1547f 100644 --- a/buildpackage/src/main/resources/application-letsprod.yml +++ b/buildpackage/src/main/resources/application-letsprod.yml @@ -43,6 +43,11 @@ letsofs: appKey: 2097046829 secret: 35282f251476a3af4f00c7b36 +#report +report: + templatesurl: D:\server\tempFile\TOCTOB正向流程导出模版.xlsx + tempFile: D:\server\tempFile + #钉钉 DING: U8C_TEST_AGENTID: 3281181231 diff --git a/buildpackage/src/test/java/com/hzya/frame/plugin/lets/plugin/outsourc/ConsignmachiningInTest.java b/buildpackage/src/test/java/com/hzya/frame/plugin/lets/plugin/outsourc/ConsignmachiningInTest.java index 6df6ef5e..560ede9a 100644 --- a/buildpackage/src/test/java/com/hzya/frame/plugin/lets/plugin/outsourc/ConsignmachiningInTest.java +++ b/buildpackage/src/test/java/com/hzya/frame/plugin/lets/plugin/outsourc/ConsignmachiningInTest.java @@ -27,7 +27,7 @@ public class ConsignmachiningInTest { @Test public void startImplement() { // String code = "LETS-RE2024082300000007"; - String code = "LETS-RE2024102200000018"; + String code = "LETS-RE2024103000000089"; consignmachiningIn.startImplement(code); // consignmachiningIn.startImplement("2024-09-24 13:49:15", "2024-09-24 13:49:17"); diff --git a/excelfile/-4230453427123371202.xlsx b/excelfile/-4230453427123371202.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..86d6d8a7148df394a490b4482788d7587dbcecea GIT binary patch literal 4115 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 literal 0 HcmV?d00001 diff --git a/service/src/main/java/com/hzya/frame/report/lets/service/impl/TocofsSaleoutServiceImpl.java b/service/src/main/java/com/hzya/frame/report/lets/service/impl/TocofsSaleoutServiceImpl.java index 1a4ccc4a..4b4fa769 100644 --- a/service/src/main/java/com/hzya/frame/report/lets/service/impl/TocofsSaleoutServiceImpl.java +++ b/service/src/main/java/com/hzya/frame/report/lets/service/impl/TocofsSaleoutServiceImpl.java @@ -23,6 +23,7 @@ import com.hzya.frame.uuid.UUIDLong; import com.hzya.frame.web.entity.BaseResult; import com.hzya.frame.web.entity.JsonResultEntity; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.File; @@ -54,6 +55,7 @@ public class TocofsSaleoutServiceImpl extends BaseService tocofsSaleoutDetailedEntityList = (List) jsonResultEntity.getAttribute(); EasyExcel.write(excelFile[0], TocofsSaleoutDetailedDto.class).withTemplate(templateFileName).sheet().doWrite(tocofsSaleoutDetailedEntityList); + return BaseResult.getSuccessMessageEntity(excelFile[1]); } else if (businessType.equals("TOB_ORDER")) { List tobofsSaleoutDetailedEntityList = (List) jsonResultEntity.getAttribute(); EasyExcel.write(excelFile[0], TobofsSaleoutDetailedDto.class).withTemplate(templateFileName).sheet().doWrite(tobofsSaleoutDetailedEntityList); + return BaseResult.getSuccessMessageEntity(excelFile[1]); } else { return BaseResult.getFailureMessageEntity("查询失败,无法确定TOB、TOC!请选择:TOC_ORDER、或者TOB_ORDER!"); } @@ -187,13 +200,17 @@ public class TocofsSaleoutServiceImpl extends BaseService tocofsReturnGoodsDetailedDtos = iTocofsReturngoodsDetailedDao.queryEntityListBaseToc(tocofsSaleoutDetailedEntity); return BaseResult.getSuccessMessageEntity("查询成功", tocofsReturnGoodsDetailedDtos); - } else if (businessType.equals("TOB_ORDER")) { + } else if (businessType.equals("TOB_RETURN")) { //TOB退货 List tobofsReturnGoodsDetailedDtos = iTocofsReturngoodsDetailedDao.queryEntityListBaseTob(tocofsSaleoutDetailedEntity); return BaseResult.getSuccessMessageEntity("查询成功", tobofsReturnGoodsDetailedDtos); @@ -333,22 +351,30 @@ public class TocofsSaleoutServiceImpl extends BaseService tocofsSaleoutDetailedEntityList = (List) jsonResultEntity.getAttribute(); - EasyExcel.write(excelFile[0], TocofsSaleoutDetailedDto.class).withTemplate(templateFileName).sheet().doWrite(tocofsSaleoutDetailedEntityList); - } else if (businessType.equals("TOB_ORDER")) { - List tobofsSaleoutDetailedEntityList = (List) jsonResultEntity.getAttribute(); - EasyExcel.write(excelFile[0], TobofsSaleoutDetailedDto.class).withTemplate(templateFileName).sheet().doWrite(tobofsSaleoutDetailedEntityList); + if (businessType.equals("TOC_RETURN")) { + List tocofsSaleoutDetailedEntityList = (List) jsonResultEntity.getAttribute(); + EasyExcel.write(excelFile[0], TocofsReturnGoodsDetailedDto.class).withTemplate(templateFileName).sheet().doWrite(tocofsSaleoutDetailedEntityList); + return BaseResult.getSuccessMessageEntity(excelFile[1]); + } else if (businessType.equals("TOB_RETURN")) { + List tobofsSaleoutDetailedEntityList = (List) jsonResultEntity.getAttribute(); + EasyExcel.write(excelFile[0], TobofsReturnGoodsDetailedDto.class).withTemplate(templateFileName).sheet().doWrite(tobofsSaleoutDetailedEntityList); + return BaseResult.getSuccessMessageEntity(excelFile[1]); } else { return BaseResult.getFailureMessageEntity("查询失败,无法确定TOB、TOC!请选择:TOC_ORDER、或者TOB_ORDER!"); } diff --git a/webapp/src/main/java/com/hzya/frame/webapp/entrance/controler/EntranceController.java b/webapp/src/main/java/com/hzya/frame/webapp/entrance/controler/EntranceController.java index d2d0df3c..f9b3403c 100644 --- a/webapp/src/main/java/com/hzya/frame/webapp/entrance/controler/EntranceController.java +++ b/webapp/src/main/java/com/hzya/frame/webapp/entrance/controler/EntranceController.java @@ -13,7 +13,9 @@ import com.hzya.frame.web.entity.BaseResult; import com.hzya.frame.web.entity.JsonResultEntity; import com.hzya.frame.web.exception.BaseSystemException; import com.hzya.frame.webapp.entrance.service.IEntranceService; +import com.hzya.frame.webapp.entrance.util.FileDownloadUtil; import org.apache.commons.io.FileUtils; +import org.apache.ibatis.annotations.Param; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -70,11 +72,13 @@ public class EntranceController { protected IFileDownloadService filedownloadService; @Resource protected ISysApplicationService sysApplicationService; + @RequestMapping(value = "/option") @ResponseBody public JsonResultEntity option(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { return entranceService.doBusiness(servletRequest, servletResponse); } + //平台接口 @RequestMapping(value = "/platformInterface") @ResponseBody @@ -93,11 +97,11 @@ public class EntranceController { JsonResultEntity jsonResultEntity = null; logger.info("-------------------开始调用上传文件upload接口-------------------"); try { - jsonResultEntity = entranceService.fileUpload(file, entity,servletRequest,servletResponse); + jsonResultEntity = entranceService.fileUpload(file, entity, servletRequest, servletResponse); entity.setSuccess(true); } catch (Exception e) { entity.setFileFlag(false); - logger.error("文件上传失败"+e.getMessage()); + logger.error("文件上传失败" + e.getMessage()); } logger.info("-------------------结束调用上传文件upload接口-------------------"); @@ -115,7 +119,7 @@ public class EntranceController { JsonResultEntity jsonResultEntity = null; logger.info("-------------------开始调用上传文件upload接口-------------------"); try { - jsonResultEntity = entranceService.fileUpload(file, entity,servletRequest,servletResponse); + jsonResultEntity = entranceService.fileUpload(file, entity, servletRequest, servletResponse); } catch (Exception e) { jsonResultEntity = BaseResult.getFailureMessageEntity(e.getMessage()); } @@ -125,11 +129,11 @@ public class EntranceController { @RequestMapping(value = "/pluginfileUpload", method = RequestMethod.POST) @ResponseBody - public JsonResultEntity pluginfileUpload(MultipartFile file, FileUploadDto entity,String pluginPackageName, ServletRequest servletRequest, ServletResponse servletResponse) { + public JsonResultEntity pluginfileUpload(MultipartFile file, FileUploadDto entity, String pluginPackageName, ServletRequest servletRequest, ServletResponse servletResponse) { JsonResultEntity jsonResultEntity = null; logger.info("-------------------开始调用上传插件附件upload接口-------------------"); try { - jsonResultEntity = entranceService.pluginfileUpload(file, entity,pluginPackageName,servletRequest,servletResponse); + jsonResultEntity = entranceService.pluginfileUpload(file, entity, pluginPackageName, servletRequest, servletResponse); } catch (Exception e) { jsonResultEntity = BaseResult.getFailureMessageEntity(e.getMessage()); } @@ -139,10 +143,10 @@ public class EntranceController { @ResponseBody @RequestMapping(value = "/pluginZipUpdate") - public JsonResultEntity pluginZipUpate(FileUploadDto fileUploadDto){ + public JsonResultEntity pluginZipUpate(FileUploadDto fileUploadDto) { JsonResultEntity jsonResultEntity = null; logger.info("-------------------开始调用插件更新接口-------------------"); - try{ + try { jsonResultEntity = entranceService.pluginZipUpate(fileUploadDto); } catch (Exception e) { jsonResultEntity = BaseResult.getFailureMessageEntity(e.getMessage()); @@ -152,13 +156,12 @@ public class EntranceController { } - - /** - * 根据文件保存的新名称下载文件 - * - * @param fileSaveName - * @return - */ + /** + * 根据文件保存的新名称下载文件 + * + * @param fileSaveName + * @return + */ @RequestMapping(value = "/option/fileDownload") public ResponseEntity fileDownload(String fileSaveName) { ResponseEntity responseEntity = null; @@ -174,17 +177,18 @@ public class EntranceController { responseEntity = new ResponseEntity(FileUtils.readFileToByteArray(fileDownloadEntity.getFile()), headers, HttpStatus.CREATED); } catch (Exception e) { - logger.error("文件下载失败"+e.getMessage()); + logger.error("文件下载失败" + e.getMessage()); } return responseEntity; } + /** * 根据文件保存的新名称下载文件 * * @return */ @RequestMapping(value = "/fileDownloadNew") - public ResponseEntity fileDownloadNew(String id) throws Exception { + public ResponseEntity fileDownloadNew(String id) throws Exception { ResponseEntity responseEntity = null; try { HttpHeaders headers = new HttpHeaders(); @@ -197,42 +201,65 @@ public class EntranceController { headers.setContentDispositionFormData("attachment", fileName); responseEntity = new ResponseEntity(FileUtils.readFileToByteArray(fileDownloadEntity.getFile()), headers, HttpStatus.CREATED); } catch (IOException e) { - logger.error("文件下载失败"+e.getMessage()); + logger.error("文件下载失败" + e.getMessage()); } catch (BaseSystemException e) { - logger.error("文件下载失败"+e.getMessage()); + logger.error("文件下载失败" + e.getMessage()); } return responseEntity; } + @RequestMapping(value = "/testOption") @ResponseBody - public EsbReturnEntity testOption(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { - return entranceService.doTstsBusiness(servletRequest,servletResponse); + public EsbReturnEntity testOption(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { + return entranceService.doTstsBusiness(servletRequest, servletResponse); } @RequestMapping(value = "/externalCallInterface") @ResponseBody - public JsonResultEntity externalCallInterface(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { - return sysApplicationService.externalCallInterface(servletRequest,servletResponse); + public JsonResultEntity externalCallInterface(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { + return sysApplicationService.externalCallInterface(servletRequest, servletResponse); } @RequestMapping(value = "/externalCallInterfaceResend") @ResponseBody - public JsonResultEntity externalCallInterfaceResend(SysMessageManageLogEntity resendLogEntity) throws Exception { - return sysApplicationService.externalCallInterfaceResend(resendLogEntity); + public JsonResultEntity externalCallInterfaceResend(SysMessageManageLogEntity resendLogEntity) throws Exception { + return sysApplicationService.externalCallInterfaceResend(resendLogEntity); } @RequestMapping(value = "/externalCallInterfaceToESB") @ResponseBody - public JsonResultEntity externalCallInterfaceToESB(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { - return sysApplicationService.externalCallInterfaceToESB(servletRequest,servletResponse); + public JsonResultEntity externalCallInterfaceToESB(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { + return sysApplicationService.externalCallInterfaceToESB(servletRequest, servletResponse); } @RequestMapping(value = "/erpSso") @ResponseBody - public String erpSso(HttpServletRequest request, HttpServletResponse response, String ticket) throws Exception { - response.sendRedirect(bipSsoService.erpSso(request,ticket)); + public String erpSso(HttpServletRequest request, HttpServletResponse response, String ticket) throws Exception { + response.sendRedirect(bipSsoService.erpSso(request, ticket)); return null; } + @Value("${report.tempFile}") + private String reportTempFile; + /** + * 公共文件文件下载 + */ + @RequestMapping(value = "/option/downFilesBasedFileNameFileType") + public void downFilesBasedFileNameFileType(HttpServletRequest request, HttpServletResponse response, @Param("filename") String filename) { + try { + StringBuffer filePath = new StringBuffer(); + filePath.append(reportTempFile); + filePath.append(File.separator); + filePath.append("excelfile"); + filePath.append(File.separator); + filePath.append(filename); + + //处理文件下载或者预览 + FileDownloadUtil.downLoad(filePath.toString(), response, false, "附件下载.xlsx"); + } catch (Exception e) { + e.printStackTrace(); + logger.error("downFilesBasedFileNameFileType", e.getMessage()); + } + } } diff --git a/webapp/src/main/java/com/hzya/frame/webapp/entrance/util/FileDownloadUtil.java b/webapp/src/main/java/com/hzya/frame/webapp/entrance/util/FileDownloadUtil.java new file mode 100644 index 00000000..d073a241 --- /dev/null +++ b/webapp/src/main/java/com/hzya/frame/webapp/entrance/util/FileDownloadUtil.java @@ -0,0 +1,55 @@ +package com.hzya.frame.webapp.entrance.util; + +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.OutputStream; +import java.net.URL; + +/** + * 文件下载处理方法 + * + * @Author:liuyang + * @Package:com.hzya.frame.webapp.entrance.util + * @Project:kangarooDataCenter + * @name:FileDownloadUtil + * @Date:2024/7/19 17:08 + * @Filename:FileDownloadUtil + */ +public class FileDownloadUtil { + /** + * 加载打开文件 + * + * @param filePath 文件地址 + * @param response 响应对象 + * @param isOnLine 是否在线打开 + */ + public static void downLoad(String filePath, HttpServletResponse response, boolean isOnLine, String filename) throws Exception { + File f = new File(filePath); + if (!f.exists()) { + response.sendError(404, "File not found!"); + return; + } + BufferedInputStream br = new BufferedInputStream(new FileInputStream(f)); + byte[] buf = new byte[1024]; + int len = 0; + + response.reset(); //非常重要 + if (isOnLine) { //在线打开方式 + URL u = new URL("file:///" + filePath); + response.setContentType(u.openConnection().getContentType()); + response.setHeader("Content-Disposition", "inline; filename=" + new String((filename).getBytes("UTF-8"), "ISO8859-1")); + //文件名应该编码成UTF-8 + } else { //纯下载方式 + response.setContentType("application/x-msdownload"); + response.setHeader("Content-Disposition", "attachment; filename=" + new String(filename.getBytes("UTF-8"), "ISO8859-1")); + } + OutputStream out = response.getOutputStream(); + while ((len = br.read(buf)) > 0) { + out.write(buf, 0, len); + } + br.close(); + out.close(); + } +} \ No newline at end of file