From e83f3d9bd7a70d945a984de20adabfe3732b1096 Mon Sep 17 00:00:00 2001 From: "yunhao.wang" Date: Wed, 9 Jan 2019 10:55:40 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/busi/SysLogSystemController.java | 3 +- .../controller/busi/SysOrderNoRuleController.java | 5 +- .../controller/busi/SysUserInfoController.java | 79 ++++++++++++++++++- .../serviceimpl/busi/SysDictionaryService.java | 3 +- .../i3plus/core/apiservice/util/ExcelUtil.java | 89 ++++++++++++++++------ 5 files changed, 149 insertions(+), 30 deletions(-) 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 e2d1303..533c771 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 @@ -7,6 +7,7 @@ import cn.estsh.i3plus.core.api.iservice.busi.ISysLogSystemService; import cn.estsh.i3plus.core.apiservice.util.ExcelUtil; import cn.estsh.i3plus.platform.common.util.CommonConstWords; 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.ResourceEnumUtil; @@ -168,7 +169,7 @@ public class SysLogSystemController extends CoreBaseController{ // 保证系统文件表中 String filePath = dfsClient.getHostUi() + "/" + fileAbsolutePath[0] + "/" + fileAbsolutePath[1]; SysDictionary dictionary = sysDictionaryService.getSysDictionaryByParentCodeAndCode( - CommonConstWords.DICTIONARY_FILE_TYPE,fastDFSFile.getExt()); + BaseConstWords.DICTIONARY_FILE_TYPE,fastDFSFile.getExt()); SysFile sysFile = new SysFile(); sysFile.setDfsGroupName(fileAbsolutePath[0]); 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 9c39549..0f3b102 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 @@ -8,6 +8,7 @@ import cn.estsh.i3plus.core.apiservice.util.ExcelUtil; import cn.estsh.i3plus.platform.common.tool.StringTool; import cn.estsh.i3plus.platform.common.util.CommonConstWords; 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.common.PagerHelper; @@ -236,7 +237,7 @@ public class SysOrderNoRuleController extends CoreBaseController { // 保证系统文件表中 String filePath = dfsClient.getHostUi() + "/" + fileAbsolutePath[0] + "/" + fileAbsolutePath[1]; SysDictionary dictionary = sysDictionaryService.getSysDictionaryByParentCodeAndCode( - CommonConstWords.DICTIONARY_FILE_TYPE,fastDFSFile.getExt()); + BaseConstWords.DICTIONARY_FILE_TYPE,fastDFSFile.getExt()); SysFile sysFile = new SysFile(); sysFile.setDfsGroupName(fileAbsolutePath[0]); @@ -293,7 +294,7 @@ public class SysOrderNoRuleController extends CoreBaseController { // 保证系统文件表中 String filePath = dfsClient.getHostUi() + "/" + fileAbsolutePath[0] + "/" + fileAbsolutePath[1]; SysDictionary dictionary = sysDictionaryService.getSysDictionaryByParentCodeAndCode( - CommonConstWords.DICTIONARY_FILE_TYPE,fastDFSFile.getExt()); + BaseConstWords.DICTIONARY_FILE_TYPE,fastDFSFile.getExt()); SysFile sysFile = new SysFile(); sysFile.setDfsGroupName(fileAbsolutePath[0]); 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 2a5a0b9..8700410 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,11 +1,11 @@ package cn.estsh.i3plus.core.apiservice.controller.busi; -import cn.estsh.i3plus.core.api.iservice.busi.ISysDepartmentService; -import cn.estsh.i3plus.core.api.iservice.busi.ISysPositionService; -import cn.estsh.i3plus.core.api.iservice.busi.ISysUserInfoService; +import cn.estsh.i3plus.core.api.iservice.busi.*; +import cn.estsh.i3plus.core.apiservice.util.ExcelUtil; import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.platform.common.tool.StringTool; 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; @@ -17,6 +17,8 @@ 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.fastdfs.FastDFSClient; +import cn.estsh.impp.framework.boot.fastdfs.FastDFSFile; import cn.estsh.impp.framework.boot.util.ResultBean; import cn.estsh.impp.framework.boot.util.ValidatorBean; import io.swagger.annotations.Api; @@ -53,6 +55,18 @@ public class SysUserInfoController extends CoreBaseController{ @Autowired private ISysPositionService sysPositionService; + @Autowired + private ISysDictionaryService sysDictionaryService; + + @Autowired + private ISysConfigService sysConfigService; + + @Autowired + private ISysFileService sysFileService; + + @Autowired + private FastDFSClient dfsClient; + @PostMapping(value="/insert") @ApiOperation(value="添加用户信息",notes="返回内容添加用户信息") public ResultBean insertSysUserInfo(SysUserInfo userInfo){ @@ -334,4 +348,63 @@ public class SysUserInfoController extends CoreBaseController{ LOGGER.error(ImppExceptionEnum.SYSTEM_EXCEPTION.getDescription() + ":{}",e.getMessage(),e); } } + + + @GetMapping(value = "/export") + @ApiOperation(value = "导出用户信息") + public ResultBean exportSysOrderNoRule(SysUserInfo sysUserInfo, String[] colName){ + try { + Pager pager = new Pager(); + pager.setCurrentPage(1); + pager.setPageSize(Integer.parseInt(sysConfigService.getSysConfigByCode(PlatformConstWords.EXCEL_EXPORT_MAX_ROW).getConfigValue())); + ListPager listPager; + String[] fileAbsolutePath; + List result = new ArrayList(); + do { + listPager = sysUserInfoService.querySysUserInfo(sysUserInfo, pager); + pager = listPager.getObjectPager(); + + // 上传至文件服务器 + FastDFSFile fastDFSFile = new FastDFSFile(SysOrderNoRule.class.getSimpleName() + pager.getCurrentPage() + ".xls", + ExcelUtil.exportData(listPager.getObjectList(),SysOrderNoRule.class,colName),"xls"); + + fileAbsolutePath = dfsClient.upload(fastDFSFile); + + // 保证系统文件表中 + 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.setFileSize(fastDFSFile.getContent().length); + sysFile.setFilePath(filePath); + sysFile.setFileOriginalName(fastDFSFile.getName()); + sysFile.setFileTypeId(dictionary.getId()); + sysFile.setFileTypeName(dictionary.getName()); + sysFile.setDownloadNum(0); + result.add(sysFileService.insertSysFile(sysFile)); + + pager.setCurrentPage(pager.getCurrentPage() + 1); + } while (pager.getCurrentPage() <= pager.getTotalPages()); + return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultList(result); + }catch(ImppBusiException busExcep){ + return ResultBean.fail(busExcep); + }catch(Exception e){ + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + + @GetMapping("/get-col") + @ApiOperation(value = "获取用户可导出字段") + public ResultBean getSysOrderNoRuleColName(){ + try { + return ResultBean.success("查询成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultMap(ExcelUtil.getColName(SysOrderNoRule.class)); + }catch(ImppBusiException busExcep){ + return ResultBean.fail(busExcep); + }catch(Exception e){ + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysDictionaryService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysDictionaryService.java index ab9639b..6d6d0ea 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysDictionaryService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysDictionaryService.java @@ -3,6 +3,7 @@ package cn.estsh.i3plus.core.apiservice.serviceimpl.busi; import cn.estsh.i3plus.core.api.iservice.busi.ISysDictionaryService; import cn.estsh.i3plus.platform.common.tool.StringTool; import cn.estsh.i3plus.platform.common.util.CommonConstWords; +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; @@ -153,7 +154,7 @@ public class SysDictionaryService implements ISysDictionaryService { @Override @ApiOperation(value = "检出文件名称是否符合系统规范") public boolean checkFileName(String fileName) { - List list = findSysDictionaryByParentCode(CommonConstWords.DICTIONARY_FILE_TYPE); + List list = findSysDictionaryByParentCode(BaseConstWords.DICTIONARY_FILE_TYPE); if(list != null && list.size()> 0){ String suffix = StringTool.getStringFileSuffix(fileName,true); 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 index 532433f..a1bd351 100644 --- 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 @@ -1,14 +1,17 @@ package cn.estsh.i3plus.core.apiservice.util; import cn.estsh.i3plus.core.api.iservice.busi.ISysConfigService; +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.platform.bean.SysTool; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; import cn.estsh.impp.framework.boot.exception.ImppExceptionEnum; 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; @@ -22,10 +25,12 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import javax.persistence.EntityManager; import java.io.*; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.sql.Ref; import java.util.*; /** @@ -49,6 +54,14 @@ public class ExcelUtil { ExcelUtil.sysConfigService = sysConfigService; } + private static EntityManager entityManager; + + @Autowired + public void setEntityManager(EntityManager entityManager) { + ExcelUtil.entityManager = entityManager; + } + + /** * 导出 * @@ -74,45 +87,61 @@ public class ExcelUtil { HSSFRow tableHeader = sheet.createRow(0); // 类数据 - Field[] declaredFields = exportClass.getDeclaredFields(); Field[] fields = new Field[exportCol.length]; + String colName; + + // 获取字段中文名 优先使用 OutputColumn.name for (int i = 0; i < exportCol.length; i++) { - for (Field field : declaredFields) { - if (field.getName().equals(exportCol[i])) { - fields[i] = field; + fields[i] = exportClass.getDeclaredField(exportCol[i]); + colName = null; - if (field.isAnnotationPresent(ApiParam.class)) { - ApiParam fieldAnno = field.getAnnotation(ApiParam.class); - tableHeader.createCell(i, CellType.STRING).setCellValue(fieldAnno.value()); - } - } + 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++) { - method = exportClass.getDeclaredMethod("get" + StringTool.toUpperCaseFirstOne(fields[j].getName())); - hssfRow.createCell(j, CellType.STRING).setCellValue( - String.valueOf(method.invoke(data.get(i))) - ); + CellValue = exportClass.getDeclaredMethod("get" + StringTool.toUpperCaseFirstOne(fields[j].getName())).invoke(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 { + selectByProperty(outputColumn.refClass(), outputColumn.value(), outputColumn.refForeignKey(), CellValue); + } + } + + hssfRow.createCell(j, CellType.STRING).setCellValue(String.valueOf(CellValue)); } } workbook.write(fos); fos.flush(); return file2Byte(excelFile); - } catch (NoSuchMethodException e) { - LOGGER.error("属性get方法不存在!", e); - } catch (IllegalAccessException e) { - LOGGER.error("Excel 导出异常!", e); - } catch (InvocationTargetException e) { - LOGGER.error("Excel 导出异常!", e); - } catch (IOException e) { + } catch (Exception e) { + e.printStackTrace(); throw ImppExceptionBuilder.newInstance() .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) .setErrorCode(ImppExceptionEnum.IO_EXCEPTION_FILE.getCode()) @@ -127,7 +156,6 @@ public class ExcelUtil { LOGGER.error("IOException!", e); } } - return null; } /** @@ -196,9 +224,9 @@ public class ExcelUtil { obj = importClass.newInstance(); for (int j = 0; j < fields.length; j++) { row.getCell(j).setCellType(CellType.STRING); - if("".equals(row.getCell(j).getStringCellValue())){ + if ("".equals(row.getCell(j).getStringCellValue())) { cellValue = null; - }else if (fields[j].getType() == String.class) { + } else if (fields[j].getType() == String.class) { cellValue = row.getCell(j).getStringCellValue(); } else if (fields[j].getType() == Integer.class) { cellValue = Integer.parseInt(row.getCell(j).getStringCellValue()); @@ -333,6 +361,21 @@ public class ExcelUtil { return colName; } + /** + * @param persistentClass + * @param colName + * @param propertyName + * @param value + * @return + */ + public static Object selectByProperty(Class persistentClass, String colName, String propertyName, Object value) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + String queryString = "select model." + colName + " from " + persistentClass.getSimpleName() + + " as model where model." + propertyName + "= :" + propertyName; + Object result = entityManager.createQuery(queryString).setParameter(propertyName, value).getSingleResult(); + + return persistentClass.getDeclaredMethod("get" + StringTool.toUpperCaseFirstOne(colName)).invoke(result); + } + public static void main(String[] args) { List sysTools = new ArrayList<>(); SysTool sysTool = new SysTool(); From 73629bfd1f94c3ba3c4ae2973bde1575cac0dc43 Mon Sep 17 00:00:00 2001 From: alwaysfrin <39822157+alwaysfrin@users.noreply.github.com> Date: Thu, 10 Jan 2019 10:56:14 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/report/CoreReportController.java | 117 +++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/report/CoreReportController.java diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/report/CoreReportController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/report/CoreReportController.java new file mode 100644 index 0000000..7e25cc9 --- /dev/null +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/report/CoreReportController.java @@ -0,0 +1,117 @@ +package cn.estsh.i3plus.core.apiservice.controller.report; + +import cn.estsh.i3plus.platform.common.tool.ClassTool; +import cn.estsh.i3plus.pojo.base.bean.BaseResultBean; +import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil; +import cn.estsh.i3plus.pojo.model.common.ClassFieldModel; +import cn.estsh.i3plus.pojo.model.common.ClassModel; +import cn.estsh.impp.framework.boot.util.ResultBean; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.persistence.Transient; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +@RestController +@RequestMapping("/impp/cloud/report") +@Api(description="报表服务") +public class CoreReportController { + + private static final Logger LOGGER = LoggerFactory.getLogger(CoreReportController.class); + + @Value("${impp.app.pojo-packages}.bean") + public String pojoPackagePath; + + @GetMapping(value="/list-clz") + @ApiOperation(value="查询管理后台所有类",notes = "根据核心包路径列出所有类") + public BaseResultBean listClz() { + LOGGER.info("【类路径:{}】",pojoPackagePath); + List clzNameList = ClassTool.getClassName(pojoPackagePath, true); + List clzList = new ArrayList<>(clzNameList.size()); + Class tmpClz = null; + Api api = null; + ClassModel classModel = null; + for(String clzName : clzNameList){ + try { + //注册类 + tmpClz = Class.forName(clzName); + + classModel = new ClassModel(); + classModel.setPackageName(pojoPackagePath); + classModel.setClzFullName(clzName); + classModel.setClzSimpleName(tmpClz.getSimpleName()); + + api = (Api) tmpClz.getAnnotation(Api.class); + if(api != null) { + classModel.setClzDesc(api.value()); + + clzList.add(classModel); + }else{ + //classModel.setClzDesc(clzName); + LOGGER.warn("不添加类:{},因为没有添加api描述", tmpClz); + } + } catch (ClassNotFoundException e) { + LOGGER.error("【类:{}注册出错】",clzName,clzName,e); + } + } + + return ResultBean.success("获取类:" + clzList.size()) + .setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()) + .setResultList(clzList); + } + + @GetMapping(value="/pojo-property") + @ApiOperation(value="查询类所有属性") + public ResultBean testWms(@RequestParam("clzFullName") String clzFullName) { + LOGGER.info("【查询类属性:{}】",clzFullName); + + ApiParam apiParam = null; + Transient tran = null; + List fieldModelList = new ArrayList<>(); + try { + Class tmpClz = Class.forName(clzFullName); + List fields = ClassTool.getAllFieldsList(tmpClz); + ClassFieldModel fieldModel = null; + for(Field f : fields){ + tran = f.getAnnotation(Transient.class); + if(tran == null) { + // 临时对象不需要处理 + fieldModel = new ClassFieldModel(); + fieldModel.setPackageName(pojoPackagePath); + fieldModel.setClzFullName(clzFullName); + fieldModel.setClzSimpleName(tmpClz.getSimpleName()); + fieldModel.setFieldName(f.getName()); + + apiParam = f.getAnnotation(ApiParam.class); + if(apiParam != null){ + fieldModel.setFieldDesc(apiParam.value()); + + fieldModelList.add(fieldModel); + }else{ + //fieldModel.setFieldDesc(fieldModel.getFieldName()); + LOGGER.warn("不添加属性:{},因为没有添加api描述", f.getName()); + } + }else{ + LOGGER.info("【临时属性:{}】",f.getName()); + } + } + } catch (ClassNotFoundException e) { + LOGGER.error("【类:{}实例化出错】",clzFullName,e); + } + + return ResultBean.success("获取属性:" + fieldModelList.size()) + .setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()) + .setResultList(fieldModelList); + } + +} From af5a43a4c5b4afea2b83ff78a9b9f0099089cba4 Mon Sep 17 00:00:00 2001 From: "wei.peng" Date: Sat, 12 Jan 2019 15:53:30 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=AF=86=E7=A0=81?= =?UTF-8?q?=E5=8A=A0=E5=AF=86=E4=BE=A7=E7=8E=87=E5=8A=9F=E8=83=BD=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/api/iservice/base/ISystemInitService.java | 41 ++ .../core/api/iservice/busi/IPersonnelService.java | 14 +- .../core/api/iservice/busi/ISysConfigService.java | 2 + .../configuration/AppStartSystemInit.java | 32 ++ .../controller/busi/PersonnelController.java | 78 ++-- .../controller/busi/SysDepartmentController.java | 32 +- .../controller/busi/SysPositionController.java | 33 +- ...mpleServiceImpl.java => DataSimpleService.java} | 2 +- .../serviceimpl/base/SystemInitService.java | 144 ++++++ .../serviceimpl/busi/PersonnelServiceService.java | 481 +++++++++++++++++---- .../serviceimpl/busi/SysDepartmentService.java | 10 +- .../serviceimpl/busi/SysOrganizeService.java | 7 + .../i3plus/core/apiservice/util/HqlModelPack.java | 2 + 13 files changed, 717 insertions(+), 161 deletions(-) create mode 100644 modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/base/ISystemInitService.java create mode 100644 modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/configuration/AppStartSystemInit.java rename modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/{DataSimpleServiceImpl.java => DataSimpleService.java} (95%) create mode 100644 modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SystemInitService.java diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/base/ISystemInitService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/base/ISystemInitService.java new file mode 100644 index 0000000..9b5a4fa --- /dev/null +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/base/ISystemInitService.java @@ -0,0 +1,41 @@ +package cn.estsh.i3plus.core.api.iservice.base; + +import cn.estsh.i3plus.pojo.base.enumutil.ImppEnumUtil; +import io.swagger.annotations.ApiOperation; + +/** + * @Description : 系统启动加载服务 + * @Reference : + * @Author : Adair Peng + * @CreateDate : 2019-01-11 10:02 + * @Modify: + **/ +public interface ISystemInitService { + + /** + * 系统初始化加载 + */ + @ApiOperation(value = "初始化加载所有数据",notes = "初始化加载所有数据") + void loadAll(); + + /** + * 加载系统配置 + */ + @ApiOperation(value = "加载系统配置",notes = "加载系统配置") + void loadSysConfig(); + + /** + * 加载系统字典 + */ + @ApiOperation(value = "加载字典数据",notes = "加载字典数据") + void loadSysDictionary(); + + /** + * 加载系统语言信息 + */ + @ApiOperation(value = "加载语言数据",notes = "加载语言数据") + void loadSysLocaleLanguage(); + + @ApiOperation(value = "获取缓存中的数据",notes = "获取缓存中的数据") + Object getDataFromCache(String key,Class dataType); +} diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/IPersonnelService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/IPersonnelService.java index 41ce6cc..2821e8a 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/IPersonnelService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/IPersonnelService.java @@ -41,6 +41,9 @@ public interface IPersonnelService { @ApiOperation(value = "查询账号信息") List querySysUserByUserDetailModelOrIds(UserDetailModel model, List ids); + @ApiOperation(value = "查询账号信息") + ListPager querySysUserPagerByUserDetailModelOrIds(UserDetailModel model,Pager pager, List ids); + @ApiOperation(value = "获取用户信息") SysUserInfo getSysUserInfoById(Long id); @@ -101,7 +104,16 @@ public interface IPersonnelService { @ApiOperation(value = "岗位关系检查") void checkSysPositionRef(Long positionId); - @ApiOperation(value = "岗位关系检查") + @ApiOperation(value = "部门关系检查") + void checkSysDepartmentRef(Long departmentId); + + @ApiOperation(value = "组织关系检查") + void checkSysOrganizeRef(Long organizeId); + + @ApiOperation(value = "密码规则校验") + void checkSysUserPassword(String password); + + @ApiOperation(value = "菜单关系检查") void refreshMenuRdd(Long menuId); @ApiOperation(value = "岗位关系检查") diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysConfigService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysConfigService.java index 2cd9827..581b816 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysConfigService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysConfigService.java @@ -5,6 +5,7 @@ import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.platform.bean.SysConfig; import io.swagger.annotations.ApiOperation; +import java.util.Date; import java.util.List; /** @@ -81,4 +82,5 @@ public interface ISysConfigService { */ @ApiOperation(value = "根据系统配置代码修改配置项") void updateSysConfigByCode(String code,String value); + } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/configuration/AppStartSystemInit.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/configuration/AppStartSystemInit.java new file mode 100644 index 0000000..30eb423 --- /dev/null +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/configuration/AppStartSystemInit.java @@ -0,0 +1,32 @@ +package cn.estsh.i3plus.core.apiservice.configuration; + +import cn.estsh.i3plus.core.api.iservice.base.ISystemInitService; +import cn.estsh.i3plus.platform.common.util.CommonConstWords; +import cn.estsh.i3plus.pojo.base.enumutil.ImppEnumUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +/** + * @Description : + * @Reference : + * @Author : Adair Peng + * @CreateDate : 2019-01-11 9:55 + * @Modify: + **/ +@Component +public class AppStartSystemInit implements CommandLineRunner { + + public static final Logger LOGGER = LoggerFactory.getLogger(CommonConstWords.SYSTEM_LOG); + + @Autowired + private ISystemInitService systemInitService; + + @Override + public void run(String... args) throws Exception { + LOGGER.info(" Start Core Init Thread "); + systemInitService.loadAll(); + } +} diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/PersonnelController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/PersonnelController.java index 891c616..f99dfbc 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/PersonnelController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/PersonnelController.java @@ -7,9 +7,12 @@ import cn.estsh.i3plus.platform.common.tool.EncryptTool; 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.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.model.platform.UserDetailModel; +import cn.estsh.i3plus.pojo.model.platform.UserDetailPagerModel; import cn.estsh.i3plus.pojo.platform.bean.*; import cn.estsh.impp.framework.base.controller.CoreBaseController; import cn.estsh.impp.framework.boot.auth.AuthUtil; @@ -57,9 +60,23 @@ public class PersonnelController extends CoreBaseController { SysUserInfo info = model.getSysUserInfo(); checkUserDetailModel(model, false); + personnelService.checkSysUserPassword(model.getUserLoginPassword()); personnelService.checkSysUserOnly(user); - initUserDetail(info,user); + if(StringUtils.isBlank(info.getUserJoinDate())){ + info.setUserJoinDate(TimeTool.getToday()); + } + + info.setUserInfoStatus(CommonEnumUtil.USER_INFO_STATUS.INCUMBENT.getValue()); + info.setUserLoginNum(0); + info.setIsValid(CommonEnumUtil.IS_VAILD.VAILD.getValue()); + ConvertBean.modelInitialize(info, AuthUtil.getSessionUser()); + + user.setUserType(CommonEnumUtil.USER_TYPE.USER.getValue()); + user.setUserStatus(CommonEnumUtil.USER_STATUS.ENABLE.getValue()); + user.setIsValid(CommonEnumUtil.IS_VAILD.VAILD.getValue()); + user.setUserLoginNum(0); + ConvertBean.modelInitialize(user, AuthUtil.getSessionUser()); SysDepartment infoDepartment = personnelService.getSysDepartmentById(Long.parseLong(model.getInfoDepartmentId())); if(infoDepartment == null){ @@ -117,10 +134,9 @@ public class PersonnelController extends CoreBaseController { SysUserInfo info = model.getSysUserInfo(); checkUserDetailModel(model, true); + personnelService.checkSysUserPassword(model.getUserLoginPassword()); personnelService.checkSysUserOnly(user); - initUserDetail(info,user); - SysDepartment infoDepartment = personnelService.getSysDepartmentById(Long.parseLong(model.getInfoDepartmentId())); if(infoDepartment == null){ ValidatorBean.checkNotNull(infoDepartment,"用户主部门不存在"); @@ -166,7 +182,6 @@ public class PersonnelController extends CoreBaseController { } } - @PutMapping(value="/user/update") @ApiOperation(value="添加用户信息",notes="返回内容添加用户信息") public ResultBean updateUserModel(UserDetailModel model) { @@ -174,6 +189,7 @@ public class PersonnelController extends CoreBaseController { checkUserModel(model); SysUser user = personnelService.getSysUserById(Long.parseLong(model.getUserId())); initUser(model,user); + personnelService.checkSysUserPassword(model.getUserLoginPassword()); personnelService.checkSysUserOnly(user); SysDepartment userDepartment = personnelService.getSysDepartmentById(Long.parseLong(model.getUserDepartmentId())); @@ -380,14 +396,12 @@ public class PersonnelController extends CoreBaseController { } } - @PostMapping(value = "/query-ref-department") @ApiOperation(value = "查询角色的所有角色权限关系", notes = "查询角色的所有角色权限关系") - public ResultBean queryRefDepartment(UserDetailModel model) { + public ResultBean queryRefDepartment(@RequestBody UserDetailModel model) { try { - model.setUserDepartmentIdList(new ArrayList(Arrays.asList(new String[]{"1072037153732694016"}))); - List idList = new ArrayList<>(); + model.setUserDepartmentIdList(new ArrayList(Arrays.asList(new String[]{"1072037153732694016"}))); List refs = personnelService.querySysRefUserDepartmentByUserDetailModel(model); if(refs != null && refs.size() > 0){ @@ -405,6 +419,27 @@ public class PersonnelController extends CoreBaseController { } } + @PostMapping(value = "/pager/query-ref-department") + @ApiOperation(value = "查询角色的所有角色权限关系", notes = "查询角色的所有角色权限关系") + public ResultBean queryPagerRefDepartment(@RequestBody UserDetailPagerModel model) { + try { + List idList = new ArrayList<>(); + List refs = personnelService.querySysRefUserDepartmentByUserDetailModel(model.getUserDetailModel()); + if(refs != null && refs.size() > 0){ + for (SysRefUserDepartment ref : refs) { + idList.add(ref.getUserId()); + } + } + + ListPager result = personnelService.querySysUserPagerByUserDetailModelOrIds(model.getUserDetailModel(), model.getPager(), idList); + return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultObject(result); + } catch (ImppBusiException busExcep) { + return ResultBean.fail(busExcep); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + /** * 数据必填校验 * @param model @@ -450,33 +485,6 @@ public class PersonnelController extends CoreBaseController { /** * 用户信息初始化 - * @param info - * @param user - * @throws Exception - */ - private void initUserDetail(SysUserInfo info ,SysUser user)throws Exception{ - if(StringUtils.isBlank(info.getUserJoinDate())){ - info.setUserJoinDate(TimeTool.getToday()); - } - - if(info != null){ - info.setUserInfoStatus(CommonEnumUtil.USER_INFO_STATUS.INCUMBENT.getValue()); - info.setUserLoginNum(0); - info.setIsValid(CommonEnumUtil.IS_VAILD.VAILD.getValue()); - ConvertBean.modelInitialize(info, AuthUtil.getSessionUser()); - } - - if(user != null){ - user.setUserType(CommonEnumUtil.USER_TYPE.USER.getValue()); - user.setUserStatus(CommonEnumUtil.USER_STATUS.ENABLE.getValue()); - user.setIsValid(CommonEnumUtil.IS_VAILD.VAILD.getValue()); - user.setUserLoginNum(0); - ConvertBean.modelInitialize(user, AuthUtil.getSessionUser()); - } - } - - /** - * 用户信息初始化 * @param model * @param user * @throws Exception diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysDepartmentController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysDepartmentController.java index 6941388..9fe63fd 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysDepartmentController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysDepartmentController.java @@ -109,22 +109,6 @@ public class SysDepartmentController extends CoreBaseController { } } - @DeleteMapping(value = "/delete/{id}") - @ApiOperation(value = "删除部门", notes = "根据部门id删除信息") - public ResultBean deleteSysDepartment(@PathVariable("id") String id) { - try { - //条件验证 - ValidatorBean.checkNotNull(id, "id为空。"); - - departmentService.deleteSysDepartmentById(Long.parseLong(id)); - return ResultBean.success("删除成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); - } catch (ImppBusiException busExcep) { - return ResultBean.fail(busExcep); - } catch (Exception e) { - return ImppExceptionBuilder.newInstance().buildExceptionResult(e); - } - } - @GetMapping(value = "/list") @ApiOperation(value = "查询所有部门", notes = "查询所有部门") public ResultBean findSysDepartmentAll() { @@ -183,6 +167,22 @@ public class SysDepartmentController extends CoreBaseController { } } + @DeleteMapping(value = "/delete/{id}") + @ApiOperation(value = "删除部门", notes = "根据部门id删除信息") + public ResultBean deleteSysDepartment(@PathVariable("id") String id) { + try { + //条件验证 + ValidatorBean.checkNotNull(id, "id为空。"); + + departmentService.deleteSysDepartmentById(Long.parseLong(id)); + return ResultBean.success("删除成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + } catch (ImppBusiException busExcep) { + return ResultBean.fail(busExcep); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + @DeleteMapping(value = "/batch-delete") @ApiOperation(value = "根据id批量删除", notes = "根据id批量删除") public ResultBean deleteSysDepartmentByIds(String[] ids){ diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysPositionController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysPositionController.java index dc0ec77..0a8ed72 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysPositionController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysPositionController.java @@ -99,22 +99,6 @@ public class SysPositionController extends CoreBaseController { } } - @DeleteMapping(value="/delete/{id}") - @ApiOperation(value="删除岗位",notes="根据岗位id删除信息") - public ResultBean deleteSysPosition(@PathVariable("id") String id){ - try { - //条件验证 - ValidatorBean.checkNotNull(id,"id为空"); - - positionService.deleteSysPositionById(Long.parseLong(id)); - return ResultBean.success("删除成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); - } catch (ImppBusiException busExcep) { - return ResultBean.fail(busExcep); - } catch (Exception e) { - return ResultBean.fail(e).setCode(ImppExceptionEnum.BUSINESS_EXCEPTION_DATA_ERROR.getCode()); - } - } - @GetMapping(value="/list") @ApiOperation(value="查询所有岗位",notes="查询所有岗位") public ResultBean findSysPositionAll(){ @@ -161,6 +145,22 @@ public class SysPositionController extends CoreBaseController { } } + @DeleteMapping(value="/delete/{id}") + @ApiOperation(value="删除岗位",notes="根据岗位id删除信息") + public ResultBean deleteSysPosition(@PathVariable("id") String id){ + try { + //条件验证 + ValidatorBean.checkNotNull(id,"id为空"); + + positionService.deleteSysPositionById(Long.parseLong(id)); + return ResultBean.success("删除成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + } catch (ImppBusiException busExcep) { + return ResultBean.fail(busExcep); + } catch (Exception e) { + return ResultBean.fail(e).setCode(ImppExceptionEnum.BUSINESS_EXCEPTION_DATA_ERROR.getCode()); + } + } + @DeleteMapping(value = "/batch-delete") @ApiOperation(value = "根据id批量删除", notes = "根据id批量删除") public ResultBean deleteSysPositionByIds(String[] ids){ @@ -182,5 +182,4 @@ public class SysPositionController extends CoreBaseController { return ResultBean.fail(e).setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()); } } - } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/DataSimpleServiceImpl.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/DataSimpleService.java similarity index 95% rename from modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/DataSimpleServiceImpl.java rename to modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/DataSimpleService.java index 4eda967..69663d6 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/DataSimpleServiceImpl.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/DataSimpleService.java @@ -13,7 +13,7 @@ import org.springframework.stereotype.Service; * @Modify: **/ @Service -public class DataSimpleServiceImpl implements IDataSimpleService { +public class DataSimpleService implements IDataSimpleService { private Logger LOGGER = LoggerFactory.getLogger(this.getClass()); /*@Autowired 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 new file mode 100644 index 0000000..bccc166 --- /dev/null +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SystemInitService.java @@ -0,0 +1,144 @@ +package cn.estsh.i3plus.core.apiservice.serviceimpl.base; + +import cn.estsh.i3plus.core.api.iservice.base.ISystemInitService; +import cn.estsh.i3plus.platform.common.util.CommonConstWords; +import cn.estsh.i3plus.pojo.base.enumutil.ImppEnumUtil; +import cn.estsh.i3plus.pojo.platform.bean.SysConfig; +import cn.estsh.i3plus.pojo.platform.bean.SysDictionary; +import cn.estsh.i3plus.pojo.platform.repository.SysConfigRepository; +import cn.estsh.i3plus.pojo.platform.repository.SysDictionaryRepository; +import cn.estsh.i3plus.pojo.platform.repository.SysLocaleLanguageRepository; +import cn.estsh.impp.framework.boot.util.ImppRedis; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @Description : + * @Reference : + * @Author : Adair Peng + * @CreateDate : 2019-01-11 12:34 + * @Modify: + **/ +@Service +public class SystemInitService implements ISystemInitService { + + private static final Logger LOGGER = LoggerFactory.getLogger(SystemLoginService.class); + + @Autowired + private SysConfigRepository configRDao; + + @Autowired + private SysDictionaryRepository dictionaryRDao; + + @Autowired + private SysLocaleLanguageRepository localeLanguageRDao; + + @Resource(name="redisRes") + private ImppRedis redisRes; + + private int type = ImppEnumUtil.SYS_CACHE_TYPE.REDIS.getValue(); + + @Override + @ApiOperation(value = "初始化加载所有数据",notes = "初始化加载所有数据") + public void loadAll() { + type = ImppEnumUtil.SYS_CACHE_TYPE.REDIS.getValue(); + loadSysConfig(); + loadSysDictionary(); + loadSysLocaleLanguage(); + } + + @Override + @ApiOperation(value = "加载系统配置",notes = "加载系统配置") + public void loadSysConfig() { + String redisKey = null; + List list = configRDao.findAll(); + for (SysConfig config : list) { + redisKey = CommonConstWords.REDIS_PREFIX_CACHE_CONFIG + "_" + config.getConfigCode(); + + //存放于缓存 + putDataToCache(redisKey, config,SysConfig.class); + } + LOGGER.info("加载系统配置数量:【{}】",list.size()); + } + + @Override + @ApiOperation(value = "加载字典数据",notes = "加载字典数据") + public void loadSysDictionary() { + List list = dictionaryRDao.findAll(); + if(list != null && list.size() > 0){ + Map> parentCodeMap = list.stream().collect(Collectors.groupingBy(SysDictionary::getParentCodeRdd)); + Map> parentIdMap = list.stream().collect(Collectors.groupingBy(SysDictionary::getParentId)); + + for (String key : parentCodeMap.keySet()) { + //存放于缓存 + putDataToCache(CommonConstWords.REDIS_PREFIX_CACHE_DICTIONARY + "_" + key, + parentCodeMap.get(key),List.class); + } + + for (long key : parentIdMap.keySet()) { + putDataToCache(CommonConstWords.REDIS_PREFIX_CACHE_DICTIONARY + "_" + key, + parentIdMap.get(key),List.class); + } + } + } + + @Override + @ApiOperation(value = "加载语言数据",notes = "加载语言数据") + public void loadSysLocaleLanguage() { + // Redis 缓存 + if(type == ImppEnumUtil.SYS_CACHE_TYPE.REDIS.getValue()){ + // TODO 汪云昊 实现 + } + } + + + /** + * 缓存存放数据统一管理 + * @param key + * @param data + * @param dataType + */ + private void putDataToCache(String key,Object data,Class dataType){ + if(type == ImppEnumUtil.SYS_CACHE_TYPE.REDIS.getValue()){ + 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{ + LOGGER.error("不支持树形{}存放缓存!",dataType); + } + } + } + + /** + * 从缓存获取对象数据 + * @param key + * @param dataType + * @return + */ + @Override + @ApiOperation(value = "获取缓存中的数据",notes = "获取缓存中的数据") + public Object getDataFromCache(String key,Class dataType){ + if(type == ImppEnumUtil.SYS_CACHE_TYPE.REDIS.getValue()){ + // Redis 缓存 + if(dataType == List.class){ + return redisRes.getList(key,0,-1); + }else if(dataType == SysConfig.class){ + return redisRes.getObject(key); + }else{ + LOGGER.error("不支持树形{}存放缓存!",dataType); + } + } + return null; + } +} diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/PersonnelServiceService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/PersonnelServiceService.java index 96df3fb..7237f47 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/PersonnelServiceService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/PersonnelServiceService.java @@ -1,12 +1,16 @@ package cn.estsh.i3plus.core.apiservice.serviceimpl.busi; +import cn.estsh.i3plus.core.api.iservice.base.ISystemInitService; import cn.estsh.i3plus.core.api.iservice.busi.IPersonnelService; import cn.estsh.i3plus.core.api.iservice.busi.ISysRoleService; import cn.estsh.i3plus.core.apiservice.util.HqlModelPack; +import cn.estsh.i3plus.platform.common.tool.StringTool; import cn.estsh.i3plus.platform.common.util.CommonConstWords; 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.base.enumutil.ImppEnumUtil; import cn.estsh.i3plus.pojo.base.shirotoken.UserToken; import cn.estsh.i3plus.pojo.base.tool.HqlPack; import cn.estsh.i3plus.pojo.model.platform.UserDetailModel; @@ -84,6 +88,12 @@ public class PersonnelServiceService implements IPersonnelService { @Resource(name="redisCore") protected ImppRedis redisCore; + @Resource(name="redisRes") + private ImppRedis redisRes; + + @Autowired + private ISystemInitService systemInitService; + @Override public SysUser saveSysUser(SysUser user) { LOGGER.debug("平台账号 SysUser user:{}", user); @@ -147,6 +157,16 @@ public class PersonnelServiceService implements IPersonnelService { } @Override + @ApiOperation(value = "查询账号信息") + public ListPager querySysUserPagerByUserDetailModelOrIds(UserDetailModel model,Pager pager, List ids) { + LOGGER.debug("平台用户 SysUser model:{} ids:{}", model, ids); + String modeWhere = HqlModelPack.packHqlSysUserByModelOrIds(model, ids); + + pager = PagerHelper.getPager(pager, userRDao.findByHqlWhereCount(modeWhere)); + return new ListPager(userRDao.findByHqlWherePage(modeWhere + model.orderBy(), pager), pager); + } + + @Override public SysUserInfo getSysUserInfoById(Long id) { return userInfoRDao.getById(id); } @@ -388,19 +408,52 @@ public class PersonnelServiceService implements IPersonnelService { .setErrorSolution("请先删除子集信息在操作") .build(); } - - long refPositionCount = refUserPositionRDao.findByPropertyCount("positionId",positionId); - if (refPositionCount >= 1) { +// long refPositionCount = refUserPositionRDao.findByPropertyCount("positionId",positionId); +// if (refPositionCount >= 1) { +// throw ImppExceptionBuilder.newInstance() +// .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) +// .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) +// .setErrorDetail("存在用户关系引用信息无法删除!") +// .setErrorSolution("请先删除用户关系信息再操作") +// .build(); +// } + long refUserInfoCount = userInfoRDao.findByPropertyCount("positionId",positionId); + if (refUserInfoCount >= 1) { throw ImppExceptionBuilder.newInstance() .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) - .setErrorDetail("存在用户关系引用信息无法删除!") - .setErrorSolution("请先删除用户关系信息再操作") + .setErrorDetail("存在用户信息无法删除!") + .setErrorSolution("请先删除用户引用信息再操作") .build(); } + } + } - long refUserInfoCount = userInfoRDao.findByPropertyCount("positionId",positionId); - if (refUserInfoCount >= 1) { + @Override + public void checkSysDepartmentRef(Long departmentId) { + LOGGER.debug("平台部门 SysDepartment departmentId:{}", departmentId); + + if(departmentId != null){ + long departmentCount = departmentRDao.findByPropertyCount("parentId",departmentId); + if (departmentCount >= 1) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("存在相关部门信息无法删除!") + .setErrorSolution("请先删除子集信息在操作") + .build(); + } +// long refPositionCount = refUserPositionRDao.findByPropertyCount("positionId",positionId); +// if (refPositionCount >= 1) { +// throw ImppExceptionBuilder.newInstance() +// .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) +// .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) +// .setErrorDetail("存在用户关系引用信息无法删除!") +// .setErrorSolution("请先删除用户关系信息再操作") +// .build(); +// } + long userInfoCount = userInfoRDao.findByPropertyCount("departmentId",departmentId); + if (userInfoCount >= 1) { throw ImppExceptionBuilder.newInstance() .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) @@ -408,101 +461,146 @@ public class PersonnelServiceService implements IPersonnelService { .setErrorSolution("请先删除用户引用信息再操作") .build(); } + + long userCount = userRDao.findByPropertyCount("departmentId",departmentId); + if (userCount >= 1) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("存在账号信息无法删除!") + .setErrorSolution("请先删除账号引用信息再操作") + .build(); + } } } - /************************************ 用户唯一检查 ****************************************/ + @Override + public void checkSysOrganizeRef(Long organizeId) { + LOGGER.debug("平台部门 SysOrganize organizeId:{}", organizeId); - /** - * 登录名 唯一检查 - * @param userLoginName - * @param userId - * @return - */ - private boolean checkSysUserLoginName(String userLoginName, long userId) { - int count = 0; - if(userId > 0){ - StringBuffer sw = new StringBuffer(); - HqlPack.getNumEqualPack(CommonEnumUtil.IS_VAILD.VAILD.getValue(),"isValid",sw); - HqlPack.getStringEqualPack(userLoginName,"userLoginName",sw); - HqlPack.getNumNOEqualPack(userId,"id",sw); - count = userRDao.findByHqlWhereCount(sw.toString()); + if(organizeId != null){ + long organizeCount = organizeRDao.findByPropertyCount("parentId",organizeId); + if (organizeCount >= 1) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("存在相关组织信息无法删除!") + .setErrorSolution("请先删除子集信息在操作") + .build(); + } - }else{ - count = userRDao.findByPropertyCount( - new String[]{"userLoginName","isValid"}, - new Object[]{userLoginName,CommonEnumUtil.IS_VAILD.VAILD.getValue()}); - } - return count <= 0 ; - } +// long refPositionCount = refUserPositionRDao.findByPropertyCount("positionId",positionId); +// if (refPositionCount >= 1) { +// throw ImppExceptionBuilder.newInstance() +// .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) +// .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) +// .setErrorDetail("存在用户关系引用信息无法删除!") +// .setErrorSolution("请先删除用户关系信息再操作") +// .build(); +// } + + long departmentCount = departmentRDao.findByPropertyCount("organizeId",organizeId); + if (departmentCount >= 1) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("存在部门信息无法删除!") + .setErrorSolution("请先删除部门引用信息再操作") + .build(); + } - /** - * 用户邮箱唯一检查 - * @param email - * @param infoId - * @return - */ - private boolean checkSysUserEmail(String email, long infoId) { - int count; - if(infoId > 0){ - StringBuffer sw = new StringBuffer(); - HqlPack.getNumEqualPack(CommonEnumUtil.IS_VAILD.VAILD.getValue(),"isValid",sw); - HqlPack.getStringEqualPack(email,"userEmail",sw); - HqlPack.getNumNOEqualPack(infoId,"userInfoId",sw); - count = userRDao.findByHqlWhereCount(sw.toString()); + long userInfoCount = userInfoRDao.findByPropertyCount("organizeId",organizeId); + if (userInfoCount >= 1) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("存在用户信息无法删除!") + .setErrorSolution("请先删除用户引用信息再操作") + .build(); + } - }else{ - count = userRDao.findByPropertyCount( - new String[]{"userEmail","isValid"}, - new Object[]{email,CommonEnumUtil.IS_VAILD.VAILD.getValue()}); + long userCount = userRDao.findByPropertyCount("organizeId",organizeId); + if (userCount >= 1) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("存在账号信息无法删除!") + .setErrorSolution("请先删除账号引用信息再操作") + .build(); + } } - return count <= 0 ; } - /** - * 手机号码 唯一校验 - * @param phone - * @param infoId - * @return - */ - private boolean checkSysUserPhone(String phone, long infoId) { - int count; - if(infoId > 0){ - StringBuffer sw = new StringBuffer(); - HqlPack.getNumEqualPack(CommonEnumUtil.IS_VAILD.VAILD.getValue(),"isValid",sw); - HqlPack.getStringEqualPack(phone,"userPhone",sw); - HqlPack.getNumNOEqualPack(infoId,"userInfoId",sw); - count = userRDao.findByHqlWhereCount(sw.toString()); + @Override + public void checkSysUserPassword(String password) { + LOGGER.debug("平台用户 SysUser password:{}", password); - }else{ - count = userRDao.findByPropertyCount( - new String[]{"userPhone","isValid"}, - new Object[]{phone,CommonEnumUtil.IS_VAILD.VAILD.getValue()}); - } - return count <= 0 ; - } + if(StringUtils.isNotBlank(password)){ + // 密码长度校验 + String redisKey = CommonConstWords.REDIS_PREFIX_CACHE_CONFIG + "_" + CommonConstWords.CONFIG_PWD_LENGTH; + SysConfig config = (SysConfig) systemInitService.getDataFromCache(redisKey, SysConfig.class); - /** - * 工号唯一检查 - * @param empNo - * @param infoId - * @return - */ - private boolean checkSysUserEmpNo(String empNo, long infoId) { - int count; - if(infoId > 0){ - StringBuffer sw = new StringBuffer(); - HqlPack.getNumEqualPack(CommonEnumUtil.IS_VAILD.VAILD.getValue(),"isValid",sw); - HqlPack.getStringEqualPack(empNo,"userEmpNo",sw); - HqlPack.getNumNOEqualPack(infoId,"userInfoId",sw); - count = userRDao.findByHqlWhereCount(sw.toString()); + if(!checkPasswordLength(config,password)){ + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) + .setErrorDetail("密码长度不足") + .setErrorSolution("请重新输入") + .build(); + } - }else{ - count = userRDao.findByPropertyCount( - new String[]{"userEmpNo","isValid"}, - new Object[]{empNo,CommonEnumUtil.IS_VAILD.VAILD.getValue()}); + // 密码小写校验 + redisKey = CommonConstWords.REDIS_PREFIX_CACHE_CONFIG + "_" + CommonConstWords.CONFIG_PWD_EXIST_LOWER_ENGLISH; + config = (SysConfig) systemInitService.getDataFromCache(redisKey, SysConfig.class); + + if(!checkPasswordLowerEnglish(config,password)){ + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) + .setErrorDetail("密码必须包含小写英文") + .setErrorSolution("请重新输入") + .build(); + } + + // 密码大写校验 + redisKey = CommonConstWords.REDIS_PREFIX_CACHE_CONFIG + "_" + CommonConstWords.CONFIG_PWD_EXIST_UPPERCASE_ENGLISH; + config = (SysConfig) systemInitService.getDataFromCache(redisKey, SysConfig.class); + + if(!checkPasswordUpperEnglish(config,password)){ + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) + .setErrorDetail("密码必须包含大写英文") + .setErrorSolution("请重新输入") + .build(); + } + + // 密码特殊字符 + redisKey = CommonConstWords.REDIS_PREFIX_CACHE_CONFIG + "_" + CommonConstWords.CONFIG_PWD_EXIST_SPECIAL_CHAR; + config = (SysConfig) systemInitService.getDataFromCache(redisKey, SysConfig.class); + + if(!checkPasswordSpecialChar(config,password)){ + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) + .setErrorDetail("密码必须包含特殊字符") + .setErrorSolution("请重新输入") + .build(); + } + + // 密码特殊字符 + redisKey = CommonConstWords.REDIS_PREFIX_CACHE_CONFIG + "_" + CommonConstWords.CONFIG_PWD_EXIST_NUMBER; + config = (SysConfig) systemInitService.getDataFromCache(redisKey, SysConfig.class); + + if(!checkPasswordNumber(config,password)){ + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) + .setErrorDetail("密码必须包含数字") + .setErrorSolution("请重新输入") + .build(); + } } - return count <= 0 ; } @Override @@ -958,4 +1056,211 @@ public class PersonnelServiceService implements IPersonnelService { } } } + +/*********************************** 检查方法封装 ***********************************/ + + /** + * 校验密码长度 + * @return + */ + private boolean checkPasswordLength(SysConfig config,String password){ + if(config != null){ + if(config.getConfigValue() == null || config.getConfigType().equals(ImppEnumUtil.SYS_VALUE_TYPE.NUMBER.getValue())){ + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) + .setErrorDetail("系统配置格式错误(密码长度)") + .setErrorSolution("请先配置系统参数") + .build(); + }else { + int length = Integer.parseInt(config.getConfigValue()); + return password.trim().length() >= length; + } + } + return true; + } + + /** + * 校验密码小写 + * @param password + * @return + */ + private boolean checkPasswordLowerEnglish(SysConfig config,String password){ + if(config != null){ + if(config.getConfigValue() == null || config.getConfigType().equals(ImppEnumUtil.SYS_VALUE_TYPE.SWITCH.getValue())){ + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) + .setErrorDetail("系统配置格式错误(密码英文小写配置)") + .setErrorSolution("请先配置系统参数") + .build(); + }else { + if(config.getConfigValue().equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr())){ + return StringTool.isContainLowerCase(password); + } + } + } + return true; + } + + /** + * 校验密码大写 + * @param password + * @return + */ + private boolean checkPasswordUpperEnglish(SysConfig config,String password){ + if(config != null){ + if(config.getConfigValue() == null || config.getConfigType().equals(ImppEnumUtil.SYS_VALUE_TYPE.SWITCH.getValue())){ + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) + .setErrorDetail("系统配置格式错误(密码英文大写配置)") + .setErrorSolution("请先配置系统参数") + .build(); + }else { + if(config.getConfigValue().equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr())){ + return StringTool.isContainUpperCase(password); + } + } + } + return true; + } + + /** + * 校验密码大写 + * @param password + * @return + */ + private boolean checkPasswordNumber(SysConfig config,String password){ + if(config != null){ + if(config.getConfigValue() == null || config.getConfigType().equals(ImppEnumUtil.SYS_VALUE_TYPE.SWITCH.getValue())){ + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) + .setErrorDetail("系统配置格式错误(密码数字配置)") + .setErrorSolution("请先配置系统参数") + .build(); + }else { + if(config.getConfigValue().equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr())){ + return StringTool.isContainNumber(password); + } + } + } + return true; + } + + /** + * 校验密码特殊字符 + * @param password + * @return + */ + private boolean checkPasswordSpecialChar(SysConfig config,String password){ + if(config != null){ + if(config.getConfigValue() == null || config.getConfigType().equals(ImppEnumUtil.SYS_VALUE_TYPE.SWITCH.getValue())){ + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) + .setErrorDetail("系统配置格式错误(密码特殊字符配置)") + .setErrorSolution("请先配置系统参数") + .build(); + }else { + if(config.getConfigValue().equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr())){ + return StringTool.isConSpeCharacters(password); + } + } + } + return true; + } + + /** + * 登录名 唯一检查 + * @param userLoginName + * @param userId + * @return + */ + private boolean checkSysUserLoginName(String userLoginName, long userId) { + int count = 0; + if(userId > 0){ + StringBuffer sw = new StringBuffer(); + HqlPack.getNumEqualPack(CommonEnumUtil.IS_VAILD.VAILD.getValue(),"isValid",sw); + HqlPack.getStringEqualPack(userLoginName,"userLoginName",sw); + HqlPack.getNumNOEqualPack(userId,"id",sw); + count = userRDao.findByHqlWhereCount(sw.toString()); + + }else{ + count = userRDao.findByPropertyCount( + new String[]{"userLoginName","isValid"}, + new Object[]{userLoginName,CommonEnumUtil.IS_VAILD.VAILD.getValue()}); + } + return count <= 0 ; + } + + /** + * 用户邮箱唯一检查 + * @param email + * @param infoId + * @return + */ + private boolean checkSysUserEmail(String email, long infoId) { + int count; + if(infoId > 0){ + StringBuffer sw = new StringBuffer(); + HqlPack.getNumEqualPack(CommonEnumUtil.IS_VAILD.VAILD.getValue(),"isValid",sw); + HqlPack.getStringEqualPack(email,"userEmail",sw); + HqlPack.getNumNOEqualPack(infoId,"userInfoId",sw); + count = userRDao.findByHqlWhereCount(sw.toString()); + + }else{ + count = userRDao.findByPropertyCount( + new String[]{"userEmail","isValid"}, + new Object[]{email,CommonEnumUtil.IS_VAILD.VAILD.getValue()}); + } + return count <= 0 ; + } + + /** + * 手机号码 唯一校验 + * @param phone + * @param infoId + * @return + */ + private boolean checkSysUserPhone(String phone, long infoId) { + int count; + if(infoId > 0){ + StringBuffer sw = new StringBuffer(); + HqlPack.getNumEqualPack(CommonEnumUtil.IS_VAILD.VAILD.getValue(),"isValid",sw); + HqlPack.getStringEqualPack(phone,"userPhone",sw); + HqlPack.getNumNOEqualPack(infoId,"userInfoId",sw); + count = userRDao.findByHqlWhereCount(sw.toString()); + + }else{ + count = userRDao.findByPropertyCount( + new String[]{"userPhone","isValid"}, + new Object[]{phone,CommonEnumUtil.IS_VAILD.VAILD.getValue()}); + } + return count <= 0 ; + } + + /** + * 工号唯一检查 + * @param empNo + * @param infoId + * @return + */ + private boolean checkSysUserEmpNo(String empNo, long infoId) { + int count; + if(infoId > 0){ + StringBuffer sw = new StringBuffer(); + HqlPack.getNumEqualPack(CommonEnumUtil.IS_VAILD.VAILD.getValue(),"isValid",sw); + HqlPack.getStringEqualPack(empNo,"userEmpNo",sw); + HqlPack.getNumNOEqualPack(infoId,"userInfoId",sw); + count = userRDao.findByHqlWhereCount(sw.toString()); + + }else{ + count = userRDao.findByPropertyCount( + new String[]{"userEmpNo","isValid"}, + new Object[]{empNo,CommonEnumUtil.IS_VAILD.VAILD.getValue()}); + } + return count <= 0 ; + } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysDepartmentService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysDepartmentService.java index 5a86ac2..061a1b6 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysDepartmentService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysDepartmentService.java @@ -95,9 +95,9 @@ public class SysDepartmentService implements ISysDepartmentService { .setErrorSolution("请先删除子集信息在操作") .build(); } - - // 删除部门 - LOGGER.info("部门信息 DEPARTMENT :{}", id); + // 检查部门引用管理 + personnelService.checkSysDepartmentRef(id); + // 删除数据 departmentRDao.deleteById(id); } @@ -114,6 +114,10 @@ public class SysDepartmentService implements ISysDepartmentService { .setErrorSolution("请先删除子集信息在操作") .build(); }else { + for (Long id : ids) { + personnelService.checkSysDepartmentRef(id); + } + departmentRDao.deleteByIds(ids); } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysOrganizeService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysOrganizeService.java index 958fdd7..354b4a3 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysOrganizeService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysOrganizeService.java @@ -102,6 +102,9 @@ public class SysOrganizeService implements ISysOrganizeService { .setErrorSolution("请先删除子集信息在操作") .build(); } + // 检查引用关系 + personnelService.checkSysOrganizeRef(id); + // 删除数据 organizeRDao.deleteById(id); } @@ -117,6 +120,10 @@ public class SysOrganizeService implements ISysOrganizeService { .setErrorSolution("请先删除子集信息在操作") .build(); }else { + // 检查引用关系 + for (Long id : ids) { + personnelService.checkSysOrganizeRef(id); + } organizeRDao.deleteByIds(ids); } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/HqlModelPack.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/HqlModelPack.java index 6995928..5c93ccb 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/HqlModelPack.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/HqlModelPack.java @@ -27,6 +27,8 @@ public class HqlModelPack { // And HqlPack.getNumEqualPack(model.getUserStatus(),"userStatus",result); + HqlPack.getNumEqualPack(model.getUserPhone(),"userPhone",result); + if(idList != null && idList.size() > 0){ HqlPack.getInPack(StringUtils.join(idList, ","), "id", result); } From 586abcace49b963c6949731b1b1f450b6bb91938 Mon Sep 17 00:00:00 2001 From: "wei.peng" Date: Sat, 12 Jan 2019 16:11:12 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E9=85=8D=E7=BD=AE=20?= =?UTF-8?q?=E5=88=B7=E6=96=B0=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/apiservice/controller/busi/SysConfigController.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysConfigController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysConfigController.java index 99017b1..030cac2 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysConfigController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysConfigController.java @@ -1,5 +1,6 @@ package cn.estsh.i3plus.core.apiservice.controller.busi; +import cn.estsh.i3plus.core.api.iservice.base.ISystemInitService; import cn.estsh.i3plus.core.api.iservice.busi.ISysConfigService; import cn.estsh.i3plus.core.apiservice.util.MailUtil; import cn.estsh.i3plus.platform.common.convert.ConvertBean; @@ -45,6 +46,9 @@ public class SysConfigController extends CoreBaseController { @Autowired private MailUtil mailUtil; + @Autowired + private ISystemInitService systemInitService; + @PostMapping("/insert") @ApiOperation(value = "添加系统参数",notes = "添加系统参数") public ResultBean insertSysConfig(SysConfig sysConfig) { @@ -63,6 +67,7 @@ public class SysConfigController extends CoreBaseController { ConvertBean.modelInitialize(sysConfig,user); sysConfigService.insertSysConfig(sysConfig); + systemInitService.loadSysConfig(); return ResultBean.success("添加成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ return ResultBean.fail(busExcep); @@ -87,6 +92,7 @@ public class SysConfigController extends CoreBaseController { } sysConfigService.deleteSysConfigById(Long.parseLong(idStr)); + systemInitService.loadSysConfig(); return ResultBean.success("删除成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ return ResultBean.fail(busExcep); @@ -113,6 +119,7 @@ public class SysConfigController extends CoreBaseController { ConvertBean.modelUpdate(sysConfig,user); sysConfigService.updateSysConfig(sysConfig); + systemInitService.loadSysConfig(); return ResultBean.success("修改成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ return ResultBean.fail(busExcep); @@ -213,6 +220,7 @@ public class SysConfigController extends CoreBaseController { ValidatorBean.checkNotNull(value,"值不能为空"); sysConfigService.updateSysConfigByCode(code,value); + systemInitService.loadSysConfig(); return ResultBean.success("查询成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ return ResultBean.fail(busExcep); From bf0a665f99dd7ae4536942b44d8931f54c5499a0 Mon Sep 17 00:00:00 2001 From: "wei.peng" Date: Sat, 12 Jan 2019 16:14:10 +0800 Subject: [PATCH 5/8] =?UTF-8?q?Cloud=20=E7=86=94=E6=96=AD=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E8=B0=83=E6=95=B4=E4=B8=BA=2030s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-dev.properties | 12 ++++++------ .../src/main/resources/application-prod.properties | 10 +++++----- .../src/main/resources/application-test.properties | 10 +++++----- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/modules/i3plus-core-apiservice/src/main/resources/application-dev.properties b/modules/i3plus-core-apiservice/src/main/resources/application-dev.properties index ce37a0f..734b8da 100644 --- a/modules/i3plus-core-apiservice/src/main/resources/application-dev.properties +++ b/modules/i3plus-core-apiservice/src/main/resources/application-dev.properties @@ -1,7 +1,7 @@ #项目端口 server.port=8100 #本机ip -impp.server.ip=192.168.1.56 +impp.server.ip=192.168.1.40 #console控制台服务(zipkin追踪全路径) impp.console.ip=http://csd.estsh.com @@ -63,14 +63,14 @@ eureka.instance.lease-renewal-interval-in-seconds=20 #打开feign的熔断 feign.hystrix.enabled=true -#读取数据时长 -ribbon.ReadTimeout=3000 -#连接时长 -ribbon.ConnectTimeout=3000 #重试 ribbon.maxAutoRetries=2 +#读取数据时长 +ribbon.ReadTimeout=30000 +#连接时长 +ribbon.ConnectTimeout=30000 #响应超过时长,进行熔断(熔断超时需要大于读取时长及连接时长) -hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000 +hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=35000 #集群名 eureka.instance.metadata-map.cluster=impp_cluster diff --git a/modules/i3plus-core-apiservice/src/main/resources/application-prod.properties b/modules/i3plus-core-apiservice/src/main/resources/application-prod.properties index 07fc220..4b3bc09 100644 --- a/modules/i3plus-core-apiservice/src/main/resources/application-prod.properties +++ b/modules/i3plus-core-apiservice/src/main/resources/application-prod.properties @@ -58,14 +58,14 @@ eureka.instance.lease-renewal-interval-in-seconds=20 #打开feign的熔断 feign.hystrix.enabled=true -#读取数据时长 -ribbon.ReadTimeout=3000 -#连接时长 -ribbon.ConnectTimeout=3000 #重试 ribbon.maxAutoRetries=2 +#读取数据时长 +ribbon.ReadTimeout=30000 +#连接时长 +ribbon.ConnectTimeout=30000 #响应超过时长,进行熔断(熔断超时需要大于读取时长及连接时长) -hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000 +hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=35000 #集群名 eureka.instance.metadata-map.cluster=impp_cluster diff --git a/modules/i3plus-core-apiservice/src/main/resources/application-test.properties b/modules/i3plus-core-apiservice/src/main/resources/application-test.properties index 3da4b58..97ede48 100644 --- a/modules/i3plus-core-apiservice/src/main/resources/application-test.properties +++ b/modules/i3plus-core-apiservice/src/main/resources/application-test.properties @@ -63,14 +63,14 @@ eureka.instance.lease-renewal-interval-in-seconds=20 #打开feign的熔断 feign.hystrix.enabled=true -#读取数据时长 -ribbon.ReadTimeout=3000 -#连接时长 -ribbon.ConnectTimeout=3000 #重试 ribbon.maxAutoRetries=2 +#读取数据时长 +ribbon.ReadTimeout=30000 +#连接时长 +ribbon.ConnectTimeout=30000 #响应超过时长,进行熔断(熔断超时需要大于读取时长及连接时长) -hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000 +hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=35000 #集群名 eureka.instance.metadata-map.cluster=impp_cluster From 2cf7a85a31c72271697179aa95ec7d9476eebd5a Mon Sep 17 00:00:00 2001 From: "wei.peng" Date: Sat, 12 Jan 2019 16:29:57 +0800 Subject: [PATCH 6/8] =?UTF-8?q?Cloud=20=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../estsh/i3plus/core/apiservice/controller/busi/SysUserController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java index 4cddce5..06f5199 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java @@ -412,6 +412,8 @@ public class SysUserController extends CoreBaseController{ ValidatorBean.checkNotNull(password,"新密码不能为空"); ValidatorBean.checkNotNull(email,"邮件不能为空"); + personnelService.checkSysUserPassword(password); + String redisKey = CommonConstWords.SESSION_VERIFICATION_USER_EMAIL + "_" + getSessionUser().getUserId(); Object redisValue = redisCore.getObject(redisKey); if(redisValue != null){ From 0aacaa49721881a5cb4fd73fc33563a0a2cc02f5 Mon Sep 17 00:00:00 2001 From: "yunhao.wang" Date: Sat, 12 Jan 2019 19:45:02 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E8=A7=A3=E5=86=B3bug=20=E9=80=9A=E7=94=A8?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=AF=BC=E5=87=BA=20=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=20=E7=B3=BB=E7=BB=9F=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=20=E6=93=8D=E4=BD=9C=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=20=E5=BC=82=E5=B8=B8=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/iservice/busi/ISysDictionaryService.java | 9 + .../core/api/iservice/busi/ISysFileService.java | 7 + .../controller/busi/SysDictionaryController.java | 20 +-- .../controller/busi/SysFileController.java | 63 ++----- .../controller/busi/SysLogExceptionController.java | 106 ++++++++++- .../controller/busi/SysLogOperateController.java | 100 +++++++++++ .../controller/busi/SysLogSystemController.java | 96 +++++----- .../controller/busi/SysOrderNoRuleController.java | 83 ++++++--- .../controller/busi/SysUserInfoController.java | 95 +++++----- .../apiservice/mq/MessageLetterQueueReceiver.java | 3 +- .../serviceimpl/busi/SysDictionaryService.java | 13 +- .../serviceimpl/busi/SysFileServiceImpl.java | 51 +++++- .../i3plus/core/apiservice/util/ExcelUtil.java | 195 +++++++++++++-------- .../i3plus/core/apiservice/util/FileUtil.java | 106 +++++++++++ .../estsh/i3plus/core/apiservice/util/ZipUtil.java | 181 +++++++++++++++++++ .../apiservice/websocket/MessageWebSocket.java | 6 +- 16 files changed, 887 insertions(+), 247 deletions(-) create mode 100644 modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/FileUtil.java create mode 100644 modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/ZipUtil.java diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysDictionaryService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysDictionaryService.java index 4062cb7..85ce4c6 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysDictionaryService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysDictionaryService.java @@ -103,4 +103,13 @@ public interface ISysDictionaryService { */ @ApiOperation(value = "设置默认字典项",notes = "根据id设置默认字典项") void updateSysDictionaryDefaultById(Long id); + + /** + * 根据父节点 以及当前节点值 获取字典信息 + * @param parentCode 父级代码 + * @param value 字典值 + * @return + */ + @ApiOperation(value = "根据父节点 以及当前节点值 获取字典信息") + SysDictionary getSysDictionaryByParentCodeAndValue(String parentCode,String value); } diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysFileService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysFileService.java index e0303a3..92ab4ca 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysFileService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysFileService.java @@ -67,4 +67,11 @@ public interface ISysFileService { */ @ApiOperation(value = "删除资源信息",notes = "根据ID批量删除资源信息") void deleteSysFileByIds(Long[] ids); + + /** + * 上传文件资源 + * @param file + */ + @ApiOperation(value = "上传文件资源",notes = "上传文件资源") + SysFile uploadFile(Object file) throws Exception; } 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 ccd2042..a0f5a23 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 @@ -3,8 +3,8 @@ package cn.estsh.i3plus.core.apiservice.controller.busi; import cn.estsh.i3plus.core.api.iservice.busi.ISysDictionaryService; import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.platform.common.tool.StringTool; -import cn.estsh.i3plus.platform.common.util.CommonConstWords; 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; @@ -168,15 +168,15 @@ public class SysDictionaryController extends CoreBaseController{ public ResultBean findSysDictionaryUserInfo() { try { Map resultMap = new HashMap<>(); - resultMap.put("1",sysDictionaryService.findSysDictionaryByParentCode(CommonConstWords.DICTIONARY_SEX)); - resultMap.put("2",sysDictionaryService.findSysDictionaryByParentCode(CommonConstWords.DICTIONARY_FILE_TYPE)); - resultMap.put("3",sysDictionaryService.findSysDictionaryByParentCode(CommonConstWords.DICTIONARY_MARRIAGE)); - resultMap.put("4",sysDictionaryService.findSysDictionaryByParentCode(CommonConstWords.DICTIONARY_EDUCATION)); - resultMap.put("5",sysDictionaryService.findSysDictionaryByParentCode(CommonConstWords.DICTIONARY_NATIONALITY)); - resultMap.put("6",sysDictionaryService.findSysDictionaryByParentCode(CommonConstWords.DICTIONARY_CERTIFICATE_TYPE)); - resultMap.put("7",sysDictionaryService.findSysDictionaryByParentCode(CommonConstWords.DICTIONARY_GRADE)); - resultMap.put("8",sysDictionaryService.findSysDictionaryByParentCode(CommonConstWords.DICTIONARY_POLITICAL_STATUS)); - resultMap.put("9",sysDictionaryService.findSysDictionaryByParentCode(CommonConstWords.DICTIONARY_EMPLOYEE_TYPE)); + resultMap.put("1",sysDictionaryService.findSysDictionaryByParentCode(BaseConstWords.DICTIONARY_SEX)); + resultMap.put("2",sysDictionaryService.findSysDictionaryByParentCode(BaseConstWords.DICTIONARY_FILE_TYPE)); + resultMap.put("3",sysDictionaryService.findSysDictionaryByParentCode(BaseConstWords.DICTIONARY_MARRIAGE)); + resultMap.put("4",sysDictionaryService.findSysDictionaryByParentCode(BaseConstWords.DICTIONARY_EDUCATION)); + resultMap.put("5",sysDictionaryService.findSysDictionaryByParentCode(BaseConstWords.DICTIONARY_NATIONALITY)); + resultMap.put("6",sysDictionaryService.findSysDictionaryByParentCode(BaseConstWords.DICTIONARY_CERTIFICATE_TYPE)); + resultMap.put("7",sysDictionaryService.findSysDictionaryByParentCode(BaseConstWords.DICTIONARY_EMPLOYEE_GRADE)); + resultMap.put("8",sysDictionaryService.findSysDictionaryByParentCode(BaseConstWords.DICTIONARY_POLITICAL_STATUS)); + resultMap.put("9",sysDictionaryService.findSysDictionaryByParentCode(BaseConstWords.DICTIONARY_EMPLOYEE_TYPE)); return ResultBean.success("查询成功").setResultMap(resultMap).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); } catch (ImppBusiException busExcep) { diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysFileController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysFileController.java index bcaa485..b01698b 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysFileController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysFileController.java @@ -3,22 +3,17 @@ package cn.estsh.i3plus.core.apiservice.controller.busi; import cn.estsh.i3plus.core.api.iservice.busi.ISysDictionaryService; import cn.estsh.i3plus.core.api.iservice.busi.ISysFileService; import cn.estsh.i3plus.platform.common.tool.StringTool; -import cn.estsh.i3plus.platform.common.util.CommonConstWords; import cn.estsh.i3plus.platform.common.util.PlatformConstWords; 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.SessionUser; -import cn.estsh.i3plus.pojo.platform.bean.SysDictionary; import cn.estsh.i3plus.pojo.platform.bean.SysFile; 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.fastdfs.FastDFSClient; -import cn.estsh.impp.framework.boot.fastdfs.FastDFSFile; import cn.estsh.impp.framework.boot.util.ResultBean; import cn.estsh.impp.framework.boot.util.ValidatorBean; import io.swagger.annotations.Api; @@ -26,20 +21,14 @@ import io.swagger.annotations.ApiOperation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.InputStreamResource; -import org.springframework.core.io.Resource; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.util.FileCopyUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.servlet.mvc.support.RedirectAttributes; -import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.*; -import java.net.URLConnection; +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.util.List; /** @@ -161,7 +150,7 @@ public class SysFileController extends CoreBaseController{ @PostMapping("/upload") @ApiOperation(value = "文件上传",notes = "文件上传") - public ResultBean singleFileUpload(@RequestParam("file") MultipartFile file, RedirectAttributes redirectAttributes) { + public ResultBean singleFileUpload(@RequestParam("file") MultipartFile file) { try { if(file.isEmpty()){ throw ImppExceptionBuilder.newInstance() @@ -181,25 +170,7 @@ public class SysFileController extends CoreBaseController{ .build(); } - - FastDFSFile dfsFile = dfsClient.saveFile(file); - String filePath = dfsClient.getHostUi() + "/" + dfsFile.getDfsGroupName() + "/" + dfsFile.getDfsFileName(); - SysDictionary dictionary = dictionaryService.getSysDictionaryByParentCodeAndCode( - CommonConstWords.DICTIONARY_FILE_TYPE, - StringTool.getStringFileSuffix(file.getOriginalFilename(),false)); - - SysFile sysFile = new SysFile(); - sysFile.setDfsGroupName(dfsFile.getDfsGroupName()); - sysFile.setDfsFileName(dfsFile.getDfsFileName()); - sysFile.setFileSize(dfsFile.getContent().length); - sysFile.setFilePath(filePath); - sysFile.setFileOriginalName(file.getOriginalFilename()); - sysFile.setFileTypeId(dictionary.getId()); - sysFile.setFileTypeName(dictionary.getName()); - sysFile.setUserId(getSessionUser().getUserId()); - sysFile.setDownloadNum(0); - - SysFile fileDb = sysFileService.insertSysFile(sysFile); + SysFile fileDb = sysFileService.uploadFile(file); return ResultBean.success("上传成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultObject(fileDb); }catch(ImppBusiException busExcep){ @@ -239,17 +210,17 @@ public class SysFileController extends CoreBaseController{ response.addHeader("Content-type", "application/octet-stream");// 设置文件名 BufferedInputStream bis = null; - try { - bis = new BufferedInputStream(fis); - OutputStream os = response.getOutputStream(); - byte[] buffer = new byte[1024]; - int i = bis.read(buffer); - while (i != -1) { - os.write(buffer, 0, i); - i = bis.read(buffer); - } - } catch (Exception e) { - e.printStackTrace(); + try { + bis = new BufferedInputStream(fis); + OutputStream os = response.getOutputStream(); + byte[] buffer = new byte[1024]; + int i = bis.read(buffer); + while (i != -1) { + os.write(buffer, 0, i); + i = bis.read(buffer); + } + } catch (Exception e) { + e.printStackTrace(); } finally { if (bis != null) { try { 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 173ea70..aac7848 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,13 +1,23 @@ 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.platform.common.util.PlatformConstWords; 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.platbean.SysLogException; +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.util.ResultBean; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -18,6 +28,11 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.io.File; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + /** * @Description : 系统异常日志服务 * @Reference : @@ -28,15 +43,24 @@ import org.springframework.web.bind.annotation.RestController; @RestController @Api(description = "系统异常日志服务") @RequestMapping(PlatformConstWords.BASE_URL + "/sys-log-exception") -public class SysLogExceptionController { +public class SysLogExceptionController extends CoreBaseController { public static final Logger LOGGER = LoggerFactory.getLogger(SysLogExceptionController.class); @Autowired private ISysLogExceptionService sysLogExceptionService; + @Autowired + private ISysDictionaryService sysDictionaryService; + + @Autowired + private ISysConfigService sysConfigService; + + @Autowired + private ISysFileService sysFileService; + @GetMapping(value = "/query") @ApiOperation(value = "异常日志复杂查询,分页,排序",notes = "异常日志复杂查询,分页,排序") - public ResultBean querySysLogOperateByPager(SysLogException sysLogException, Pager pager){ + public ResultBean querySysLogExceptionByPager(SysLogException sysLogException, Pager pager){ try { ListPager logExceptionList = sysLogExceptionService.querySysLogExceptionByPager(sysLogException, pager); return ResultBean.success("查询成功").setListPager(logExceptionList).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); @@ -46,4 +70,82 @@ public class SysLogExceptionController { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } + + @GetMapping("/get-col") + @ApiOperation(value = "获取系统操作日志字段") + public ResultBean getSysLogExceptionCol(){ + try { + return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultMap(ExcelUtil.getColName(SysLogException.class)); + }catch(ImppBusiException busExcep){ + return ResultBean.fail(busExcep); + }catch(Exception e){ + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + + @GetMapping(value = "/export") + @ApiOperation(value = "导出系统异常日志") + public ResultBean exportSysLogException(SysLogException sysLogException, String[] colName, int pageSize,boolean isZip) { + ListPager listPager; + List result = new ArrayList(); + File zipFile = null; + File excelDir = null; + File excelFile; + try { + Pager pager = new Pager(); + pager.setCurrentPage(1); + // 判断是否超过excel最大导出数量设定值 + int maxPageSize = Integer.parseInt(sysConfigService.getSysConfigByCode(PlatformConstWords.EXCEL_EXPORT_MAX_ROW).getConfigValue()); + if (pageSize == 0 || pageSize >= maxPageSize) { + pager.setPageSize(maxPageSize); + } else { + pager.setPageSize(pageSize); + } + + // 数据校验 + if(colName==null || colName.length == 0){ + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.IMPP.getCode()) + .setErrorCode(ImppExceptionEnum.BUSINESS_EXCEPTION_DATA_ERROR.getCode()) + .setErrorDetail("导出列不能为空") + .build(); + } + + excelDir = new File(System.getProperty("java.io.tmpdir") + File.separator + new Date().getTime()); + excelDir.mkdir(); + do { + listPager = sysLogExceptionService.querySysLogExceptionByPager(sysLogException, pager); + pager = listPager.getObjectPager(); + + // 将excel导出至临时文件夹并上传 + excelFile = new File(excelDir + File.separator + SysLogException.class.getSimpleName() + pager.getCurrentPage() + ".xls"); + excelFile.createNewFile(); + + ExcelUtil.exportData(excelFile, listPager.getObjectList(), SysLogException.class, colName); + result.add(sysFileService.uploadFile(excelFile)); + + pager.setCurrentPage(pager.getCurrentPage() + 1); + } while (pager.getCurrentPage() <= pager.getTotalPages()); + + // 将所有excel文件打包 + if(isZip){ + zipFile = ZipUtil.zipFile(null, excelDir); + result.add(sysFileService.uploadFile(zipFile)); + ExcelUtil.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); + } + } catch (ImppBusiException busExcep) { + return ResultBean.fail(busExcep); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } finally { + // 清理临时文件文件 + if (zipFile != null) { + FileUtil.deletefile(zipFile.getPath()); + } + FileUtil.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 d3b6ad5..28c8ace 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,14 +1,23 @@ 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.platform.common.util.PlatformConstWords; 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.platbean.SysLogOperate; 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.util.ResultBean; import cn.estsh.impp.framework.boot.util.ValidatorBean; import io.swagger.annotations.Api; @@ -19,6 +28,9 @@ 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; import java.util.List; /** @@ -37,6 +49,15 @@ public class SysLogOperateController extends CoreBaseController { @Autowired private ISysLogOperateService logOperateService; + @Autowired + private ISysDictionaryService sysDictionaryService; + + @Autowired + private ISysConfigService sysConfigService; + + @Autowired + private ISysFileService sysFileService; + @PostMapping(value = "/insert") @ApiOperation(value = "添加操作日志",notes = "添加操作日志") public ResultBean insertSysLogOperateController(SysLogOperate logOperate){ @@ -111,4 +132,83 @@ public class SysLogOperateController extends CoreBaseController { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } + + @GetMapping("/get-col") + @ApiOperation(value = "获取系统操作日志字段") + public ResultBean getSysLogOperateCol(){ + try { + return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultMap(ExcelUtil.getColName(SysLogOperate.class)); + }catch(ImppBusiException busExcep){ + return ResultBean.fail(busExcep); + }catch(Exception e){ + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + + @GetMapping(value = "/export") + @ApiOperation(value = "导出操作日志") + public ResultBean exportSysLogOperate(SysLogOperate sysLogOperate, String[] colName, int pageSize, boolean isZip) { + ListPager listPager; + List result = new ArrayList(); + File zipFile = null; + File excelDir = null; + File excelFile; + try { + Pager pager = new Pager(); + pager.setCurrentPage(1); + // 判断是否超过excel最大导出数量设定值 + int maxPageSize = Integer.parseInt(sysConfigService.getSysConfigByCode(PlatformConstWords.EXCEL_EXPORT_MAX_ROW).getConfigValue()); + if (pageSize == 0 || pageSize >= maxPageSize) { + pager.setPageSize(maxPageSize); + } else { + pager.setPageSize(pageSize); + } + + // 数据校验 + if(colName==null || colName.length == 0){ + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.IMPP.getCode()) + .setErrorCode(ImppExceptionEnum.BUSINESS_EXCEPTION_DATA_ERROR.getCode()) + .setErrorDetail("导出列不能为空") + .build(); + } + + excelDir = new File(System.getProperty("java.io.tmpdir") + File.separator + new Date().getTime()); + excelDir.mkdir(); + do { + listPager = logOperateService.querySysLogOperateByPager(sysLogOperate, pager); + pager = listPager.getObjectPager(); + + // 将excel导出至临时文件夹并上传 + excelFile = new File(excelDir + File.separator + SysLogOperate.class.getSimpleName() + pager.getCurrentPage() + ".xls"); + excelFile.createNewFile(); + + ExcelUtil.exportData(excelFile, listPager.getObjectList(), SysLogOperate.class, colName); + result.add(sysFileService.uploadFile(excelFile)); + + pager.setCurrentPage(pager.getCurrentPage() + 1); + } while (pager.getCurrentPage() <= pager.getTotalPages()); + + // 将所有excel文件打包 + if(isZip){ + zipFile = ZipUtil.zipFile(null, excelDir); + result.add(sysFileService.uploadFile(zipFile)); + ExcelUtil.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); + } + } catch (ImppBusiException busExcep) { + return ResultBean.fail(busExcep); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } finally { + // 清理临时文件文件 + // 清理临时文件文件 + if (zipFile != null) { + FileUtil.deletefile(zipFile.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 533c771..047e84a 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 @@ -5,21 +5,19 @@ 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.ISysLogSystemService; import cn.estsh.i3plus.core.apiservice.util.ExcelUtil; -import cn.estsh.i3plus.platform.common.util.CommonConstWords; +import cn.estsh.i3plus.core.apiservice.util.FileUtil; +import cn.estsh.i3plus.core.apiservice.util.ZipUtil; 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.i3plus.pojo.platform.platbean.SysLogSystem; 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; import cn.estsh.impp.framework.boot.util.ValidatorBean; import io.swagger.annotations.Api; @@ -29,7 +27,9 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.io.File; import java.util.ArrayList; +import java.util.Date; import java.util.List; /** @@ -49,17 +49,11 @@ public class SysLogSystemController extends CoreBaseController{ private ISysLogSystemService logSystemService; @Autowired - private ISysDictionaryService sysDictionaryService; - - @Autowired private ISysConfigService sysConfigService; @Autowired private ISysFileService sysFileService; - @Autowired - private FastDFSClient dfsClient; - @PostMapping(value = "/insert") @ApiOperation(value="新增系统日志",notes = "新增系统日志") public ResultBean insertSysLogSystem(SysLogSystem logSystem) { @@ -147,48 +141,68 @@ public class SysLogSystemController extends CoreBaseController{ } @GetMapping(value = "/export") - @ApiOperation(value = "导出系统日志") - public ResultBean exportSysLogSystem(SysLogSystem sysLogSystem, String[] colName){ + @ApiOperation(value = "导出系统异常日志") + public ResultBean exportSysLogSystem(SysLogSystem sysLogSystem, String[] colName, int pageSize, boolean isZip) { + ListPager listPager; + List result = new ArrayList(); + File zipFile = null; + File excelDir = null; + File excelFile; try { Pager pager = new Pager(); pager.setCurrentPage(1); - pager.setPageSize(Integer.parseInt(sysConfigService.getSysConfigByCode(PlatformConstWords.EXCEL_EXPORT_MAX_ROW).getConfigValue())); - ListPager listPager; - String[] fileAbsolutePath; - List result = new ArrayList(); + // 判断是否超过excel最大导出数量设定值 + int maxPageSize = Integer.parseInt(sysConfigService.getSysConfigByCode(PlatformConstWords.EXCEL_EXPORT_MAX_ROW).getConfigValue()); + if (pageSize == 0 || pageSize >= maxPageSize) { + pager.setPageSize(maxPageSize); + } else { + pager.setPageSize(pageSize); + } + + // 数据校验 + if(colName==null || colName.length == 0){ + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.IMPP.getCode()) + .setErrorCode(ImppExceptionEnum.BUSINESS_EXCEPTION_DATA_ERROR.getCode()) + .setErrorDetail("导出列不能为空") + .build(); + } + + excelDir = new File(System.getProperty("java.io.tmpdir") + File.separator + new Date().getTime()); + excelDir.mkdir(); do { listPager = logSystemService.querySysLogSystemByPager(sysLogSystem, pager); pager = listPager.getObjectPager(); - // 上传至文件服务器 - FastDFSFile fastDFSFile = new FastDFSFile(SysOrderNoRule.class.getSimpleName() + pager.getCurrentPage() + ".xls", - ExcelUtil.exportData(listPager.getObjectList(),SysOrderNoRule.class,colName),"xls"); - - fileAbsolutePath = dfsClient.upload(fastDFSFile); + // 将excel导出至临时文件夹并上传 + excelFile = new File(excelDir + File.separator + SysLogSystem.class.getSimpleName() + pager.getCurrentPage() + ".xls"); + excelFile.createNewFile(); - // 保证系统文件表中 - 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.setFileSize(fastDFSFile.getContent().length); - sysFile.setFilePath(filePath); - sysFile.setFileOriginalName(fastDFSFile.getName()); - sysFile.setFileTypeId(dictionary.getId()); - sysFile.setFileTypeName(dictionary.getName()); - sysFile.setDownloadNum(0); - result.add(sysFileService.insertSysFile(sysFile)); + ExcelUtil.exportData(excelFile, listPager.getObjectList(), SysLogSystem.class, colName); + result.add(sysFileService.uploadFile(excelFile)); pager.setCurrentPage(pager.getCurrentPage() + 1); } while (pager.getCurrentPage() <= pager.getTotalPages()); - return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultList(result); - }catch(ImppBusiException busExcep){ + + // 将所有excel文件打包 + if(isZip){ + zipFile = ZipUtil.zipFile(null, excelDir); + result.add(sysFileService.uploadFile(zipFile)); + ExcelUtil.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); + } + } catch (ImppBusiException busExcep) { return ResultBean.fail(busExcep); - }catch(Exception e){ + } catch (Exception e) { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } finally { + // 清理临时文件文件 + if (zipFile != null) { + FileUtil.deletefile(zipFile.getPath()); + } + FileUtil.deletefile(excelDir.getPath()); } } } 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 0f3b102..dee27de 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 @@ -5,6 +5,8 @@ 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.platform.common.tool.StringTool; import cn.estsh.i3plus.platform.common.util.CommonConstWords; import cn.estsh.i3plus.platform.common.util.PlatformConstWords; @@ -17,6 +19,8 @@ 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.i3plus.pojo.platform.bean.SysUserInfo; +import cn.estsh.i3plus.pojo.platform.platbean.SysLogOperate; import cn.estsh.impp.framework.base.controller.CoreBaseController; import cn.estsh.impp.framework.boot.exception.ImppBusiException; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; @@ -37,6 +41,7 @@ import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.OutputStream; import java.util.ArrayList; +import java.util.Date; import java.util.List; /** @@ -215,48 +220,68 @@ public class SysOrderNoRuleController extends CoreBaseController { } @GetMapping(value = "/export") - @ApiOperation(value = "导出单号规则") - public ResultBean exportSysOrderNoRule(SysOrderNoRule sysOrderNoRule, String[] colName){ + @ApiOperation(value = "导出操作日志") + public ResultBean exportSysOrderNoRule(SysOrderNoRule sysOrderNoRule, String[] colName, int pageSize, boolean isZip) { + ListPager listPager; + List result = new ArrayList(); + File zipFile = null; + File excelDir = null; + File excelFile; try { Pager pager = new Pager(); pager.setCurrentPage(1); - pager.setPageSize(Integer.parseInt(sysConfigService.getSysConfigByCode(PlatformConstWords.EXCEL_EXPORT_MAX_ROW).getConfigValue())); - ListPager listPager; - String[] fileAbsolutePath; - List result = new ArrayList(); + // 判断是否超过excel最大导出数量设定值 + int maxPageSize = Integer.parseInt(sysConfigService.getSysConfigByCode(PlatformConstWords.EXCEL_EXPORT_MAX_ROW).getConfigValue()); + if (pageSize == 0 || pageSize >= maxPageSize) { + pager.setPageSize(maxPageSize); + } else { + pager.setPageSize(pageSize); + } + + // 数据校验 + if(colName==null || colName.length == 0){ + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.IMPP.getCode()) + .setErrorCode(ImppExceptionEnum.BUSINESS_EXCEPTION_DATA_ERROR.getCode()) + .setErrorDetail("导出列不能为空") + .build(); + } + + excelDir = new File(System.getProperty("java.io.tmpdir") + File.separator + new Date().getTime()); + excelDir.mkdir(); do { listPager = sysOrderNoRuleService.querySysOrderNoRuleByPager(sysOrderNoRule, pager); pager = listPager.getObjectPager(); - // 上传至文件服务器 - FastDFSFile fastDFSFile = new FastDFSFile(SysOrderNoRule.class.getSimpleName() + pager.getCurrentPage() + ".xls", - ExcelUtil.exportData(listPager.getObjectList(),SysOrderNoRule.class,colName),"xls"); - - fileAbsolutePath = dfsClient.upload(fastDFSFile); + // 将excel导出至临时文件夹并上传 + excelFile = new File(excelDir + File.separator + SysOrderNoRule.class.getSimpleName() + pager.getCurrentPage() + ".xls"); + excelFile.createNewFile(); - // 保证系统文件表中 - 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.setFileSize(fastDFSFile.getContent().length); - sysFile.setFilePath(filePath); - sysFile.setFileOriginalName(fastDFSFile.getName()); - sysFile.setFileTypeId(dictionary.getId()); - sysFile.setFileTypeName(dictionary.getName()); - sysFile.setDownloadNum(0); - result.add(sysFileService.insertSysFile(sysFile)); + ExcelUtil.exportData(excelFile, listPager.getObjectList(), SysOrderNoRule.class, colName); + result.add(sysFileService.uploadFile(excelFile)); pager.setCurrentPage(pager.getCurrentPage() + 1); } while (pager.getCurrentPage() <= pager.getTotalPages()); - return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultList(result); - }catch(ImppBusiException busExcep){ + + // 将所有excel文件打包 + if(isZip){ + zipFile = ZipUtil.zipFile(null, excelDir); + result.add(sysFileService.uploadFile(zipFile)); + ExcelUtil.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); + } + } catch (ImppBusiException busExcep) { return ResultBean.fail(busExcep); - }catch(Exception e){ + } catch (Exception e) { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } finally { + // 清理临时文件文件 + if (zipFile != null) { + FileUtil.deletefile(zipFile.getPath()); + } + FileUtil.deletefile(excelDir.getPath()); } } 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 fdc5579..d49a53e 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 @@ -2,10 +2,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.tool.StringTool; 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; @@ -18,7 +19,6 @@ 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; import cn.estsh.impp.framework.boot.util.ValidatorBean; import io.swagger.annotations.Api; @@ -28,8 +28,9 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.io.File; import java.util.ArrayList; -import java.util.Arrays; +import java.util.Date; import java.util.List; /** @@ -56,17 +57,11 @@ public class SysUserInfoController extends CoreBaseController{ private ISysPositionService sysPositionService; @Autowired - private ISysDictionaryService sysDictionaryService; - - @Autowired private ISysConfigService sysConfigService; @Autowired private ISysFileService sysFileService; - @Autowired - private FastDFSClient dfsClient; - @PostMapping(value="/insert") @ApiOperation(value="添加用户信息",notes="返回内容添加用户信息") public ResultBean insertSysUserInfo(SysUserInfo userInfo){ @@ -312,58 +307,78 @@ public class SysUserInfoController extends CoreBaseController{ } } - @GetMapping(value = "/export") @ApiOperation(value = "导出用户信息") - public ResultBean exportSysOrderNoRule(SysUserInfo sysUserInfo, String[] colName){ + public ResultBean exportSysUserInfo(SysUserInfo sysUserInfo, String[] colName, int pageSize,boolean isZip) { + ListPager listPager; + List result = new ArrayList(); + File zipFile = null; + File excelDir = null; + File excelFile; + try { Pager pager = new Pager(); pager.setCurrentPage(1); - pager.setPageSize(Integer.parseInt(sysConfigService.getSysConfigByCode(PlatformConstWords.EXCEL_EXPORT_MAX_ROW).getConfigValue())); - ListPager listPager; - String[] fileAbsolutePath; - List result = new ArrayList(); + // 判断是否超过excel最大导出数量设定值 + int maxPageSize = Integer.parseInt(sysConfigService.getSysConfigByCode(PlatformConstWords.EXCEL_EXPORT_MAX_ROW).getConfigValue()); + if (pageSize == 0 || pageSize >= maxPageSize) { + pager.setPageSize(maxPageSize); + } else { + pager.setPageSize(pageSize); + } + + // 数据校验 + if(colName==null || colName.length == 0){ + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.IMPP.getCode()) + .setErrorCode(ImppExceptionEnum.BUSINESS_EXCEPTION_DATA_ERROR.getCode()) + .setErrorDetail("导出列不能为空") + .build(); + } + + excelDir = new File(System.getProperty("java.io.tmpdir") + File.separator + new Date().getTime()); + excelDir.mkdir(); do { listPager = sysUserInfoService.querySysUserInfo(sysUserInfo, pager); pager = listPager.getObjectPager(); - // 上传至文件服务器 - FastDFSFile fastDFSFile = new FastDFSFile(SysOrderNoRule.class.getSimpleName() + pager.getCurrentPage() + ".xls", - ExcelUtil.exportData(listPager.getObjectList(),SysOrderNoRule.class,colName),"xls"); - - fileAbsolutePath = dfsClient.upload(fastDFSFile); - - // 保证系统文件表中 - String filePath = dfsClient.getHostUi() + "/" + fileAbsolutePath[0] + "/" + fileAbsolutePath[1]; - SysDictionary dictionary = sysDictionaryService.getSysDictionaryByParentCodeAndCode( - BaseConstWords.DICTIONARY_FILE_TYPE,fastDFSFile.getExt()); + // 将excel导出至临时文件夹并上传 + excelFile = new File(excelDir + File.separator + SysUserInfo.class.getSimpleName() + pager.getCurrentPage() + ".xls"); + excelFile.createNewFile(); - SysFile sysFile = new SysFile(); - sysFile.setDfsGroupName(fileAbsolutePath[0]); - sysFile.setDfsFileName(fileAbsolutePath[1]); - sysFile.setFileSize(fastDFSFile.getContent().length); - sysFile.setFilePath(filePath); - sysFile.setFileOriginalName(fastDFSFile.getName()); - sysFile.setFileTypeId(dictionary.getId()); - sysFile.setFileTypeName(dictionary.getName()); - sysFile.setDownloadNum(0); - result.add(sysFileService.insertSysFile(sysFile)); + ExcelUtil.exportData(excelFile, listPager.getObjectList(), SysUserInfo.class, colName); + result.add(sysFileService.uploadFile(excelFile)); pager.setCurrentPage(pager.getCurrentPage() + 1); } while (pager.getCurrentPage() <= pager.getTotalPages()); - return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultList(result); - }catch(ImppBusiException busExcep){ + + // 将所有excel文件打包 + if(isZip){ + zipFile = ZipUtil.zipFile(null, excelDir); + result.add(sysFileService.uploadFile(zipFile)); + ExcelUtil.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); + } + } catch (ImppBusiException busExcep) { return ResultBean.fail(busExcep); - }catch(Exception e){ + } catch (Exception e) { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } finally { + // 清理临时文件文件 + if (zipFile != null) { + FileUtil.deletefile(zipFile.getPath()); + } + FileUtil.deletefile(excelDir.getPath()); } } @GetMapping("/get-col") @ApiOperation(value = "获取用户可导出字段") - public ResultBean getSysOrderNoRuleColName(){ + public ResultBean getSysUserInfoColName(){ try { - return ResultBean.success("查询成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultMap(ExcelUtil.getColName(SysOrderNoRule.class)); + return ResultBean.success("查询成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultMap(ExcelUtil.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/mq/MessageLetterQueueReceiver.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MessageLetterQueueReceiver.java index b37a399..147bd22 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MessageLetterQueueReceiver.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MessageLetterQueueReceiver.java @@ -73,10 +73,11 @@ public class MessageLetterQueueReceiver { refUserMessage.setReceiverNameRdd(sysUser.getUserName()); refUserMessage.setMessageStatus(ImppEnumUtil.MESSAGE_STATUS.UNREAD.getValue()); refUserMessage.setReceiverTime(TimeTool.getNowTime(true)); + refUserMessage.setIsUrgent(msg.getIsUrgent()); sysMessageService.insertSysRefUserMessage(refUserMessage); - userMessage = sysMessageService.findSysRefUserMessageByUserIdAndStatus(sysUser.getUserInfoId(), + userMessage = sysMessageService.findSysRefUserMessageByUserIdAndStatus(sysUser.getId(), ImppEnumUtil.MESSAGE_STATUS.UNREAD.getValue()); MessageWebSocket.sendMessage(sysUser.getUserInfoId(), JSON.toJSONString(userMessage) diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysDictionaryService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysDictionaryService.java index 6d6d0ea..ad4ea82 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysDictionaryService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysDictionaryService.java @@ -171,12 +171,8 @@ public class SysDictionaryService implements ISysDictionaryService { @Override @ApiOperation(value = "根据父节点 以及当前节点CODE 获取字典信息") public SysDictionary getSysDictionaryByParentCodeAndCode(String parentCode, String code) { - List list = sysDictionaryRDao.findByProperty(new String[]{"parentCodeRdd","dictionaryCode"}, + return sysDictionaryRDao.getByProperty(new String[]{"parentCodeRdd","dictionaryCode"}, new Object[]{parentCode,code}); - if(list != null && list.size() > 0){ - return list.get(0); - } - return null; } @Override @@ -189,4 +185,11 @@ public class SysDictionaryService implements ISysDictionaryService { sysDictionaryRDao.updateByProperties("id",id, "isDefault",CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); } + + @Override + @ApiOperation(value = "根据父节点 以及当前节点值 获取字典信息") + public SysDictionary getSysDictionaryByParentCodeAndValue(String parentCode, String value) { + return sysDictionaryRDao.getByProperty(new String[]{"parentCodeRdd","dictionaryValue"}, + new Object[]{parentCode,value}); + } } 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 dc8a70d..a13da7d 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,18 +1,28 @@ 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.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.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; import cn.estsh.i3plus.pojo.platform.sqlpack.CoreHqlPack; +import cn.estsh.impp.framework.boot.fastdfs.FastDFSClient; +import cn.estsh.impp.framework.boot.fastdfs.FastDFSFile; import io.swagger.annotations.ApiOperation; import org.slf4j.Logger; 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; /** @@ -27,7 +37,13 @@ public class SysFileServiceImpl implements ISysFileService { public static final Logger LOGGER = LoggerFactory.getLogger(SysFileServiceImpl.class); @Autowired - public SysFileRepository sysFileRDao; + private SysFileRepository sysFileRDao; + + @Autowired + private SysDictionaryRepository sysDictionaryRDao; + + @Autowired + private FastDFSClient dfsClient; @Override @ApiOperation(value = "新增资源信息") @@ -83,4 +99,37 @@ public class SysFileServiceImpl implements ISysFileService { LOGGER.info("文件资源 SYS_FILE ids:{}", ids.toString()); sysFileRDao.deleteByIds(ids); } + + @Override + @ApiOperation(value = "上传文件资源",notes = "上传文件资源") + public SysFile uploadFile(Object file) throws Exception{ + FastDFSFile fastDFSFile; + // 判断参数类型 + if(file instanceof File){ + fastDFSFile = new FastDFSFile(((File)file).getName(), FileUtil.file2Byte(((File)file).getPath()), + StringTool.getStringFileSuffix(((File)file).getName(),true)); + }else{ + fastDFSFile = dfsClient.saveFile((MultipartFile) file); + } + + String[] fileAbsolutePath = dfsClient.upload(fastDFSFile); + + // 保存到系统文件表中 + String filePath = dfsClient.getHostUi() + "/" + fileAbsolutePath[0] + "/" + fileAbsolutePath[1]; + SysDictionary 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.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)); + + 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 index a1bd351..fcb58fc 100644 --- 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 @@ -1,12 +1,17 @@ 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.i3plus.pojo.platform.bean.SysTool; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; import cn.estsh.impp.framework.boot.exception.ImppExceptionEnum; @@ -22,15 +27,18 @@ import org.apache.poi.ss.usermodel.Workbook; 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.*; +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.InvocationTargetException; import java.lang.reflect.Method; -import java.sql.Ref; import java.util.*; /** @@ -44,9 +52,6 @@ import java.util.*; public class ExcelUtil { public static final Logger LOGGER = LoggerFactory.getLogger(ExcelUtil.class); - private ExcelUtil() throws IOException { - } - private static ISysConfigService sysConfigService; @Autowired @@ -61,6 +66,20 @@ public class ExcelUtil { 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; + } + /** * 导出 @@ -69,15 +88,11 @@ public class ExcelUtil { * @param exportClass 导出数据类型 * @param exportCol 需要导出的列 */ - public static byte[] exportData(List data, Class exportClass, String[] exportCol) { - File excelFile = null; + public static File exportData(File excelFile,List data, Class exportClass, String[] exportCol) { FileOutputStream fos = null; //创建HSSFWorkbook对象(excel的文档对象) HSSFWorkbook workbook = new HSSFWorkbook(); try { - //创建临时文件 - excelFile = File.createTempFile(exportClass.getSimpleName() + new Date().getTime(), ".xls"); - LOGGER.info("临时文件所在的本地路径:" + excelFile.getCanonicalPath()); fos = new FileOutputStream(excelFile); //建立新的sheet对象(excel的表单) @@ -88,22 +103,27 @@ public class ExcelUtil { // 类数据 Field[] fields = new Field[exportCol.length]; - + Field[] allFields = ReflexTool.getAllField(exportClass.getName()); String colName; // 获取字段中文名 优先使用 OutputColumn.name for (int i = 0; i < exportCol.length; i++) { - fields[i] = exportClass.getDeclaredField(exportCol[i]); - colName = null; + for (int j = 0 ; j < allFields.length ; j++){ + if(exportCol[i].equals(allFields[j].getName())){ + fields[i] = allFields[j]; - if (fields[i].isAnnotationPresent(AnnoOutputColumn.class)) { - colName = fields[i].getAnnotation(AnnoOutputColumn.class).name(); - } + 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(); + if (fields[i].isAnnotationPresent(ApiParam.class) && StringUtils.isBlank(colName)) { + colName = fields[i].getAnnotation(ApiParam.class).value(); + } + tableHeader.createCell(i, CellType.STRING).setCellValue(colName); + } } - tableHeader.createCell(i, CellType.STRING).setCellValue(colName); } //加载数据至excel对象 @@ -115,7 +135,8 @@ public class ExcelUtil { for (int i = 0; i < data.size(); i++) { hssfRow = sheet.createRow(i + 1); for (int j = 0; j < fields.length; j++) { - CellValue = exportClass.getDeclaredMethod("get" + StringTool.toUpperCaseFirstOne(fields[j].getName())).invoke(data.get(i)); + fields[j].setAccessible(true); + CellValue = fields[j].get(data.get(i)); // 判断是否存在引用关系 if (fields[j].isAnnotationPresent(AnnoOutputColumn.class)) { @@ -128,18 +149,26 @@ public class ExcelUtil { outputColumn.refClass().getDeclaredMethod("get" + StringTool.toUpperCaseFirstOne(outputColumn.refForeignKey())).getReturnType()); CellValue = method.invoke(data.get(i), CellValue); - } else { - selectByProperty(outputColumn.refClass(), outputColumn.value(), outputColumn.refForeignKey(), 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); } } - hssfRow.createCell(j, CellType.STRING).setCellValue(String.valueOf(CellValue)); + // excel 文本框最大长度 + if(String.valueOf(CellValue).length() > 30000){ + hssfRow.createCell(j, CellType.STRING).setCellValue(String.valueOf(CellValue).substring(0,30000)); + }else{ + hssfRow.createCell(j, CellType.STRING).setCellValue(String.valueOf(CellValue)); + } + } } workbook.write(fos); fos.flush(); - return file2Byte(excelFile); + return excelFile; } catch (Exception e) { e.printStackTrace(); throw ImppExceptionBuilder.newInstance() @@ -150,8 +179,7 @@ public class ExcelUtil { } finally { try { workbook.close(); - fos.close(); - excelFile.deleteOnExit(); + fos.close();; } catch (IOException e) { LOGGER.error("IOException!", e); } @@ -320,7 +348,7 @@ public class ExcelUtil { } workbook.write(fos); - return file2Byte(excelFile); + return FileUtil.file2Byte(excelFile.getPath()); } catch (IOException e) { throw ImppExceptionBuilder.newInstance() .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) @@ -346,18 +374,25 @@ public class ExcelUtil { */ public static Map getColName(Class pojoClass) { Map colName = new LinkedHashMap(); - Field[] field = pojoClass.getDeclaredFields(); - ApiParam fieldAnno; - - for (int i = 0; i < field.length; i++) { - if (field[i].isAnnotationPresent(ApiParam.class)) { - fieldAnno = field[i].getAnnotation(ApiParam.class); - if (!fieldAnno.hidden()) { - colName.put(field[i].getAnnotation(ApiParam.class).value(), field[i].getName()); + 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; } @@ -371,51 +406,69 @@ public class ExcelUtil { public static Object selectByProperty(Class persistentClass, String colName, String propertyName, Object value) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { String queryString = "select model." + colName + " from " + persistentClass.getSimpleName() + " as model where model." + propertyName + "= :" + propertyName; - Object result = entityManager.createQuery(queryString).setParameter(propertyName, value).getSingleResult(); - - return persistentClass.getDeclaredMethod("get" + StringTool.toUpperCaseFirstOne(colName)).invoke(result); + return entityManager.createQuery(queryString).setParameter(propertyName, value).getSingleResult(); } - public static void main(String[] args) { - List sysTools = new ArrayList<>(); - SysTool sysTool = new SysTool(); - for (int i = 0; i < 14; i++) { - sysTool.setName("ddd"); - sysTools.add(sysTool); - } - String[] colName = new String[]{"name", "toolTypeNameRdd", "toolStatus", "toolIp", "toolPort", "toolConnType", "toolDataType", "toolOperating", "toolDescription"}; - try { - FileOutputStream ds = new FileOutputStream("E://testOut.xls"); - ds.write(ExcelUtil.exportData(sysTools, SysTool.class, colName)); - ds.flush(); - ds.close(); -// ExcelUtil.importData("testOut.xls", new FileInputStream("E://testOut.xls"), SysTool.class); -// ExcelUtil.importTemplate(new FileOutputStream("E://testOut.xls"), SysTool.class, colName); - } catch (IOException e) { - e.printStackTrace(); + 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,sysMessage); } + public static void main(String[] args) { +// List sysTools = new ArrayList<>(); +// SysTool sysTool = new SysTool(); +// for (int i = 0; i < 14; i++) { +// sysTool.setName("ddd"); +// sysTools.add(sysTool); +// } +// String[] colName = new String[]{"name", "toolTypeNameRdd", "toolStatus", "toolIp", "toolPort", "toolConnType", "toolDataType", "toolOperating", "toolDescription"}; +// try { +// FileOutputStream ds = new FileOutputStream("E://testOut.xls"); +// ds.write(ExcelUtil.exportData(sysTools, SysTool.class, colName)); +// ds.flush(); +// ds.close(); +//// ExcelUtil.importData("testOut.xls", new FileInputStream("E://testOut.xls"), SysTool.class); +//// ExcelUtil.importTemplate(new FileOutputStream("E://testOut.xls"), SysTool.class, colName); +// +// } catch (IOException e) { +// e.printStackTrace(); +// } + SysTool st = new SysTool(); + st.setName("测试"); + st.setId(1L); - public static byte[] file2Byte(File file) { - byte[] buffer = null; try { - FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int n; - while ((n = fis.read(b)) != -1) { - bos.write(b, 0, n); - } - fis.close(); - bos.close(); - buffer = bos.toByteArray(); - } catch (FileNotFoundException e) { + System.out.println(SysTool.class.getField("id").isAccessible()); + System.out.println("取值:"+ SysTool.class.getField("id").get(st)); + System.out.println(SysTool.class.getDeclaredField("name").isAccessible()); + Field field = SysTool.class.getDeclaredField("name"); + field.setAccessible(true); + System.out.println("取值:"+ field.get(st)); + } catch (NoSuchFieldException e) { e.printStackTrace(); - } catch (IOException e) { + } catch (IllegalAccessException e) { e.printStackTrace(); } - return buffer; + + } } 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 new file mode 100644 index 0000000..4735e14 --- /dev/null +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/FileUtil.java @@ -0,0 +1,106 @@ +package cn.estsh.i3plus.core.apiservice.util; + +import java.io.*; + +/** + * @Description : 文件工具类 + * @Reference : + * @Author : yunhao + * @CreateDate : 2019-01-11 13:34 + * @Modify: + **/ +public class 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 + */ + 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 + * @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 new file mode 100644 index 0000000..5079e0e --- /dev/null +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/ZipUtil.java @@ -0,0 +1,181 @@ +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/java/cn/estsh/i3plus/core/apiservice/websocket/MessageWebSocket.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/MessageWebSocket.java index 77ff2a2..969b4d4 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/MessageWebSocket.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/MessageWebSocket.java @@ -84,9 +84,13 @@ public class MessageWebSocket { public static void sendMessage(Long userId, String message){ try { MessageWebSocket websocket = webSocketSet.get(userId); - if (websocket != null){ + if (message.equals("heartBit") && websocket.session != null){ websocket.session.getBasicRemote().sendText(message + "=" + sendCount); sendCount++; + }else{ + if(websocket != null){ + websocket.session.getBasicRemote().sendText(message); + } } } catch (IOException e) { e.printStackTrace(); From f7415fe02366cbfb34bd327861cd6938047fdb73 Mon Sep 17 00:00:00 2001 From: "yunhao.wang" Date: Sun, 13 Jan 2019 15:48:43 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E9=80=9A=E7=94=A8=E5=AF=BC=E5=87=BA=20?= =?UTF-8?q?=E5=8D=95=E5=8F=B7=E8=A7=84=E5=88=99=E5=AF=BC=E5=85=A5=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=20=E7=B3=BB=E7=BB=9F=E5=8F=82=E6=95=B0=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/api/iservice/busi/ISysConfigService.java | 8 + .../api/iservice/busi/ISysDictionaryService.java | 9 + .../controller/busi/SysConfigController.java | 15 ++ .../controller/busi/SysEnumController.java | 14 ++ .../controller/busi/SysOrderNoRuleController.java | 10 +- .../apiservice/mq/MessageLetterQueueReceiver.java | 7 +- .../serviceimpl/busi/SysConfigService.java | 6 + .../serviceimpl/busi/SysDictionaryService.java | 7 + .../i3plus/core/apiservice/util/ExcelUtil.java | 200 +++++++++------------ .../apiservice/websocket/MessageWebSocket.java | 12 +- .../src/main/resources/application-dev.properties | 2 +- .../src/main/resources/init/sys-config.xlsx | Bin 33811 -> 37800 bytes 12 files changed, 159 insertions(+), 131 deletions(-) diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysConfigService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysConfigService.java index 581b816..9bc45ea 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysConfigService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysConfigService.java @@ -83,4 +83,12 @@ public interface ISysConfigService { @ApiOperation(value = "根据系统配置代码修改配置项") void updateSysConfigByCode(String code,String value); + /** + * 根据系统参数组来查找系统参数 + * @param group + * @return + */ + @ApiOperation(value = "根据系统参数组来查找系统参数") + List findSysConfigByGroup(Integer group); + } diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysDictionaryService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysDictionaryService.java index 85ce4c6..9f1d1fa 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysDictionaryService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysDictionaryService.java @@ -112,4 +112,13 @@ public interface ISysDictionaryService { */ @ApiOperation(value = "根据父节点 以及当前节点值 获取字典信息") SysDictionary getSysDictionaryByParentCodeAndValue(String parentCode,String value); + + /** + * 根据父节点 以及当前节点名称 获取字典信息 + * @param parentCode 父级代码 + * @param name 字典值 + * @return + */ + @ApiOperation(value = "根据父节点 以及当前节点名称 获取字典信息") + SysDictionary getSysDictionaryByParentCodeAndName(String parentCode,String name); } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysConfigController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysConfigController.java index 030cac2..63c6147 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysConfigController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysConfigController.java @@ -43,6 +43,7 @@ public class SysConfigController extends CoreBaseController { @Autowired private ISysConfigService sysConfigService; + @Autowired private MailUtil mailUtil; @@ -248,4 +249,18 @@ public class SysConfigController extends CoreBaseController { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } + + @GetMapping("/find-group/{group}") + @ApiOperation(value = "根据参数组查询系统参数") + public ResultBean findSysConfigByGroup(@PathVariable("group") Integer group){ + try { + ValidatorBean.checkNotNull(group,"参数组不能为空"); + List sysConfigList = sysConfigService.findSysConfigByGroup(group); + return ResultBean.success("查询成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultList(sysConfigList); + }catch(ImppBusiException busExcep){ + return ResultBean.fail(busExcep); + }catch(Exception e){ + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysEnumController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysEnumController.java index 02845e8..3bbcbf4 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysEnumController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysEnumController.java @@ -161,4 +161,18 @@ public class SysEnumController extends CoreBaseController{ return new ResultBean(true, "操作成功", Arrays.asList(ImppEnumUtil.SYS_VALUE_TYPE.values())); } + + @GetMapping("/sys-math-symbol") + @ApiOperation(value = "数学表达式", notes = "数学表达式") + public ResultBean getSysMathSymbol(){ + return new ResultBean(true, "操作成功", + Arrays.asList(CommonEnumUtil.MATH_SYMBOL.values())); + } + + @GetMapping("/sys-config-group") + @ApiOperation(value = "系统配置组", notes = "系统配置组") + public ResultBean getSysConfigGroup(){ + return new ResultBean(true, "操作成功", + Arrays.asList(ImppEnumUtil.SYS_CONFIG_GROUP.values())); + } } 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 dee27de..37e86cd 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 @@ -290,15 +290,7 @@ public class SysOrderNoRuleController extends CoreBaseController { public ResultBean importSysOrderNoRule(@RequestParam("file") MultipartFile file){ try { List sysOrderNoRuleList = ExcelUtil.importData(file.getOriginalFilename(),file.getInputStream(),SysOrderNoRule.class); - for (SysOrderNoRule item : sysOrderNoRuleList) { - //校验及初始化数据 - validatorSysOrderNoRule(item); - item.setOrderNoRuleStatus(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); - item.setSerialNo(CommonEnumUtil.PARENT.DEFAULT.getValue()); - - sysOrderNoRuleService.insertSysOrderNoRule(item); - } - + sysOrderNoRuleService.insertSysOrderNoRuleList(sysOrderNoRuleList); 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/mq/MessageLetterQueueReceiver.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MessageLetterQueueReceiver.java index 147bd22..693bd0f 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MessageLetterQueueReceiver.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MessageLetterQueueReceiver.java @@ -9,7 +9,7 @@ import cn.estsh.i3plus.pojo.base.enumutil.ImppEnumUtil; import cn.estsh.i3plus.pojo.platform.bean.SysMessage; import cn.estsh.i3plus.pojo.platform.bean.SysRefUserMessage; import cn.estsh.i3plus.pojo.platform.bean.SysUser; -import com.alibaba.fastjson.JSON; +import com.fasterxml.jackson.databind.ObjectMapper; import com.rabbitmq.client.Channel; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -58,7 +58,8 @@ public class MessageLetterQueueReceiver { SysRefUserMessage refUserMessage; SysUser sysUser; - List userMessage; + List userMessage; + ObjectMapper mapper = new ObjectMapper(); for (int i = 0; i < messageReceiver.length; i++) { sysUser = sysUserService.getSysUserById(Long.parseLong(messageReceiver[i])); @@ -80,7 +81,7 @@ public class MessageLetterQueueReceiver { userMessage = sysMessageService.findSysRefUserMessageByUserIdAndStatus(sysUser.getId(), ImppEnumUtil.MESSAGE_STATUS.UNREAD.getValue()); MessageWebSocket.sendMessage(sysUser.getUserInfoId(), - JSON.toJSONString(userMessage) + mapper.writeValueAsString(userMessage) ); } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysConfigService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysConfigService.java index 745b9cf..b33b313 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysConfigService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysConfigService.java @@ -105,4 +105,10 @@ public class SysConfigService implements ISysConfigService { SysConfigRDao.updateByProperties("configCode",value,"configValue",value); } + @Override + @ApiOperation(value = "根据系统参数组来查找系统参数") + public List findSysConfigByGroup(Integer group) { + return SysConfigRDao.findByProperty("configGroup",group); + } + } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysDictionaryService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysDictionaryService.java index ad4ea82..3039946 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysDictionaryService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysDictionaryService.java @@ -192,4 +192,11 @@ public class SysDictionaryService implements ISysDictionaryService { return sysDictionaryRDao.getByProperty(new String[]{"parentCodeRdd","dictionaryValue"}, new Object[]{parentCode,value}); } + + @Override + @ApiOperation(value = "根据父节点 以及当前节点名称 获取字典信息") + public SysDictionary getSysDictionaryByParentCodeAndName(String parentCode, String name) { + return sysDictionaryRDao.getByProperty(new String[]{"parentCodeRdd","name"}, + new Object[]{parentCode,name}); + } } 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 index fcb58fc..fb410d1 100644 --- 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 @@ -20,10 +20,7 @@ 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.CellType; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -80,7 +77,6 @@ public class ExcelUtil { this.rabbitTemplate = rabbitTemplate; } - /** * 导出 * @@ -130,13 +126,13 @@ public class ExcelUtil { HSSFRow hssfRow; Method method; AnnoOutputColumn outputColumn; - Object CellValue; + 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)); + cellValue = fields[j].get(data.get(i)); // 判断是否存在引用关系 if (fields[j].isAnnotationPresent(AnnoOutputColumn.class)) { @@ -148,19 +144,19 @@ public class ExcelUtil { 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(); + 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); + cellValue = selectByProperty(outputColumn.refClass(), outputColumn.value(), outputColumn.refForeignKey(), cellValue); } } // excel 文本框最大长度 - if(String.valueOf(CellValue).length() > 30000){ - hssfRow.createCell(j, CellType.STRING).setCellValue(String.valueOf(CellValue).substring(0,30000)); + if(String.valueOf(cellValue).length() > 30000){ + hssfRow.createCell(j, CellType.STRING).setCellValue(String.valueOf(cellValue).substring(0,30000)); }else{ - hssfRow.createCell(j, CellType.STRING).setCellValue(String.valueOf(CellValue)); + hssfRow.createCell(j, CellType.STRING).setCellValue(String.valueOf(cellValue)); } } @@ -228,11 +224,12 @@ public class ExcelUtil { // excel列名与字段名映射 Map colName = new HashMap<>(); - ApiParam fieldAnno; - for (Field field : importClass.getDeclaredFields()) { - if (field.isAnnotationPresent(ApiParam.class)) { - fieldAnno = field.getAnnotation(ApiParam.class); - colName.put(fieldAnno.value(), field); + 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); } } @@ -247,61 +244,42 @@ public class ExcelUtil { 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++) { - row.getCell(j).setCellType(CellType.STRING); - if ("".equals(row.getCell(j).getStringCellValue())) { - cellValue = null; - } else if (fields[j].getType() == String.class) { + // 判断是否存在引用关系 + if (fields[j].isAnnotationPresent(AnnoOutputColumn.class)) { + inputColumn = fields[j].getAnnotation(AnnoOutputColumn.class); cellValue = row.getCell(j).getStringCellValue(); - } else if (fields[j].getType() == Integer.class) { - cellValue = Integer.parseInt(row.getCell(j).getStringCellValue()); - } else if (fields[j].getType() == Long.class) { - cellValue = Long.parseLong(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),fields[j].getType()); } - importClass.getDeclaredMethod("set" + StringTool.toUpperCaseFirstOne(fields[j].getName()), fields[j].getType()) - .invoke(obj, cellValue); + fields[j].setAccessible(true); + fields[j].set(obj,cellValue); } dataList.add(obj); } - } catch (IOException e) { - throw ImppExceptionBuilder.newInstance() - .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) - .setErrorCode(ImppExceptionEnum.IO_EXCEPTION.getCode()) - .setErrorDetail("IO输入输出异常") - .build(); - } catch (IllegalAccessException e) { - throw ImppExceptionBuilder.newInstance() - .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) - .setErrorCode(ImppExceptionEnum.REFLEX_EXCEPTION.getCode()) - .setErrorDetail("无法访问导入类") - .setErrorSolution("请检查导入类访问修饰符") - .build(); - } catch (InstantiationException e) { - throw ImppExceptionBuilder.newInstance() - .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) - .setErrorCode(ImppExceptionEnum.REFLEX_EXCEPTION.getCode()) - .setErrorDetail("无法实例化导入类") - .setErrorSolution("请检查导入类是拥有无参构造方法") - .build(); - } catch (InvocationTargetException e) { - throw ImppExceptionBuilder.newInstance() - .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) - .setErrorCode(ImppExceptionEnum.REFLEX_EXCEPTION.getCode()) - .setErrorDetail("属性set方法实现错误") - .setErrorSolution("请检查属性set方法参数类型是否正确") - .build(); - } catch (NoSuchMethodException e) { - throw ImppExceptionBuilder.newInstance() - .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) - .setErrorCode(ImppExceptionEnum.REFLEX_EXCEPTION.getCode()) - .setErrorDetail("没有找到属性set方法") - .setErrorSolution("请检查属性set方法是否存在") - .build(); + } catch (Exception e){ + e.printStackTrace(); } return dataList; } @@ -328,20 +306,28 @@ public class ExcelUtil { // 创建表头 HSSFRow tableHeader = sheet.createRow(0); - HSSFRow tableData = sheet.createRow(1); // 类数据 - Field[] declaredFields = exportClass.getDeclaredFields(); - ApiParam fieldAnno; + Field[] fields = ReflexTool.getAllField(exportClass.getName()); int col = 0; - for (int i = 0; i < declaredFields.length; i++) { - if (declaredFields[i].isAnnotationPresent(ApiParam.class)) { - fieldAnno = declaredFields[i].getAnnotation(ApiParam.class); - if (!fieldAnno.hidden()) { - tableHeader.createCell(col, CellType.STRING).setCellValue(fieldAnno.value()); + 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()); + } - tableData.createCell(col, CellType.STRING).setCellValue(fieldAnno.example()); + // 优先使用 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++; } } @@ -368,7 +354,6 @@ public class ExcelUtil { /** * 获取实体列集合 - * * @param pojoClass * @return */ @@ -381,7 +366,6 @@ public class ExcelUtil { colName.put(fields[i].getName(),fields[i].getAnnotation(ApiParam.class).value()); } - if (fields[i].isAnnotationPresent(AnnoOutputColumn.class)) { // 判断是否隐藏 if(fields[i].getAnnotation(AnnoOutputColumn.class).hidden()){ @@ -397,6 +381,7 @@ public class ExcelUtil { } /** + * 查询外键信息 * @param persistentClass * @param colName * @param propertyName @@ -409,7 +394,36 @@ public class ExcelUtil { 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 + */ public static void sendStationLetter(List fileList, Long userId){ StringBuffer letter = new StringBuffer(); letter.append("导出文件列表:"); @@ -433,42 +447,4 @@ public class ExcelUtil { rabbitTemplate.convertAndSend(PlatformConstWords.IMPP_MESSAGE_LETTER_QUEUE,sysMessage); } - public static void main(String[] args) { -// List sysTools = new ArrayList<>(); -// SysTool sysTool = new SysTool(); -// for (int i = 0; i < 14; i++) { -// sysTool.setName("ddd"); -// sysTools.add(sysTool); -// } -// String[] colName = new String[]{"name", "toolTypeNameRdd", "toolStatus", "toolIp", "toolPort", "toolConnType", "toolDataType", "toolOperating", "toolDescription"}; -// try { -// FileOutputStream ds = new FileOutputStream("E://testOut.xls"); -// ds.write(ExcelUtil.exportData(sysTools, SysTool.class, colName)); -// ds.flush(); -// ds.close(); -//// ExcelUtil.importData("testOut.xls", new FileInputStream("E://testOut.xls"), SysTool.class); -//// ExcelUtil.importTemplate(new FileOutputStream("E://testOut.xls"), SysTool.class, colName); -// -// } catch (IOException e) { -// e.printStackTrace(); -// } - SysTool st = new SysTool(); - st.setName("测试"); - st.setId(1L); - - try { - System.out.println(SysTool.class.getField("id").isAccessible()); - System.out.println("取值:"+ SysTool.class.getField("id").get(st)); - System.out.println(SysTool.class.getDeclaredField("name").isAccessible()); - Field field = SysTool.class.getDeclaredField("name"); - field.setAccessible(true); - System.out.println("取值:"+ field.get(st)); - } catch (NoSuchFieldException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - - - } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/MessageWebSocket.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/MessageWebSocket.java index 969b4d4..7ffdbe8 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/MessageWebSocket.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/MessageWebSocket.java @@ -21,7 +21,7 @@ import java.util.concurrent.ConcurrentMap; * @CreateDate : 2018-11-24 16:57 * @Modify: **/ -@ServerEndpoint(value= PlatformConstWords.BASE_URL + "/message-websocket/{userId}") +@ServerEndpoint(value= PlatformConstWords.WEBSOCKET_URL + "/message-websocket/{userId}") @Component public class MessageWebSocket { @@ -84,11 +84,11 @@ public class MessageWebSocket { public static void sendMessage(Long userId, String message){ try { MessageWebSocket websocket = webSocketSet.get(userId); - if (message.equals("heartBit") && websocket.session != null){ - websocket.session.getBasicRemote().sendText(message + "=" + sendCount); - sendCount++; - }else{ - if(websocket != null){ + if(websocket != null) { + if (message.equals("heartBit")) { + websocket.session.getBasicRemote().sendText(message + "=" + sendCount); + sendCount++; + } else { websocket.session.getBasicRemote().sendText(message); } } diff --git a/modules/i3plus-core-apiservice/src/main/resources/application-dev.properties b/modules/i3plus-core-apiservice/src/main/resources/application-dev.properties index 734b8da..b21c055 100644 --- a/modules/i3plus-core-apiservice/src/main/resources/application-dev.properties +++ b/modules/i3plus-core-apiservice/src/main/resources/application-dev.properties @@ -1,7 +1,7 @@ #项目端口 server.port=8100 #本机ip -impp.server.ip=192.168.1.40 +impp.server.ip=192.168.1.56 #console控制台服务(zipkin追踪全路径) impp.console.ip=http://csd.estsh.com 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 94b84796ae6eccc0eb3eba9c8b65507f95a71bcc..db2137d67d877eed62ce58f9835b4f5b9aa793bd 100644 GIT binary patch delta 21914 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 Q$GRrJZdPJj(F>9U05_x>NB{r; delta 17989 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