From 0b9ed93fc142be36af437b59a6f0b1dbe3e2fa2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B1=AA=E4=BA=91=E6=98=8A?= Date: Fri, 14 Jun 2019 10:48:18 +0800 Subject: [PATCH 1/3] =?UTF-8?q?redis=E8=B5=84=E6=BA=90=E9=94=AE=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../estsh/i3plus/core/apiservice/controller/base/WhiteController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java index 9bfd0b2..8e8145f 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java @@ -219,10 +219,10 @@ public class WhiteController extends CoreBaseController { } // 从缓存获取语言信息 - Map resourceMap = redisRes.getHashMap(CommonConstWords.REDIS_PREFIX_CACHE_LANGUAGE + languageCode); + Map resourceMap = redisRes.getHashMap(CommonConstWords.REDIS_PREFIX_CACHE_LANGUAGE + ":" + languageCode); if (resourceMap == null || resourceMap.size() == 0) { systemInitService.putAndLoadSysLocaleLanguage(); - resourceMap = redisRes.getHashMap(CommonConstWords.REDIS_PREFIX_CACHE_LANGUAGE + languageCode); + resourceMap = redisRes.getHashMap(CommonConstWords.REDIS_PREFIX_CACHE_LANGUAGE + ":" + languageCode); } return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultMap(resourceMap); From 90561827e58bda74cbd3fbddd529f140b811a518 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B1=AA=E4=BA=91=E6=98=8A?= Date: Fri, 14 Jun 2019 16:21:50 +0800 Subject: [PATCH 2/3] =?UTF-8?q?excel=E5=B7=A5=E5=85=B7=E7=B1=BB=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/busi/SysDictionaryController.java | 15 +- .../controller/busi/SysLogExceptionController.java | 30 +- .../controller/busi/SysLogOperateController.java | 29 +- .../controller/busi/SysLogSystemController.java | 22 +- .../controller/busi/SysMenuController.java | 7 +- .../controller/busi/SysOrderNoRuleController.java | 62 ++- .../controller/busi/SysUserInfoController.java | 26 +- .../serviceimpl/base/SystemInitService.java | 10 +- .../serviceimpl/busi/SysFileServiceImpl.java | 34 +- .../i3plus/core/apiservice/util/ExcelUtil.java | 445 --------------------- .../i3plus/core/apiservice/util/FileUtil.java | 108 ----- .../estsh/i3plus/core/apiservice/util/ZipUtil.java | 181 --------- .../src/main/resources/init/sys-config.xlsx | Bin 37800 -> 37882 bytes .../cn/estsh/i3plus/core/apiservice/mq/TestMQ.java | 3 +- .../core/apiservice/serviceimpl/busi/TestUser.java | 2 +- .../i3plus/core/apiservice/util/ExcelReadData.java | 4 +- .../i3plus/core/apiservice/util/JavaTest.java | 5 +- .../i3plus/core/apiservice/util/TestExcelUtil.java | 3 +- 18 files changed, 116 insertions(+), 870 deletions(-) delete mode 100644 modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/ExcelUtil.java delete mode 100644 modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/FileUtil.java delete mode 100644 modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/ZipUtil.java diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysDictionaryController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysDictionaryController.java index 00b6ecf..9c8ff11 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysDictionaryController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysDictionaryController.java @@ -1,6 +1,7 @@ package cn.estsh.i3plus.core.apiservice.controller.busi; import cn.estsh.i3plus.core.api.iservice.busi.ISysDictionaryService; +import cn.estsh.i3plus.core.apiservice.serviceimpl.base.SystemInitService; import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum; import cn.estsh.i3plus.platform.common.tool.StringTool; @@ -44,7 +45,10 @@ public class SysDictionaryController extends CoreBaseController{ public static final Logger LOGGER = LoggerFactory.getLogger(SysConfigController.class); @Autowired - public ISysDictionaryService sysDictionaryService; + private ISysDictionaryService sysDictionaryService; + + @Autowired + private SystemInitService systemInitService; /** * 添加字典 @@ -72,6 +76,9 @@ public class SysDictionaryController extends CoreBaseController{ sysDictionary.setIsDefault(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); sysDictionaryService.insertSysDictionary(sysDictionary); + + // 更新缓存信息 + systemInitService.putAndLoadSysDictionary(); return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ return ResultBean.fail(busExcep); @@ -119,6 +126,9 @@ public class SysDictionaryController extends CoreBaseController{ ConvertBean.modelUpdate(sysDictionary,user); sysDictionaryService.updateSysDictionary(sysDictionary); + + // 更新缓存信息 + systemInitService.putAndLoadSysDictionary(); return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ return ResultBean.fail(busExcep); @@ -169,6 +179,9 @@ public class SysDictionaryController extends CoreBaseController{ } sysDictionaryService.deleteSysDictionaryById(Long.parseLong(idStr)); + + // 更新缓存信息 + systemInitService.putAndLoadSysDictionary(); return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ return ResultBean.fail(busExcep); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogExceptionController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogExceptionController.java index 83f7e97..0144cfd 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogExceptionController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogExceptionController.java @@ -1,12 +1,9 @@ package cn.estsh.i3plus.core.apiservice.controller.busi; -import cn.estsh.i3plus.core.api.iservice.busi.ISysConfigService; -import cn.estsh.i3plus.core.api.iservice.busi.ISysDictionaryService; -import cn.estsh.i3plus.core.api.iservice.busi.ISysFileService; -import cn.estsh.i3plus.core.api.iservice.busi.ISysLogExceptionService; -import cn.estsh.i3plus.core.apiservice.util.ExcelUtil; -import cn.estsh.i3plus.core.apiservice.util.FileUtil; -import cn.estsh.i3plus.core.apiservice.util.ZipUtil; +import cn.estsh.i3plus.core.api.iservice.busi.*; +import cn.estsh.i3plus.platform.common.tool.ExcelTool; +import cn.estsh.i3plus.platform.common.tool.FileTool; +import cn.estsh.i3plus.platform.common.tool.ZipTool; import cn.estsh.i3plus.platform.common.util.PlatformConstWords; import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; @@ -20,6 +17,7 @@ import cn.estsh.impp.framework.boot.exception.ImppExceptionEnum; import cn.estsh.impp.framework.boot.util.ResultBean; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.apache.commons.compress.archivers.zip.ZipUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -49,14 +47,14 @@ public class SysLogExceptionController extends CoreBaseController { private ISysLogExceptionService sysLogExceptionService; @Autowired - private ISysDictionaryService sysDictionaryService; - - @Autowired private ISysConfigService sysConfigService; @Autowired private ISysFileService sysFileService; + @Autowired + private ISysMessageService sysMessageService; + /** * 异常日志复杂查询,分页,排序 * @param sysLogException 查询条件 @@ -84,7 +82,7 @@ public class SysLogExceptionController extends CoreBaseController { @ApiOperation(value = "获取系统操作日志字段") public ResultBean getSysLogExceptionCol(){ try { - return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultMap(ExcelUtil.getColName(SysLogException.class)); + return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultMap(ExcelTool.getColName(SysLogException.class)); }catch(ImppBusiException busExcep){ return ResultBean.fail(busExcep); }catch(Exception e){ @@ -140,7 +138,7 @@ public class SysLogExceptionController extends CoreBaseController { excelFile = new File(excelDir + File.separator + SysLogException.class.getSimpleName() + pager.getCurrentPage() + ".xls"); excelFile.createNewFile(); - ExcelUtil.exportData(excelFile, listPager.getObjectList(), SysLogException.class, colName); + ExcelTool.exportData(excelFile, listPager.getObjectList(), SysLogException.class, colName); result.add(sysFileService.uploadFile(excelFile)); pager.setCurrentPage(pager.getCurrentPage() + 1); @@ -148,9 +146,9 @@ public class SysLogExceptionController extends CoreBaseController { // 将所有excel文件打包 if(isZip){ - zipFile = ZipUtil.zipFile(null, excelDir); + zipFile = ZipTool.zipFile(null, excelDir); result.add(sysFileService.uploadFile(zipFile)); - ExcelUtil.sendStationLetter(result,getSessionUser().getUser().getId()); + sysMessageService.doSendSysMessage(ExcelTool.sendStationLetter(result,getSessionUser().getUser().getId())); return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultList(result); } else { return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultList(result); @@ -162,9 +160,9 @@ public class SysLogExceptionController extends CoreBaseController { } finally { // 清理临时文件文件 if (zipFile != null) { - FileUtil.deletefile(zipFile.getPath()); + FileTool.deleteFile(zipFile.getPath()); } - FileUtil.deletefile(excelDir.getPath()); + FileTool.deleteFile(excelDir.getPath()); } } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogOperateController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogOperateController.java index d3c236f..bc5f4c2 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogOperateController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogOperateController.java @@ -1,12 +1,9 @@ package cn.estsh.i3plus.core.apiservice.controller.busi; -import cn.estsh.i3plus.core.api.iservice.busi.ISysConfigService; -import cn.estsh.i3plus.core.api.iservice.busi.ISysDictionaryService; -import cn.estsh.i3plus.core.api.iservice.busi.ISysFileService; -import cn.estsh.i3plus.core.api.iservice.busi.ISysLogOperateService; -import cn.estsh.i3plus.core.apiservice.util.ExcelUtil; -import cn.estsh.i3plus.core.apiservice.util.FileUtil; -import cn.estsh.i3plus.core.apiservice.util.ZipUtil; +import cn.estsh.i3plus.core.api.iservice.busi.*; +import cn.estsh.i3plus.platform.common.tool.ExcelTool; +import cn.estsh.i3plus.platform.common.tool.FileTool; +import cn.estsh.i3plus.platform.common.tool.ZipTool; import cn.estsh.i3plus.platform.common.util.PlatformConstWords; import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; @@ -26,7 +23,6 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import javax.websocket.server.PathParam; import java.io.File; import java.util.ArrayList; import java.util.Date; @@ -57,6 +53,9 @@ public class SysLogOperateController extends CoreBaseController { @Autowired private ISysFileService sysFileService; + @Autowired + private ISysMessageService sysMessageService; + /** * 添加操作日志 * @param logOperate 操作日志 @@ -165,7 +164,7 @@ public class SysLogOperateController extends CoreBaseController { @ApiOperation(value = "获取系统操作日志字段") public ResultBean getSysLogOperateCol(){ try { - return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultMap(ExcelUtil.getColName(SysLogOperate.class)); + return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultMap(ExcelTool.getColName(SysLogOperate.class)); }catch(ImppBusiException busExcep){ return ResultBean.fail(busExcep); }catch(Exception e){ @@ -221,7 +220,7 @@ public class SysLogOperateController extends CoreBaseController { excelFile = new File(excelDir + File.separator + SysLogOperate.class.getSimpleName() + pager.getCurrentPage() + ".xls"); excelFile.createNewFile(); - ExcelUtil.exportData(excelFile, listPager.getObjectList(), SysLogOperate.class, colName); + ExcelTool.exportData(excelFile, listPager.getObjectList(), SysLogOperate.class, colName); result.add(sysFileService.uploadFile(excelFile)); pager.setCurrentPage(pager.getCurrentPage() + 1); @@ -229,9 +228,9 @@ public class SysLogOperateController extends CoreBaseController { // 将所有excel文件打包 if(isZip){ - zipFile = ZipUtil.zipFile(null, excelDir); + zipFile = ZipTool.zipFile(null, excelDir); result.add(sysFileService.uploadFile(zipFile)); - ExcelUtil.sendStationLetter(result,getSessionUser().getUser().getId()); + sysMessageService.doSendSysMessage(ExcelTool.sendStationLetter(result,getSessionUser().getUser().getId())); return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultList(result); } else { return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultList(result); @@ -242,11 +241,9 @@ public class SysLogOperateController extends CoreBaseController { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } finally { // 清理临时文件文件 - // 清理临时文件文件 - if (zipFile != null) { - FileUtil.deletefile(zipFile.getPath()); + if(excelDir == null) { + FileTool.deleteFile(excelDir.getPath()); } - FileUtil.deletefile(excelDir.getPath()); } } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogSystemController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogSystemController.java index ee07de4..01fcbc9 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogSystemController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogSystemController.java @@ -3,9 +3,10 @@ package cn.estsh.i3plus.core.apiservice.controller.busi; import cn.estsh.i3plus.core.api.iservice.busi.ISysConfigService; import cn.estsh.i3plus.core.api.iservice.busi.ISysFileService; import cn.estsh.i3plus.core.api.iservice.busi.ISysLogSystemService; -import cn.estsh.i3plus.core.apiservice.util.ExcelUtil; -import cn.estsh.i3plus.core.apiservice.util.FileUtil; -import cn.estsh.i3plus.core.apiservice.util.ZipUtil; +import cn.estsh.i3plus.core.api.iservice.busi.ISysMessageService; +import cn.estsh.i3plus.platform.common.tool.ExcelTool; +import cn.estsh.i3plus.platform.common.tool.FileTool; +import cn.estsh.i3plus.platform.common.tool.ZipTool; import cn.estsh.i3plus.platform.common.util.PlatformConstWords; import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; @@ -52,6 +53,9 @@ public class SysLogSystemController extends CoreBaseController{ @Autowired private ISysFileService sysFileService; + @Autowired + private ISysMessageService sysMessageService; + /** * 新增系统日志 * @param logSystem 系统日志 @@ -153,7 +157,7 @@ public class SysLogSystemController extends CoreBaseController{ @ApiOperation(value = "获取系统日志字段") public ResultBean getSysLogSystem(){ try { - return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultMap(ExcelUtil.getColName(SysLogSystem.class)); + return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultMap(ExcelTool.getColName(SysLogSystem.class)); }catch(ImppBusiException busExcep){ return ResultBean.fail(busExcep); }catch(Exception e){ @@ -209,7 +213,7 @@ public class SysLogSystemController extends CoreBaseController{ excelFile = new File(excelDir + File.separator + SysLogSystem.class.getSimpleName() + pager.getCurrentPage() + ".xls"); excelFile.createNewFile(); - ExcelUtil.exportData(excelFile, listPager.getObjectList(), SysLogSystem.class, colName); + ExcelTool.exportData(excelFile, listPager.getObjectList(), SysLogSystem.class, colName); result.add(sysFileService.uploadFile(excelFile)); pager.setCurrentPage(pager.getCurrentPage() + 1); @@ -217,9 +221,9 @@ public class SysLogSystemController extends CoreBaseController{ // 将所有excel文件打包 if(isZip){ - zipFile = ZipUtil.zipFile(null, excelDir); + zipFile = ZipTool.zipFile(null, excelDir); result.add(sysFileService.uploadFile(zipFile)); - ExcelUtil.sendStationLetter(result,getSessionUser().getUser().getId()); + sysMessageService.doSendSysMessage(ExcelTool.sendStationLetter(result,getSessionUser().getUser().getId())); return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultList(result); } else { return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultList(result); @@ -231,9 +235,9 @@ public class SysLogSystemController extends CoreBaseController{ } finally { // 清理临时文件文件 if (zipFile != null) { - FileUtil.deletefile(zipFile.getPath()); + FileTool.deleteFile(zipFile.getPath()); } - FileUtil.deletefile(excelDir.getPath()); + FileTool.deleteFile(excelDir.getPath()); } } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysMenuController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysMenuController.java index d080548..6ca9757 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysMenuController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysMenuController.java @@ -1,9 +1,9 @@ package cn.estsh.i3plus.core.apiservice.controller.busi; import cn.estsh.i3plus.core.api.iservice.busi.ISysMenuService; -import cn.estsh.i3plus.core.apiservice.util.ExcelUtil; import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum; +import cn.estsh.i3plus.platform.common.tool.ExcelTool; import cn.estsh.i3plus.platform.common.tool.StringTool; import cn.estsh.i3plus.platform.common.util.PlatformConstWords; import cn.estsh.i3plus.pojo.base.bean.ListPager; @@ -18,7 +18,6 @@ import cn.estsh.impp.framework.boot.util.ResultBean; import cn.estsh.impp.framework.boot.util.ValidatorBean; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -298,7 +297,7 @@ public class SysMenuController extends CoreBaseController { .setErrorDetail("请选择需要上传的文件。") .build(); } - List list = ExcelUtil.importData("permission.xls",multipart.getInputStream(), SysMenu.class); + List list = ExcelTool.importData("permission.xls",multipart.getInputStream(), SysMenu.class); Map map = new HashMap<>(); list.forEach(menu -> { @@ -355,7 +354,7 @@ public class SysMenuController extends CoreBaseController { File file = new File(fileName); file.createNewFile(); - File excle = ExcelUtil.exportData(file, list, SysMenu.class, new String[]{ + File excle = ExcelTool.exportData(file, list, SysMenu.class, new String[]{ "menuCode", "name","parentId","menuType","menuStatus","parentNameRdd","menuUrl","menuClassPath","menuGrade","menuSort" ,"menuCss","menuIcon","menuDescription" }); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysOrderNoRuleController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysOrderNoRuleController.java index b9a4709..0159b0f 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysOrderNoRuleController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysOrderNoRuleController.java @@ -1,26 +1,21 @@ package cn.estsh.i3plus.core.apiservice.controller.busi; -import cn.estsh.i3plus.core.api.iservice.busi.ISysConfigService; -import cn.estsh.i3plus.core.api.iservice.busi.ISysDictionaryService; -import cn.estsh.i3plus.core.api.iservice.busi.ISysFileService; -import cn.estsh.i3plus.core.api.iservice.busi.ISysOrderNoRuleService; -import cn.estsh.i3plus.core.apiservice.util.ExcelUtil; -import cn.estsh.i3plus.core.apiservice.util.FileUtil; -import cn.estsh.i3plus.core.apiservice.util.ZipUtil; +import cn.estsh.i3plus.core.api.iservice.busi.*; +import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum; +import cn.estsh.i3plus.platform.common.tool.ExcelTool; +import cn.estsh.i3plus.platform.common.tool.FileTool; import cn.estsh.i3plus.platform.common.tool.StringTool; +import cn.estsh.i3plus.platform.common.tool.ZipTool; import cn.estsh.i3plus.platform.common.util.PlatformConstWords; -import cn.estsh.i3plus.pojo.base.bean.BaseConstWords; import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil; -import cn.estsh.i3plus.pojo.platform.bean.SysDictionary; import cn.estsh.i3plus.pojo.platform.bean.SysFile; import cn.estsh.i3plus.pojo.platform.bean.SysOrderNoRule; import cn.estsh.impp.framework.base.controller.CoreBaseController; import cn.estsh.impp.framework.boot.exception.ImppBusiException; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; -import cn.estsh.impp.framework.boot.exception.ImppExceptionEnum; import cn.estsh.impp.framework.boot.fastdfs.FastDFSClient; import cn.estsh.impp.framework.boot.fastdfs.FastDFSFile; import cn.estsh.impp.framework.boot.util.ResultBean; @@ -61,6 +56,9 @@ public class SysOrderNoRuleController extends CoreBaseController { private ISysFileService sysFileService; @Autowired + private ISysMessageService sysMessageService; + + @Autowired private FastDFSClient dfsClient; /** @@ -255,21 +253,21 @@ public class SysOrderNoRuleController extends CoreBaseController { listPager = sysOrderNoRuleService.querySysOrderNoRuleByPager(sysOrderNoRule, pager); pager = listPager.getObjectPager(); - // 将excel导出至临时文件夹并上传 + // 将excel导出至临时文件夹 excelFile = new File(excelDir + File.separator + SysOrderNoRule.class.getSimpleName() + pager.getCurrentPage() + ".xls"); excelFile.createNewFile(); - ExcelUtil.exportData(excelFile, listPager.getObjectList(), SysOrderNoRule.class, colName); + ExcelTool.exportData(excelFile, listPager.getObjectList(), SysOrderNoRule.class, colName); pager.setCurrentPage(pager.getCurrentPage() + 1); } while (pager.getCurrentPage() <= pager.getTotalPages()); // 将所有excel文件打包 - zipFile = ZipUtil.zipFile(null, excelDir); + zipFile = ZipTool.zipFile(null, excelDir); result.add(sysFileService.uploadFile(zipFile)); // 是否发送站内信 if (isZip) { - ExcelUtil.sendStationLetter(result, getSessionUser().getUser().getId()); + sysMessageService.doSendSysMessage(ExcelTool.sendStationLetter(result, getSessionUser().getUser().getId())); } return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultList(result); @@ -280,10 +278,10 @@ public class SysOrderNoRuleController extends CoreBaseController { } finally { // 清理临时文件文件 if (zipFile != null) { - FileUtil.deletefile(zipFile.getPath()); + FileTool.deleteFile(zipFile.getPath()); } if (excelDir != null) { - FileUtil.deletefile(excelDir.getPath()); + FileTool.deleteFile(excelDir.getPath()); } } } @@ -292,7 +290,7 @@ public class SysOrderNoRuleController extends CoreBaseController { @ApiOperation(value = "导入单号规则") public ResultBean importSysOrderNoRule(@RequestParam("file") MultipartFile file) { try { - List sysOrderNoRuleList = ExcelUtil.importData(file.getOriginalFilename(), file.getInputStream(), SysOrderNoRule.class); + List sysOrderNoRuleList = ExcelTool.importData(file.getOriginalFilename(), file.getInputStream(), SysOrderNoRule.class); // 初始化数据 for (SysOrderNoRule sysOrderNoRule : sysOrderNoRuleList) { sysOrderNoRule.setOrderNoRuleStatus(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); @@ -312,28 +310,20 @@ public class SysOrderNoRuleController extends CoreBaseController { public ResultBean downSysOrderNoRuleTemplate() { try { startMultiService(); + String importTemplateCode = SysOrderNoRule.class.getSimpleName() + "ImportTemplate"; - FastDFSFile fastDFSFile = new FastDFSFile(SysOrderNoRule.class.getSimpleName() + "ImportTemplate.xls", - ExcelUtil.importTemplate(SysOrderNoRule.class), "xls"); + // 查询服务器中是否存在模板文件 + SysFile sysFile = sysFileService.getSysFileByFileCode(importTemplateCode); + if(sysFile == null){ + FastDFSFile fastDFSFile = new FastDFSFile(SysOrderNoRule.class.getSimpleName() + "ImportTemplate.xls", + ExcelTool.importTemplate(SysOrderNoRule.class), ".xls"); - String[] fileAbsolutePath = dfsClient.upload(fastDFSFile); + sysFile = dfsClient.upload(fastDFSFile,CommonEnumUtil.SOFT_TYPE.CORE.getValue()); + sysFile.setFileCode(importTemplateCode); + sysFileService.insertSysFile(sysFile); - // 保证系统文件表中 - String filePath = dfsClient.getHostUi() + "/" + fileAbsolutePath[0] + "/" + fileAbsolutePath[1]; - SysDictionary dictionary = sysDictionaryService.getSysDictionaryByParentCodeAndCode( - BaseConstWords.DICTIONARY_FILE_TYPE, fastDFSFile.getExt()); + } - SysFile sysFile = new SysFile(); - sysFile.setDfsGroupName(fileAbsolutePath[0]); - sysFile.setDfsFileName(fileAbsolutePath[1]); - sysFile.setFileSoftType(CommonEnumUtil.SOFT_TYPE.CORE.getValue()); - sysFile.setFileSize(fastDFSFile.getContent().length); - sysFile.setFilePath(filePath); - sysFile.setFileOriginalName(fastDFSFile.getName()); - sysFile.setFileTypeId(dictionary.getId()); - sysFile.setFileTypeName(dictionary.getName()); - sysFile.setDownloadNum(0); - sysFileService.insertSysFile(sysFile); return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultObject(sysFile); } catch (ImppBusiException busExcep) { @@ -347,7 +337,7 @@ public class SysOrderNoRuleController extends CoreBaseController { @ApiOperation(value = "获取单号规则字段") public ResultBean getSysOrderNoRuleColName() { try { - return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultMap(ExcelUtil.getColName(SysOrderNoRule.class)); + return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultMap(ExcelTool.getColName(SysOrderNoRule.class)); } catch (ImppBusiException busExcep) { return ResultBean.fail(busExcep); } catch (Exception e) { diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserInfoController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserInfoController.java index e959c88..1314ead 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserInfoController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserInfoController.java @@ -1,10 +1,11 @@ package cn.estsh.i3plus.core.apiservice.controller.busi; import cn.estsh.i3plus.core.api.iservice.busi.*; -import cn.estsh.i3plus.core.apiservice.util.ExcelUtil; -import cn.estsh.i3plus.core.apiservice.util.FileUtil; -import cn.estsh.i3plus.core.apiservice.util.ZipUtil; import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum; +import cn.estsh.i3plus.platform.common.tool.ExcelTool; +import cn.estsh.i3plus.platform.common.tool.FileTool; +import cn.estsh.i3plus.platform.common.tool.ZipTool; import cn.estsh.i3plus.platform.common.tool.StringTool; import cn.estsh.i3plus.platform.common.util.PlatformConstWords; import cn.estsh.i3plus.pojo.base.bean.ListPager; @@ -17,11 +18,12 @@ import cn.estsh.impp.framework.base.controller.CoreBaseController; import cn.estsh.impp.framework.boot.auth.AuthUtil; import cn.estsh.impp.framework.boot.exception.ImppBusiException; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; -import cn.estsh.impp.framework.boot.exception.ImppExceptionEnum; import cn.estsh.impp.framework.boot.util.ResultBean; import cn.estsh.impp.framework.boot.util.ValidatorBean; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.apache.commons.compress.archivers.zip.ZipUtil; +import org.aspectj.util.FileUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -61,6 +63,9 @@ public class SysUserInfoController extends CoreBaseController{ @Autowired private ISysFileService sysFileService; + @Autowired + private ISysMessageService sysMessageService; + /** * 添加用户信息 * @param userInfo 用户信息 @@ -407,7 +412,7 @@ public class SysUserInfoController extends CoreBaseController{ excelFile = new File(excelDir + File.separator + SysUserInfo.class.getSimpleName() + pager.getCurrentPage() + ".xls"); excelFile.createNewFile(); - ExcelUtil.exportData(excelFile, listPager.getObjectList(), SysUserInfo.class, colName); + ExcelTool.exportData(excelFile, listPager.getObjectList(), SysUserInfo.class, colName); result.add(sysFileService.uploadFile(excelFile)); pager.setCurrentPage(pager.getCurrentPage() + 1); @@ -415,9 +420,9 @@ public class SysUserInfoController extends CoreBaseController{ // 将所有excel文件打包 if(isZip){ - zipFile = ZipUtil.zipFile(null, excelDir); + zipFile = ZipTool.zipFile(null, excelDir); result.add(sysFileService.uploadFile(zipFile)); - ExcelUtil.sendStationLetter(result,getSessionUser().getUser().getId()); + sysMessageService.doSendSysMessage(ExcelTool.sendStationLetter(result,getSessionUser().getUser().getId())); return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultList(result); } else { return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultList(result); @@ -428,10 +433,9 @@ public class SysUserInfoController extends CoreBaseController{ return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } finally { // 清理临时文件文件 - if (zipFile != null) { - FileUtil.deletefile(zipFile.getPath()); + if(excelDir != null){ + FileTool.deleteFile(excelDir.getPath()); } - FileUtil.deletefile(excelDir.getPath()); } } @@ -443,7 +447,7 @@ public class SysUserInfoController extends CoreBaseController{ @ApiOperation(value = "获取用户可导出字段") public ResultBean getSysUserInfoColName(){ try { - return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultMap(ExcelUtil.getColName(SysUserInfo.class)); + return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultMap(ExcelTool.getColName(SysUserInfo.class)); }catch(ImppBusiException busExcep){ return ResultBean.fail(busExcep); }catch(Exception e){ diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SystemInitService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SystemInitService.java index 20b5200..107bb59 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SystemInitService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SystemInitService.java @@ -67,7 +67,7 @@ public class SystemInitService implements ISystemInitService { redisKey = CommonConstWords.REDIS_PREFIX_CACHE_CONFIG + ":" + config.getConfigCode(); //存放于缓存 - putDataToCache(redisKey, config,SysConfig.class); + putDataToCache(redisKey, config,Object.class); } LOGGER.info("加载系统配置数量:【{}】",list.size()); } @@ -85,12 +85,12 @@ public class SystemInitService implements ISystemInitService { for (String key : parentCodeMap.keySet()) { //存放于缓存 putDataToCache(CommonConstWords.REDIS_PREFIX_CACHE_DICTIONARY + ":" + key, - parentCodeMap.get(key),List.class); + parentCodeMap.get(key),Object.class); } for (long key : parentIdMap.keySet()) { putDataToCache(CommonConstWords.REDIS_PREFIX_CACHE_DICTIONARY + ":" + key, - parentIdMap.get(key),List.class); + parentIdMap.get(key),Object.class); } } }catch (Exception e){ @@ -165,8 +165,8 @@ public class SystemInitService implements ISystemInitService { LOGGER.info(" Put Cache Redis Key:{},value:{},dataType:{}",key,data,dataType); // Redis 缓存 if(dataType == List.class){ - redisRes.putList(key,data,-1); - }else if(dataType == SysConfig.class){ + redisRes.putObject(key,data,-1); + }else if(dataType == Object.class){ redisRes.putObject(key,data,-1); }else{ LOGGER.error("不支持树形{}存放缓存!",dataType); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysFileServiceImpl.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysFileServiceImpl.java index 40efe5c..e5de0ef 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysFileServiceImpl.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysFileServiceImpl.java @@ -1,15 +1,12 @@ package cn.estsh.i3plus.core.apiservice.serviceimpl.busi; import cn.estsh.i3plus.core.api.iservice.busi.ISysFileService; -import cn.estsh.i3plus.core.apiservice.util.FileUtil; +import cn.estsh.i3plus.platform.common.tool.FileTool; import cn.estsh.i3plus.platform.common.tool.StringTool; -import cn.estsh.i3plus.platform.common.tool.TimeTool; -import cn.estsh.i3plus.pojo.base.bean.BaseConstWords; import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.base.common.PagerHelper; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; -import cn.estsh.i3plus.pojo.platform.bean.SysDictionary; import cn.estsh.i3plus.pojo.platform.bean.SysFile; import cn.estsh.i3plus.pojo.platform.repository.SysDictionaryRepository; import cn.estsh.i3plus.pojo.platform.repository.SysFileRepository; @@ -24,6 +21,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; + import java.io.File; import java.util.List; @@ -132,37 +130,13 @@ public class SysFileServiceImpl implements ISysFileService { FastDFSFile fastDFSFile; // 判断参数类型 if (file instanceof File) { - fastDFSFile = new FastDFSFile((( File ) file).getName(), FileUtil.file2Byte((( File ) file).getPath()), + fastDFSFile = new FastDFSFile((( File ) file).getName(), FileTool.file2Byte((( File ) file).getPath()), StringTool.getStringFileSuffix((( File ) file).getName(), true)); } else { fastDFSFile = dfsClient.saveFile(( MultipartFile ) file); } - String[] fileAbsolutePath = dfsClient.upload(fastDFSFile); - - // 保存到系统文件表中 - LOGGER.info(" dfsClient ====>> " + dfsClient); - LOGGER.info(" fileAbsolutePath ====>> " + fileAbsolutePath); - String filePath = dfsClient.getHostUi() + "/" + fileAbsolutePath[0] + "/" + fileAbsolutePath[1]; - SysDictionary dictionary = sysDictionaryRDao.getByProperty(new String[]{"parentCodeRdd", "dictionaryValue"}, - new Object[]{BaseConstWords.DICTIONARY_FILE_TYPE, fastDFSFile.getExt()}); - - if (dictionary == null) { - dictionary = sysDictionaryRDao.getByProperty(new String[]{"parentCodeRdd", "dictionaryValue"}, - new Object[]{BaseConstWords.DICTIONARY_FILE_TYPE, "." + fastDFSFile.getExt()}); - } - - SysFile sysFile = new SysFile(); - sysFile.setDfsGroupName(fileAbsolutePath[0]); - sysFile.setDfsFileName(fileAbsolutePath[1]); - sysFile.setFileSoftType(CommonEnumUtil.SOFT_TYPE.CORE.getValue()); - sysFile.setFileSize(fastDFSFile.getContent().length); - sysFile.setFilePath(filePath); - sysFile.setFileOriginalName(fastDFSFile.getName()); - sysFile.setFileTypeId(dictionary.getId()); - sysFile.setFileTypeName(dictionary.getName()); - sysFile.setDownloadNum(0); - sysFile.setCreateDatetime(TimeTool.getNowTime(true)); + SysFile sysFile = dfsClient.upload(fastDFSFile,CommonEnumUtil.SOFT_TYPE.CORE.getValue()); return insertSysFile(sysFile); } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/ExcelUtil.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/ExcelUtil.java deleted file mode 100644 index 82ab984..0000000 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/ExcelUtil.java +++ /dev/null @@ -1,445 +0,0 @@ -package cn.estsh.i3plus.core.apiservice.util; - -import cn.estsh.i3plus.core.api.iservice.busi.ISysConfigService; -import cn.estsh.i3plus.core.api.iservice.busi.ISysDictionaryService; -import cn.estsh.i3plus.platform.common.tool.ReflexTool; -import cn.estsh.i3plus.platform.common.tool.StringTool; -import cn.estsh.i3plus.platform.common.tool.TimeTool; -import cn.estsh.i3plus.platform.common.util.PlatformConstWords; -import cn.estsh.i3plus.pojo.base.annotation.AnnoOutputColumn; -import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; -import cn.estsh.i3plus.pojo.base.enumutil.ImppEnumUtil; -import cn.estsh.i3plus.pojo.platform.bean.SysDictionary; -import cn.estsh.i3plus.pojo.platform.bean.SysFile; -import cn.estsh.i3plus.pojo.platform.bean.SysMessage; -import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; -import cn.estsh.impp.framework.boot.exception.ImppExceptionEnum; -import com.alibaba.fastjson.JSON; -import io.swagger.annotations.ApiParam; -import org.apache.commons.lang3.StringUtils; -import org.apache.poi.hssf.usermodel.HSSFRow; -import org.apache.poi.hssf.usermodel.HSSFSheet; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.ss.usermodel.*; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.amqp.rabbit.core.RabbitTemplate; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import javax.persistence.EntityManager; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.*; - -/** - * @Description : Excel导入导出工具类 - * @Reference : - * @Author : yunhao - * @CreateDate : 2018-12-05 16:12 - * @Modify: - **/ -@Component -public class ExcelUtil { - public static final Logger LOGGER = LoggerFactory.getLogger(ExcelUtil.class); - - private static ISysConfigService sysConfigService; - - @Autowired - public void setSysConfigService(ISysConfigService sysConfigService) { - ExcelUtil.sysConfigService = sysConfigService; - } - - private static EntityManager entityManager; - - @Autowired - public void setEntityManager(EntityManager entityManager) { - ExcelUtil.entityManager = entityManager; - } - - private static ISysDictionaryService sysDictionaryService; - - @Autowired - public void setSysDictionaryService(ISysDictionaryService sysDictionaryService){ - ExcelUtil.sysDictionaryService = sysDictionaryService; - } - - private static RabbitTemplate rabbitTemplate; - - @Autowired - public void setRabbitTemplate(RabbitTemplate rabbitTemplate) { - this.rabbitTemplate = rabbitTemplate; - } - - /** - * 导出 - * - * @param excelFile excel文件 - * @param data 导出的数据 - * @param exportClass 导出数据类型 - * @param exportCol 需要导出的列 - * @return 导出文件 - */ - public static File exportData(File excelFile, List data, Class exportClass, String[] exportCol) throws Exception { - FileOutputStream fos = null; - //创建HSSFWorkbook对象(excel的文档对象) - HSSFWorkbook workbook = new HSSFWorkbook(); - try { - fos = new FileOutputStream(excelFile); - - //建立新的sheet对象(excel的表单) - HSSFSheet sheet = workbook.createSheet(exportClass.getSimpleName()); - - // 创建表头 - HSSFRow tableHeader = sheet.createRow(0); - - // 类数据 - Field[] fields = new Field[exportCol.length]; - Field[] allFields = ReflexTool.getAllField(exportClass.getName()); - String colName; - - // 获取字段中文名 优先使用 OutputColumn.name - for (int i = 0; i < exportCol.length; i++) { - for (int j = 0; j < allFields.length; j++){ - if(exportCol[i].equals(allFields[j].getName())){ - fields[i] = allFields[j]; - - colName = null; - - if (fields[i].isAnnotationPresent(AnnoOutputColumn.class)) { - colName = fields[i].getAnnotation(AnnoOutputColumn.class).name(); - } - - if (fields[i].isAnnotationPresent(ApiParam.class) && StringUtils.isBlank(colName)) { - colName = fields[i].getAnnotation(ApiParam.class).value(); - } - tableHeader.createCell(i, CellType.STRING).setCellValue(colName); - } - } - } - - //加载数据至excel对象 - HSSFRow hssfRow; - Method method; - AnnoOutputColumn outputColumn; - Object cellValue; - - for (int i = 0; i < data.size(); i++) { - hssfRow = sheet.createRow(i + 1); - for (int j = 0; j < fields.length; j++) { - fields[j].setAccessible(true); - cellValue = fields[j].get(data.get(i)); - - // 判断是否存在引用关系 - if (fields[j].isAnnotationPresent(AnnoOutputColumn.class)) { - outputColumn = fields[j].getAnnotation(AnnoOutputColumn.class); - - // 判断是否为枚举字段 - if (outputColumn.refClass().isEnum()) { - method = outputColumn.refClass().getDeclaredMethod( - outputColumn.refForeignKey() + "Of" + StringTool.toUpperCaseFirstOne(outputColumn.value()), - outputColumn.refClass().getDeclaredMethod("get"+ - StringTool.toUpperCaseFirstOne(outputColumn.refForeignKey())).getReturnType()); - cellValue = method.invoke(data.get(i), cellValue); - }else if(outputColumn.refClass().equals(SysDictionary.class) && cellValue != null){ - cellValue = sysDictionaryService.getSysDictionaryByParentCodeAndValue(outputColumn.refForeignKey(), String.valueOf(cellValue)).getName(); - } else if(!outputColumn.refClass().equals(Object.class) && !outputColumn.refClass().equals(SysDictionary.class)){ - cellValue = selectByProperty(outputColumn.refClass(), outputColumn.value(), outputColumn.refForeignKey(), cellValue); - } - } - - // excel 文本框最大长度 - hssfRow.createCell(j, CellType.STRING).setCellValue(StringTool.valueExcelOf(cellValue)); - } - } - - workbook.write(fos); - fos.flush(); - return excelFile; - } finally { - try { - workbook.close(); - fos.close(); - } catch (IOException e) { - LOGGER.error("IOException!", e); - } - } - } - - /** - * 导入 - * - * @param fileName 文件名 - * @param inputStream 输入流 - * @param importClass 导入类型 - * @param 实体 - * @return 导入数据集合 - * @throws Exception - */ - public static List importData(String fileName, InputStream inputStream, Class importClass) throws Exception { - List dataList = new ArrayList(); - String fileType = StringTool.getStringFileSuffix(fileName, false); - - try { - //根据文件类型及文件输入流新建工作簿对象 - Workbook wb = null; - if (fileType.equals("xls")) { - wb = new HSSFWorkbook(inputStream); - } else if (fileType.equals("xlsx")) { - wb = new XSSFWorkbook(inputStream); - } else { - throw ImppExceptionBuilder.newInstance() - .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) - .setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode()) - .setErrorDetail("Excel 您导入的excel格式不正确") - .setErrorSolution("请检查导入文件格式") - .build(); - } - - // 校验sheet是否超过最大行数 - Sheet sheet = wb.getSheet(importClass.getSimpleName()); - int maxRow = Integer.parseInt(sysConfigService.getSysConfigByCode(PlatformConstWords.EXCEL_IMPORT_MAX_ROW).getConfigValue()); - System.out.println(maxRow); - if (sheet != null && sheet.getLastRowNum() > maxRow) { - throw ImppExceptionBuilder.newInstance() - .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) - .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) - .setErrorDetail("Excel 数据超过最大行数") - .setErrorSolution("请检查是否有空行,或分批导入") - .build(); - } - - // excel列名与字段名映射 - Map colName = new HashMap<>(); - for (Field field : ReflexTool.getAllField(importClass.getName())) { - if (field.isAnnotationPresent(AnnoOutputColumn.class) - && !StringUtils.isBlank(field.getAnnotation(AnnoOutputColumn.class).name())) { - colName.put(field.getAnnotation(AnnoOutputColumn.class).name(), field); - } else if (field.isAnnotationPresent(ApiParam.class)) { - colName.put(field.getAnnotation(ApiParam.class).value(), field); - } - } - - // 创建表头 - Row tableHeader = sheet.getRow(0); - Field[] fields = new Field[tableHeader.getLastCellNum()]; - - for (int i = 0; i < tableHeader.getLastCellNum(); i++) { - fields[i] = colName.get(tableHeader.getCell(i).getStringCellValue()); - } - - Row row; - Object obj; - Object cellValue = null; - AnnoOutputColumn inputColumn; - Method method; - - for (int i = 1; i <= sheet.getLastRowNum(); i++) { - row = sheet.getRow(i); - obj = importClass.newInstance(); - for (int j = 0; j < fields.length; j++) { - Field field = fields[j]; - if(field != null){ - // 判断是否存在引用关系 - if (field.isAnnotationPresent(AnnoOutputColumn.class)) { - inputColumn = fields[j].getAnnotation(AnnoOutputColumn.class); - row.getCell(j).setCellType(CellType.STRING); - cellValue = row.getCell(j).getStringCellValue(); - - // 判断是否为枚举字段 - if (inputColumn.refClass().isEnum()) { - method = inputColumn.refClass().getDeclaredMethod( - inputColumn.value() + "Of" + StringTool.toUpperCaseFirstOne(inputColumn.refForeignKey()), - inputColumn.refClass().getDeclaredMethod("get"+ - StringTool.toUpperCaseFirstOne(inputColumn.value())).getReturnType()); - cellValue = method.invoke(null, cellValue); - }else if(inputColumn.refClass().equals(SysDictionary.class) && cellValue != null){ - cellValue = sysDictionaryService.getSysDictionaryByParentCodeAndName(inputColumn.refForeignKey(), String.valueOf(cellValue)).getName(); - } else if(!inputColumn.refClass().equals(Object.class) && !inputColumn.refClass().equals(SysDictionary.class)){ - cellValue = selectByProperty(inputColumn.refClass(), inputColumn.refForeignKey(), inputColumn.value(), cellValue); - } - }else{ - cellValue = getExcelCell(row.getCell(j), field.getType()); - } - - field.setAccessible(true); - field.set(obj, cellValue); - } - } - dataList.add(obj); - } - - } finally { - inputStream.close(); - } - return dataList; - } - - /** - * 导入模板 - * @param exportClass 需要生成模板的类 - * @return 模板文件 - */ - public static byte[] importTemplate(Class exportClass) { - File excelFile = null; - FileOutputStream fos = null; - //创建HSSFWorkbook对象(excel的文档对象) - HSSFWorkbook workbook = new HSSFWorkbook(); - - try { - //创建临时文件 - excelFile = File.createTempFile(exportClass.getSimpleName() + new Date().getTime(), "Tp.xls"); - LOGGER.info("临时文件所在的本地路径:" + excelFile.getCanonicalPath()); - fos = new FileOutputStream(excelFile); - - //建立新的sheet对象(excel的表单) - HSSFSheet sheet = workbook.createSheet(exportClass.getSimpleName()); - - // 创建表头 - HSSFRow tableHeader = sheet.createRow(0); - - // 类数据 - Field[] fields = ReflexTool.getAllField(exportClass.getName()); - int col = 0; - - for (int i = 0; i < fields.length; i++) { - if (fields[i].isAnnotationPresent(AnnoOutputColumn.class)) { - // 是否隐藏列 - if(!fields[i].getAnnotation(AnnoOutputColumn.class).hidden()){ - if (fields[i].isAnnotationPresent(AnnoOutputColumn.class)) { - tableHeader.createCell(col, CellType.STRING).setCellValue(fields[i].getAnnotation(AnnoOutputColumn.class).name()); - } - - // 优先使用 AnnoOutputColumn.name() - if (fields[i].isAnnotationPresent(ApiParam.class) && StringUtils.isBlank(fields[i].getAnnotation(AnnoOutputColumn.class).name())) { - tableHeader.createCell(col, CellType.STRING).setCellValue(fields[i].getAnnotation(ApiParam.class).value()); - } - col++; - } - } else { - if (fields[i].isAnnotationPresent(ApiParam.class)) { - tableHeader.createCell(col, CellType.STRING).setCellValue(fields[i].getAnnotation(ApiParam.class).value()); - col++; - } - } - } - - workbook.write(fos); - return FileUtil.file2Byte(excelFile.getPath()); - } catch (IOException e) { - throw ImppExceptionBuilder.newInstance() - .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) - .setErrorCode(ImppExceptionEnum.IO_EXCEPTION.getCode()) - .setErrorDetail("Excel导出错误") - .build(); - } finally { - try { - workbook.close(); - fos.close(); - excelFile.deleteOnExit(); - } catch (IOException e) { - LOGGER.error("IOException!", e); - } - } - } - - /** - * 获取实体列集合 - * @param pojoClass 实体类 - * @return 列集合 - */ - public static Map getColName(Class pojoClass) { - Map colName = new LinkedHashMap(); - Field[] fields = ReflexTool.getAllField(pojoClass.getName()); - - for (int i = 0; i < fields.length; i++) { - if (fields[i].isAnnotationPresent(ApiParam.class)) { - colName.put(fields[i].getName(),fields[i].getAnnotation(ApiParam.class).value()); - } - - if (fields[i].isAnnotationPresent(AnnoOutputColumn.class)) { - // 判断是否隐藏 - if(fields[i].getAnnotation(AnnoOutputColumn.class).hidden()){ - colName.remove(fields[i].getName()); - } - // 如果AnnoOutputColumn存在name属性则优先使用 - if(!StringUtils.isBlank(fields[i].getAnnotation(AnnoOutputColumn.class).name())){ - colName.put(fields[i].getName(),fields[i].getAnnotation(AnnoOutputColumn.class).name()); - } - } - } - return colName; - } - - /** - * 查询外键信息 - * @param persistentClass class - * @param colName 查询列名 - * @param propertyName 条件属性名称 - * @param value 条件属性值 - * @return - */ - public static Object selectByProperty(Class persistentClass, String colName, String propertyName, Object value) { - String queryString = "select model." + colName + " from " + persistentClass.getSimpleName() - + " as model where model." + propertyName + "= :" + propertyName; - return entityManager.createQuery(queryString).setParameter(propertyName, value).getSingleResult(); - } - - /** - * 获取excel单元格值 - * @param cell 单元格 - * @param cellClass 单元格参数类型 - * @return 处理结果 - */ - private static Object getExcelCell(Cell cell, Class cellClass) { - if (cell != null) { - cell.setCellType(CellType.STRING); - - if ("".equals(cell.getStringCellValue()) || "null".equals(cell.getStringCellValue())) { - return null; - } else if (cellClass == String.class) { - return cell.getStringCellValue(); - } else if (cellClass == Integer.class) { - return Integer.parseInt(cell.getStringCellValue()); - } else if (cellClass == Long.class) { - return Long.parseLong(cell.getStringCellValue()); - } else if (cellClass == Double.class) { - return Long.parseLong(cell.getStringCellValue()); - } - } - return null; - } - - /** - * 发送包含文件列表的站内信 - * @param fileList 文件集合 - * @param userId 用户id - */ - public static void sendStationLetter(List fileList, Long userId){ - StringBuffer letter = new StringBuffer(); - letter.append("导出文件列表:"); - for (SysFile sysFile:fileList) { - letter.append(""); - letter.append(sysFile.getFileOriginalName()); - letter.append("
"); - } - - // 消息提示 - SysMessage sysMessage = new SysMessage(); - sysMessage.setMessageSenderNameRdd(CommonEnumUtil.SOFT_TYPE.CORE.getDescription()); - sysMessage.setMessageTitle("数据导出"); - sysMessage.setMessageContent(letter.toString()); - sysMessage.setMessageType(ImppEnumUtil.MESSAGE_TYPE.LETTER.getValue()); - sysMessage.setMessageContentType(ImppEnumUtil.MESSAGE_TYPE_CONTENT.HTML.getValue()); - sysMessage.setMessageSendTime(TimeTool.getNowTime(true)); - sysMessage.setIsSystem(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); - sysMessage.setMessageReceiversId(String.valueOf(userId)); - - rabbitTemplate.convertAndSend(PlatformConstWords.IMPP_MESSAGE_LETTER_QUEUE, JSON.toJSONString(sysMessage)); - } - -} diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/FileUtil.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/FileUtil.java deleted file mode 100644 index ba5d617..0000000 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/FileUtil.java +++ /dev/null @@ -1,108 +0,0 @@ -package cn.estsh.i3plus.core.apiservice.util; - -import java.io.*; - -/** - * @Description : 文件工具类 - * @Reference : - * @Author : yunhao - * @CreateDate : 2019-01-11 13:34 - * @Modify: - **/ -public class FileUtil { - - private FileUtil(){} - - /** - * 对临时生成的文件夹和文件夹下的文件进行删除 - */ - public static void deletefile(String delpath) { - try { - File file = new File(delpath); - if (!file.isDirectory()) { - file.delete(); - } else if (file.isDirectory()) { - String[] filelist = file.list(); - for (int i = 0; i < filelist.length; i++) { - File delfile = new File(delpath + File.separator + filelist[i]); - if (!delfile.isDirectory()) { - delfile.delete(); - } else if (delfile.isDirectory()) { - deletefile(delpath + File.separator + filelist[i]); - } - } - file.delete(); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** - * File 转 byte[] - * - * @param filePath - * @return byte[] - */ - public static byte[] file2Byte(String filePath){ - byte[] buffer = null; - try { - File file = new File(filePath); - FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(1000); - byte[] b = new byte[1000]; - int n; - while ((n = fis.read(b)) != -1) { - bos.write(b, 0, n); - } - fis.close(); - bos.close(); - buffer = bos.toByteArray(); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - return buffer; - } - - - /** - * byte[] 转 File - * @param buf byte[] - * @param filePath 文件地址 - * @param fileName 文件名称 - */ - public static void byte2File(byte[] buf, String filePath, String fileName) { - BufferedOutputStream bos = null; - FileOutputStream fos = null; - File file = null; - try { - File dir = new File(filePath); - if (!dir.exists() && dir.isDirectory()) { - dir.mkdirs(); - } - file = new File(filePath + File.separator + fileName); - fos = new FileOutputStream(file); - bos = new BufferedOutputStream(fos); - bos.write(buf); - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (bos != null) { - try { - bos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - if (fos != null) { - try { - fos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } -} diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/ZipUtil.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/ZipUtil.java deleted file mode 100644 index 5079e0e..0000000 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/ZipUtil.java +++ /dev/null @@ -1,181 +0,0 @@ -package cn.estsh.i3plus.core.apiservice.util; - -import cn.estsh.i3plus.pojo.platform.bean.SysUserInfo; -import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; -import org.apache.commons.compress.archivers.zip.ZipFile; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.*; -import java.util.ArrayList; -import java.util.Date; -import java.util.Enumeration; -import java.util.List; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - -/** - * @Description : - * 压缩或解压zip:由于直接使用java.util.zip工具包下的类,会出现中文乱码问题, - * 所以使用ant.jar中的org.apache.tools.zip下的工具类 - * @Reference : - * @Author : yunhao - * @CreateDate : 2019-01-11 10:16 - * @Modify: - **/ -public class ZipUtil { - - public static final Logger LOGGER = LoggerFactory.getLogger(ZipUtil.class); - - private static byte[] _byte = new byte[1024]; - - /** - * 压缩文件或路径 - * - * @param zip 压缩的目的地址 - * @param srcFiles 压缩的源文件 - */ - public static File zipFile(String zip, List srcFiles) { - try { - // zip == null 则创建临时文件 - if(StringUtils.isBlank(zip)){ - zip = File.createTempFile("zip" + new Date().getTime(), ".zip").getPath(); - } - File zipFile = new File(zip); - if (zip.endsWith(".zip") || zip.endsWith(".ZIP")) { - ZipOutputStream _zipOut = new ZipOutputStream(new FileOutputStream(zipFile)); - for (File _f : srcFiles) { - handlerFile(zip, _zipOut, _f, ""); - } - _zipOut.close(); - } else { - LOGGER.error("target file[" + zip + "] is not .zip type file"); - } - return zipFile; - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - return null; - } - - /** - * 压缩文件或路径 - * - * @param zip 压缩的目的地址 - * @param srcFiles 压缩的源文件 - */ - public static File zipFile(String zip, File srcFiles) { - try { - File zipFile = null; - // zip == null 则创建临时文件 - if(StringUtils.isBlank(zip)){ - zipFile = new File(System.getProperty("java.io.tmpdir") + File.separator + SysUserInfo.class.getSimpleName()+ ".zip"); - zipFile.createNewFile(); - zip = zipFile.getPath(); - } - if (zip.endsWith(".zip") || zip.endsWith(".ZIP")) { - zipFile = new File(zip); - ZipOutputStream _zipOut = new ZipOutputStream(new FileOutputStream(zipFile)); - handlerFile(zip, _zipOut, srcFiles, ""); - _zipOut.close(); - } else { - LOGGER.error("target file[" + zip + "] is not .zip type file"); - } - return zipFile; - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - return null; - } - - /** - * @param zip 压缩的目的地址 - * @param zipOut - * @param srcFile 被压缩的文件信息 - * @param path 在zip中的相对路径 - * @throws IOException - */ - private static void handlerFile(String zip, ZipOutputStream zipOut, File srcFile, String path) throws IOException { - LOGGER.debug(" begin to compression file[" + srcFile.getName() + "]"); - if (!"".equals(path) && !path.endsWith(File.separator)) { - path += File.separator; - } - if (!srcFile.getPath().equals(zip)) { - // 判断是否为文件目录如果为文件目录则打包目录下所有文件 - if (srcFile.isDirectory()) { - File[] _files = srcFile.listFiles(); - if (_files.length == 0) { - zipOut.putNextEntry(new ZipEntry(path + srcFile.getName() + File.separator)); - zipOut.closeEntry(); - } else { - for (File _f : _files) { - handlerFile(zip, zipOut, _f, path + srcFile.getName()); - } - } - } else { - InputStream _in = new FileInputStream(srcFile); - zipOut.putNextEntry(new ZipEntry(path + srcFile.getName())); - int len = 0; - while ((len = _in.read(_byte)) > 0) { - zipOut.write(_byte, 0, len); - } - _in.close(); - zipOut.closeEntry(); - } - } - } - - /** - * 解压缩ZIP文件,将ZIP文件里的内容解压到targetDIR目录下 - * - * @param zipPath 待解压缩的ZIP文件路径 - * @param descDir 目标目录 - */ - public static List upzipFile(String zipPath, String descDir) { - return upzipFile(new File(zipPath), descDir); - } - - /** - * 对.zip文件进行解压缩 - * - * @param zipFile 解压缩文件 - * @param descDir 压缩的目标地址,如:D:\\测试 或 /mnt/d/测试 - * @return - */ - @SuppressWarnings("rawtypes") - public static List upzipFile(File zipFile, String descDir) { - List _list = new ArrayList<>(); - try { - ZipFile _zipFile = new ZipFile(zipFile); - for (Enumeration entries = _zipFile.getEntries(); entries.hasMoreElements(); ) { - ZipEntry entry = (ZipEntry) entries.nextElement(); - File _file = new File(descDir + File.separator + entry.getName()); - if (entry.isDirectory()) { - _file.mkdirs(); - } else { - File _parent = _file.getParentFile(); - if (!_parent.exists()) { - _parent.mkdirs(); - } - InputStream _in = _zipFile.getInputStream((ZipArchiveEntry) entry); - OutputStream _out = new FileOutputStream(_file); - int len; - while ((len = _in.read(_byte)) > 0) { - _out.write(_byte, 0, len); - } - _in.close(); - _out.flush(); - _out.close(); - _list.add(_file); - } - } - } catch (IOException e) { - } - return _list; - } -} diff --git a/modules/i3plus-core-apiservice/src/main/resources/init/sys-config.xlsx b/modules/i3plus-core-apiservice/src/main/resources/init/sys-config.xlsx index db2137d67d877eed62ce58f9835b4f5b9aa793bd..29198fd60cb2b7716991abe6c3921b761f06cc88 100644 GIT binary patch delta 23845 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 diff --git a/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/mq/TestMQ.java b/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/mq/TestMQ.java index 62b9b5c..429a9ac 100644 --- a/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/mq/TestMQ.java +++ b/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/mq/TestMQ.java @@ -4,6 +4,7 @@ import cn.estsh.i3plus.core.apiservice.serviceimpl.busi.TestBase; import cn.estsh.i3plus.core.apiservice.util.MailUtil; import cn.estsh.i3plus.pojo.base.enumutil.ImppEnumUtil; import cn.estsh.i3plus.pojo.platform.bean.SysMessage; +import com.alibaba.fastjson.JSON; import org.junit.Test; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; @@ -41,7 +42,7 @@ public class TestMQ extends TestBase { sysMessage.setId(null); sysMessage.setMessageTitle( i + "mail测试"); sysMessage.setMessageSenderNameRdd(i+""); - rabbitTemplate.convertAndSend("WYH_MESSAGE_QUEUE", new SysMessage()); + rabbitTemplate.convertAndSend("WYH_MESSAGE_QUEUE", JSON.toJSONString(new SysMessage())); System.out.println("第" + i + "次"); } diff --git a/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestUser.java b/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestUser.java index 47816e7..837d2e2 100644 --- a/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestUser.java +++ b/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestUser.java @@ -2,7 +2,7 @@ // //import cn.estsh.i3plus.core.api.iservice.busi.*; //import cn.estsh.i3plus.core.apiservice.serviceimpl.busi.TestBase; -//import cn.estsh.i3plus.core.apiservice.util.FileUtil; +//import cn.estsh.i3plus.core.apiservice.util.FileTool; //import cn.estsh.i3plus.platform.common.convert.ConvertBean; //import cn.estsh.i3plus.pojo.base.bean.BaseBean; //import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker; diff --git a/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/util/ExcelReadData.java b/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/util/ExcelReadData.java index d82e204..d1e988c 100644 --- a/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/util/ExcelReadData.java +++ b/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/util/ExcelReadData.java @@ -1,6 +1,6 @@ package test.cn.estsh.i3plus.core.apiservice.util; -import cn.estsh.i3plus.core.apiservice.util.ExcelUtil; +import cn.estsh.i3plus.platform.common.tool.ExcelTool; import cn.estsh.i3plus.pojo.platform.bean.SysMenu; import com.alibaba.fastjson.JSON; @@ -16,7 +16,7 @@ import java.util.List; **/ public class ExcelReadData { public static void main(String[] args) throws Exception{ - List list = ExcelUtil.importData("permission.xls", new FileInputStream("E:\\permission.xls"), SysMenu.class); + List list = ExcelTool.importData("permission.xls", new FileInputStream("E:\\permission.xls"), SysMenu.class); System.out.println(JSON.toJSONString(list)); } diff --git a/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/util/JavaTest.java b/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/util/JavaTest.java index 83f0331..5b89157 100644 --- a/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/util/JavaTest.java +++ b/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/util/JavaTest.java @@ -1,9 +1,8 @@ package test.cn.estsh.i3plus.core.apiservice.util; -import cn.estsh.i3plus.core.apiservice.util.ExcelUtil; +import cn.estsh.i3plus.platform.common.tool.ExcelTool; import cn.estsh.i3plus.platform.common.tool.StringTool; import cn.estsh.i3plus.pojo.platform.bean.SysMenu; -import cn.estsh.i3plus.pojo.platform.bean.SysUserInfo; import lombok.Data; import org.apache.commons.lang3.StringUtils; @@ -957,7 +956,7 @@ public class JavaTest { File file = new File("E:\\test.xls"); file.createNewFile(); - ExcelUtil.exportData(file, list, SysMenu.class, new String[]{ + ExcelTool.exportData(file, list, SysMenu.class, new String[]{ "menuCode", "name","parentId","menuType","menuStatus","parentNameRdd","menuUrl","menuClassPath","menuGrade","menuSort" ,"menuCss","menuIcon","menuDescription" }); diff --git a/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/util/TestExcelUtil.java b/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/util/TestExcelUtil.java index 1283122..357373a 100644 --- a/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/util/TestExcelUtil.java +++ b/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/util/TestExcelUtil.java @@ -1,6 +1,7 @@ package cn.estsh.i3plus.core.apiservice.util; import cn.estsh.i3plus.core.apiservice.serviceimpl.busi.TestBase; +import cn.estsh.i3plus.platform.common.tool.ExcelTool; import cn.estsh.i3plus.pojo.base.enumutil.ImppEnumUtil; import cn.estsh.i3plus.pojo.platform.bean.SysTool; import org.junit.Test; @@ -32,7 +33,7 @@ public class TestExcelUtil extends TestBase { @Test public void importData() throws Exception{ try { - List sy = ExcelUtil.importData("testOut.xls", new FileInputStream("E://testOut.xls"), SysTool.class); + List sy = ExcelTool.importData("testOut.xls", new FileInputStream("E://testOut.xls"), SysTool.class); System.out.println(sy); } catch (FileNotFoundException e) { e.printStackTrace(); From 10b82dbea25997a64f77fbcbe7bdfa8fca348b30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B1=AA=E4=BA=91=E6=98=8A?= Date: Fri, 14 Jun 2019 16:29:59 +0800 Subject: [PATCH 3/3] =?UTF-8?q?WMS=E5=BE=AE=E6=9C=8D=E5=8A=A1=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E6=8E=A5=E5=8F=A3=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/message/WMSMessageController.java | 153 +++++++++++++++++++++ .../core/apiservice/mq/WYHQueueReceiver.java | 49 +++++++ .../busi/TestSysLocaleResourceService.java | 45 ++++++ 3 files changed, 247 insertions(+) create mode 100644 modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/message/WMSMessageController.java create mode 100644 modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/WYHQueueReceiver.java create mode 100644 modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestSysLocaleResourceService.java diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/message/WMSMessageController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/message/WMSMessageController.java new file mode 100644 index 0000000..497d266 --- /dev/null +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/message/WMSMessageController.java @@ -0,0 +1,153 @@ +package cn.estsh.i3plus.core.apiservice.controller.message; + +import cn.estsh.i3plus.core.apiservice.controller.base.BaseMessageController; +import cn.estsh.i3plus.platform.common.util.PlatformConstWords; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.model.platform.MessagePagerModel; +import cn.estsh.i3plus.pojo.model.platform.RefUserMessagePagerModel; +import cn.estsh.i3plus.pojo.platform.bean.SysMessage; +import cn.estsh.i3plus.pojo.platform.bean.SysRefUserMessage; +import cn.estsh.impp.framework.base.controller.CoreBaseController; +import cn.estsh.impp.framework.boot.util.ResultBean; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description : SWEB消息管理服务 + * @Reference : + * @Author : yunhao + * @Date : 2018-10-25 19:03 + * @Modify : + **/ +@RestController +@RequestMapping(PlatformConstWords.BASE_URL +"/wms") +@Api(description = "消息管理服务") +public class WMSMessageController extends CoreBaseController { + + @Autowired + private BaseMessageController baseSysMessage; + + + /*************************************************** WMS系统消息 **************************************************/ + + /** + * WMS - 新增消息 + * @param sysMessage + * @return + */ + @PostMapping(value = "/sys-message/insert") + @ApiOperation(value = "新增消息",notes = "新增消息") + public ResultBean insertSysMessage(@RequestBody SysMessage sysMessage){ + sysMessage = sysMessage == null ? new SysMessage() : sysMessage; + sysMessage.setMessageSoftType(CommonEnumUtil.SOFT_TYPE.WMS.getValue()); + + return baseSysMessage.basaeInsertSysMessage(sysMessage); + } + + /** + * WMS - 删除消息 + * @param id + * @return + */ + @DeleteMapping("/sys-message/delete/{id}") + @ApiOperation(value = "根据id删除消息",notes = "根据id删除消息") + public ResultBean deleteSysMessageById(@PathVariable("id") String id){ + return baseSysMessage.baseDeleteSysMessageById(id); + } + + /** + * WMS - 修改消息 + * @param sysMessage + * @return + */ + @PutMapping("/sys-message/update") + @ApiOperation(value = "修改信息",notes = "修改信息") + public ResultBean updateSysMessage(SysMessage sysMessage){ + sysMessage = sysMessage == null ? new SysMessage() : sysMessage; + sysMessage.setMessageSoftType(CommonEnumUtil.SOFT_TYPE.WMS.getValue()); + return baseSysMessage.baseUpdateSysMessage(sysMessage); + } + + /** + * WMS - 根据id查询消息 + * @param idStr 消息id + * @return 处理结果 + */ + @GetMapping(value = "/sys-message/get/{id}") + @ApiOperation(value = "根据id查询消息",notes = "根据id查询消息") + public ResultBean getSysMessageById(@PathVariable("id") String idStr){ + return baseSysMessage.baseGetSysMessageById(idStr); + } + + /** + * WMS - 分页带条件查询 + * @param messagePagerModel 分页以及条件信息 + * @return 处理结果 + */ + @PostMapping(value = "/sys-message/query") + @ApiOperation(value = "消息复杂查询,分页,排序",notes = "消息复杂查询,分页,排序") + public ResultBean querySysMessageByPager(@RequestBody MessagePagerModel messagePagerModel){ + return baseSysMessage.baseQuerySysMessageByPager(messagePagerModel); + } + + /** + * WMS - 批量删除 + * @param ids ids数组 + * @return 处理结果 + */ + @DeleteMapping("/sys-message/batch-delete") + @ApiOperation(value = "批量删除消息",notes = "批量删除消息") + public ResultBean deleteSysMessageByIds(String[] ids){ + return baseSysMessage.baseDeleteSysMessageByIds(ids); + } + + /*********************************************** WMS用户系统消息 *********************************************/ + + /** + * WMS - 根据用户消息id查询消息 + * @param idStr + * @return 处理结果 + */ + @GetMapping(value = "/user-message/get/{id}") + @ApiOperation(value = "根据用户消息id查询消息",notes = "根据用户消息id查询消息") + public ResultBean getUserMessageById(@PathVariable("id") String idStr){ + return baseSysMessage.baseGetUserMessageById(idStr); + } + + /** + * WMS - 批量切换消息状态 + * @param ids ids数组 + * @param status 状态 + * @return 处理结果 + */ + @PutMapping("/user-message/batch-status") + @ApiOperation(value = "批量切换消息状态",notes = "批量切换消息状态") + public ResultBean updateSysMessageStatusByIds(String[] ids,Integer status){ + return baseSysMessage.baseUpdateSysMessageStatusByIds(ids, status); + } + + /** + * 用户消息复杂查询,分页,排序 + * @param refUserMessagePagerModel 查询条件及分页信息 + * @return 处理结果 + */ + @PostMapping(value = "/user-message/query") + @ApiOperation(value = "消息复杂查询,分页,排序",notes = "消息复杂查询,分页,排序") + public ResultBean querySysRefUserMessageByPager(@RequestBody RefUserMessagePagerModel refUserMessagePagerModel){ + return baseSysMessage.baseQuerySysRefUserMessageByPager(refUserMessagePagerModel); + } + + /** + * 用户消息删除 + * @param idStr 用户消息id + * @return 处理结果 + */ + @DeleteMapping(value = "/user-message/delete/{id}") + @ApiOperation(value = "消息复杂查询,分页,排序",notes = "消息复杂查询,分页,排序") + public ResultBean deleteSysRefUserMessageById(@PathVariable("id") String idStr){ + return baseSysMessage.baseDeleteSysRefUserMessageById(idStr); + } + +} diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/WYHQueueReceiver.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/WYHQueueReceiver.java new file mode 100644 index 0000000..303141d --- /dev/null +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/WYHQueueReceiver.java @@ -0,0 +1,49 @@ +package cn.estsh.i3plus.core.apiservice.mq; + +import com.rabbitmq.client.Channel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; + +import java.io.IOException; + +/** + * @Description : 定时任务通道业务处理 + * @Reference : + * @Author : yunhao + * @CreateDate : 2018-12-20 21:56 + * @Modify: + **/ +@Component +public class WYHQueueReceiver { + + private static final Logger LOGGER = LoggerFactory.getLogger(WYHQueueReceiver.class); + + + /** + * 定时任务通道处理 + * + * @param data 系统消息信息 + * @param channel 通道 + * @param message 消息 + */ + @RabbitListener(queues = "WYH") + public void processSchedule(String data, Channel channel, Message message) { + try { + System.out.println("队列消息接受成功========" + data); + //信息已处理 + channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); + } catch (IOException e) { + LOGGER.error("【MQ-IMPP_MESSAGE_MAIL_QUEUE】处理出错:{}", e.getMessage(), e); + //丢弃这条消息 + try { + // 未成功处理,重新发送 + channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true); + } catch (IOException e1) { + e1.printStackTrace(); + } + } + } +} diff --git a/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestSysLocaleResourceService.java b/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestSysLocaleResourceService.java new file mode 100644 index 0000000..7e6b1d9 --- /dev/null +++ b/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestSysLocaleResourceService.java @@ -0,0 +1,45 @@ +package test.cn.estsh.i3plus.core.apiservice.serviceimpl.busi; + +import cn.estsh.i3plus.core.api.iservice.busi.ISysLocaleResourceService; +import cn.estsh.i3plus.core.apiservice.serviceimpl.busi.TestBase; +import cn.estsh.i3plus.platform.common.tool.ExcelTool; +import cn.estsh.i3plus.pojo.platform.bean.SysLocaleResource; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.File; +import java.io.IOException; +import java.util.Date; + +/** + * @Description : + * @Reference : + * @Author : yunhao + * @CreateDate : 2019-05-22 16:37 + * @Modify: + **/ +public class TestSysLocaleResourceService extends TestBase { + + @Autowired + ISysLocaleResourceService sysLocaleResourceService; + + @Test + public void exportSysLocaleResourceData() throws IOException { + SysLocaleResource ds = new SysLocaleResource(); + System.out.println(ExcelTool.getColName(SysLocaleResource.class)); + String[] colName = new String[]{ + "resourceType","languageCode","languageNameRdd","resourceKey","resourceValue","isSystem" + }; + File file = File.createTempFile(SysLocaleResource.class.getSimpleName() + new Date().getTime(), "Tp.xls"); + try { + ExcelTool.exportData(file,sysLocaleResourceService.listSysLocaleResource(),SysLocaleResource.class,colName); + System.out.println(file.getPath()); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) { + System.out.println(ExcelTool.getColName(SysLocaleResource.class)); + } +}