From 2bc988c1f9a7372fae50ac5f8a77680e1bdfe208 Mon Sep 17 00:00:00 2001 From: mzc5649 <13027087095@163.com> Date: Thu, 8 Apr 2021 09:11:57 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90add=E3=80=91=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=AD=97=E5=85=B8=E6=A8=A1=E5=9D=97=E5=88=B7=E6=96=B0=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E7=9A=84=E6=9C=8D=E5=8A=A1=E5=B1=82=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/OnlCgformHeadServiceImpl.java | 1 + .../system/controller/SysDictController.java | 1135 ++++++++--------- .../system/service/ISysDictService.java | 283 ++-- .../service/impl/SysDictServiceImpl.java | 603 ++++----- 4 files changed, 1021 insertions(+), 1001 deletions(-) diff --git a/jero-boot/jero-boot-base/jero-boot-base-generater/src/main/java/com/jero/generater/modules/online/cgform/service/impl/OnlCgformHeadServiceImpl.java b/jero-boot/jero-boot-base/jero-boot-base-generater/src/main/java/com/jero/generater/modules/online/cgform/service/impl/OnlCgformHeadServiceImpl.java index 60dd4040..0a26b056 100644 --- a/jero-boot/jero-boot-base/jero-boot-base-generater/src/main/java/com/jero/generater/modules/online/cgform/service/impl/OnlCgformHeadServiceImpl.java +++ b/jero-boot/jero-boot-base/jero-boot-base-generater/src/main/java/com/jero/generater/modules/online/cgform/service/impl/OnlCgformHeadServiceImpl.java @@ -360,6 +360,7 @@ public class OnlCgformHeadServiceImpl extends ServiceImpl - * 字典表 前端控制器 - *

- * - * @Author zhangweijian - * @since 2018-12-28 - */ -@RestController -@Api(tags = "字典控制器") -@RequestMapping("/sys/dict") -@Slf4j -public class SysDictController { - - @Autowired - private ISysDictService sysDictService; - @Autowired - private ISysDictItemService sysDictItemService; - @Autowired - public RedisTemplate redisTemplate; - - @RequestMapping(value = "/list", method = RequestMethod.GET) - @ApiOperation(value = "字典控制器-分页列表查询", notes = "字典控制器-分页列表查询") - public Result> queryPageList(SysDict sysDict, @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, - @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, HttpServletRequest req) { - Result> result = new Result>(); - QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysDict, req.getParameterMap()); - Page page = new Page(pageNo, pageSize); - IPage pageList = sysDictService.page(page, queryWrapper); - log.debug("查询当前页:"+pageList.getCurrent()); - log.debug("查询当前页数量:"+pageList.getSize()); - log.debug("查询结果数量:"+pageList.getRecords().size()); - log.debug("数据总数:"+pageList.getTotal()); - result.setSuccess(true); - result.setResult(pageList); - return result; - } - - /** - * @功能:获取树形字典数据 - * @param sysDict - * @param pageNo - * @param pageSize - * @param req - * @return - */ - @SuppressWarnings("unchecked") - @ApiOperation(value = "字典控制器-树形字典数据", notes = "字典控制器-树形字典数据") - @RequestMapping(value = "/treeList", method = RequestMethod.GET) - public Result> treeList(SysDict sysDict, @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, - @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, HttpServletRequest req) { - Result> result = new Result<>(); - LambdaQueryWrapper query = new LambdaQueryWrapper<>(); - // 构造查询条件 - String dictName = sysDict.getDictName(); - if(oConvertUtils.isNotEmpty(dictName)) { - query.like(true, SysDict::getDictName, dictName); - } - query.orderByDesc(true, SysDict::getCreateTime); - List list = sysDictService.list(query); - List treeList = new ArrayList<>(); - for (SysDict node : list) { - treeList.add(new SysDictTree(node)); - } - result.setSuccess(true); - result.setResult(treeList); - return result; - } - - /** - * 获取字典数据 - * @param dictCode 字典code - * @param dictCode 表名,文本字段,code字段 | 举例:sys_user,realname,id - * @return - */ - @ApiOperation(value = "字典控制器-根据字典编码获取字典数据", notes = "字典控制器-根据字典编码获取字典数据") - @RequestMapping(value = "/getDictItems/{dictCode}", method = RequestMethod.GET) - public Result> getDictItems(@PathVariable String dictCode, @RequestParam(value = "sign",required = false) String sign, HttpServletRequest request) { - log.info(" dictCode : "+ dictCode); - Result> result = new Result>(); - List ls = null; - try { - if(dictCode.indexOf(",")!=-1) { - //关联表字典(举例:sys_user,realname,id) - String[] params = dictCode.split(","); - - if(params.length<3) { - result.error500("字典Code格式不正确!"); - return result; - } - //SQL注入校验(只限制非法串改数据库) - final String[] sqlInjCheck = {params[0],params[1],params[2]}; - SqlInjectionUtil.filterContent(sqlInjCheck); - - if(params.length==4) { - //SQL注入校验(查询条件SQL 特殊check,此方法仅供此处使用) - SqlInjectionUtil.specialFilterContent(params[3]); - ls = sysDictService.queryTableDictItemsByCodeAndFilter(params[0],params[1],params[2],params[3]); - }else if (params.length==3) { - ls = sysDictService.queryTableDictItemsByCode(params[0],params[1],params[2]); - }else{ - result.error500("字典Code格式不正确!"); - return result; - } - }else { - //字典表 - ls = sysDictService.queryDictItemsByCode(dictCode); - } - - result.setSuccess(true); - result.setResult(ls); - log.debug(result.toString()); - } catch (Exception e) { - log.error(e.getMessage(),e); - result.error500("操作失败"); - return result; - } - - return result; - } - - /** - * 获取全部字典数据 - * - * @return - */ - @ApiOperation(value = "字典控制器-获取全部字典数据", notes = "字典控制器-获取全部字典数据") - @RequestMapping(value = "/queryAllDictItems", method = RequestMethod.GET) - public Result queryAllDictItems(HttpServletRequest request) { - Map> res = new HashMap>(); - res = sysDictService.queryAllDictItems(); - return Result.OK(res); - } - - /** - * 获取字典数据 - * @param dictCode - * @return - */ - @ApiOperation(value = "字典控制器-通过字典code和字典值key获取字典数据", notes = "字典控制器-通过字典code和字典值key获取字典数据") - @RequestMapping(value = "/getDictText/{dictCode}/{key}", method = RequestMethod.GET) - public Result getDictText(@PathVariable("dictCode") String dictCode, @PathVariable("key") String key) { - log.info(" dictCode : "+ dictCode); - Result result = new Result(); - String text = null; - try { - text = sysDictService.queryDictTextByKey(dictCode, key); - result.setSuccess(true); - result.setResult(text); - } catch (Exception e) { - log.error(e.getMessage(),e); - result.error500("操作失败"); - return result; - } - return result; - } - - /** - * 大数据量的字典表 走异步加载 即前端输入内容过滤数据 - * @param dictCode - * @return - */ - @ApiOperation(value = "字典控制器-通过字典code获取字典数据", notes = "字典控制器-通过字典code获取字典数据") - @RequestMapping(value = "/loadDict/{dictCode}", method = RequestMethod.GET) - public Result> loadDict(@PathVariable String dictCode, - @RequestParam(name="keyword") String keyword, - @RequestParam(value = "sign",required = false) String sign, - @RequestParam(value = "pageSize", required = false) Integer pageSize) { - log.info(" 加载字典表数据,加载关键字: "+ keyword); - Result> result = new Result>(); - List ls = null; - try { - if(dictCode.indexOf(",")!=-1) { - String[] params = dictCode.split(","); - if(params.length!=3) { - result.error500("字典Code格式不正确!"); - return result; - } - if(pageSize!=null){ - ls = sysDictService.queryLittleTableDictItems(params[0],params[1],params[2],keyword, pageSize); - }else{ - ls = sysDictService.queryTableDictItems(params[0],params[1],params[2],keyword); - } - result.setSuccess(true); - result.setResult(ls); - log.info(result.toString()); - }else { - result.error500("字典Code格式不正确!"); - } - } catch (Exception e) { - log.error(e.getMessage(),e); - result.error500("操作失败"); - return result; - } - - return result; - } - - /** - * 根据字典code加载字典text 返回 - */ - @ApiOperation(value = "字典控制器-根据字典code加载字典text", notes = "字典控制器-根据字典code加载字典text") - @RequestMapping(value = "/loadDictItem/{dictCode}", method = RequestMethod.GET) - public Result> loadDictItem(@PathVariable String dictCode, @RequestParam(name="key") String keys, @RequestParam(value = "sign",required = false) String sign, HttpServletRequest request) { - Result> result = new Result<>(); - try { - if(dictCode.indexOf(",")!=-1) { - String[] params = dictCode.split(","); - if(params.length!=3) { - result.error500("字典Code格式不正确!"); - return result; - } - List texts = sysDictService.queryTableDictByKeys(params[0], params[1], params[2], keys); - - result.setSuccess(true); - result.setResult(texts); - log.info(result.toString()); - }else { - result.error500("字典Code格式不正确!"); - } - } catch (Exception e) { - log.error(e.getMessage(),e); - result.error500("操作失败"); - return result; - } - - return result; - } - - /** - * 根据表名——显示字段-存储字段 pid 加载树形数据 - */ - @ApiOperation(value = "字典控制器-根据表名—显示字段-存储字段 pid 加载树形数据", notes = "字典控制器-根据表名—显示字段-存储字段 pid 加载树形数据") - @RequestMapping(value = "/loadTreeData", method = RequestMethod.GET) - public Result> loadTreeData(@RequestParam(name="pid") String pid, @RequestParam(name="pidField") String pidField, - @RequestParam(name="tableName") String tbname, - @RequestParam(name="text") String text, - @RequestParam(name="code") String code, - @RequestParam(name="hasChildField", required = false) String hasChildField, - @RequestParam(value = "sign", required = false) String sign, HttpServletRequest request) { - Result> result = new Result>(); - - // SQL注入漏洞 sign签名校验(表名,label字段,val字段,条件) - String dictCode = tbname +","+ text +","+ code; - SqlInjectionUtil.filterContent(dictCode); - List ls = sysDictService.queryTreeList(null, tbname, text, code, pidField, pid, hasChildField); - result.setSuccess(true); - result.setResult(ls); - return result; - } - - /** - * 查询后返回树型数据 - */ - @ApiOperation(value = "字典控制器-根据表名—显示字段-存储字段 加载树形数据", notes = "字典控制器-根据表名—显示字段-存储字段 加载树形数据") - @RequestMapping(value = "/queryAllTreeData", method = RequestMethod.GET) - public Result> queryAllTreeData(@RequestParam(name="pidField") String pidField, - @RequestParam(name="tableName") String tbname, - @RequestParam(name="text") String text, - @RequestParam(name="code") String code, - HttpServletRequest request) { - Result> result = new Result>(); - - // SQL注入漏洞 sign签名校验(表名,label字段,val字段,条件) - String dictCode = tbname +","+ text +","+ code; - SqlInjectionUtil.filterContent(dictCode); - List ls = sysDictService.queryAllTreeData(tbname, text, code, pidField); - result.setSuccess(true); - result.setResult(ls); - return result; - } - - /** - * @功能:新增 - * @param sysDict - * @return - */ - @ApiOperation(value = "字典控制器-新增字典", notes = "字典控制器-新增字典") - @RequiresRoles({"admin"}) - @RequestMapping(value = "/add", method = RequestMethod.POST) - public Result add(@RequestBody SysDict sysDict) { - Result result = new Result(); - try { - sysDict.setCreateTime(new Date()); - sysDict.setDelFlag(CommonConstant.DEL_FLAG_0); - sysDictService.save(sysDict); - result.success("保存成功!"); - } catch (Exception e) { - log.error(e.getMessage(),e); - result.error500("操作失败"); - } - return result; - } - - /** - * @功能:编辑 - * @param sysDict - * @return - */ - @ApiOperation(value = "字典控制器-编辑字典", notes = "字典控制器-编辑字典") - @RequiresRoles({"admin"}) - @RequestMapping(value = "/edit", method = RequestMethod.PUT) - public Result edit(@RequestBody SysDict sysDict) { - Result result = new Result(); - SysDict sysdict = sysDictService.getById(sysDict.getId()); - if(sysdict==null) { - result.error500("未找到对应实体"); - }else { - sysDict.setUpdateTime(new Date()); - boolean ok = sysDictService.updateById(sysDict); - if(ok) { - result.success("编辑成功!"); - } - } - return result; - } - - /** - * @功能:删除 - * @param id - * @return - */ - @ApiOperation(value = "字典控制器-删除字典", notes = "字典控制器-删除字典") - @RequiresRoles({"admin"}) - @DeleteMapping(value = "/delete") - @CacheEvict(value=CacheConstant.SYS_DICT_CACHE, allEntries=true) - public Result delete(@RequestParam(name="id",required=true) String id) { - Result result = new Result(); - boolean ok = sysDictService.removeById(id); - if(ok) { - result.success("删除成功!"); - }else{ - result.error500("删除失败!"); - } - return result; - } - - /** - * @功能:批量删除 - * @param ids - * @return - */ - @ApiOperation(value = "字典控制器-批量字典", notes = "字典控制器-批量字典") - @RequiresRoles({"admin"}) - @DeleteMapping(value = "/deleteBatch") - @CacheEvict(value= CacheConstant.SYS_DICT_CACHE, allEntries=true) - public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { - Result result = new Result(); - if(oConvertUtils.isEmpty(ids)) { - result.error500("参数不识别!"); - }else { - sysDictService.removeByIds(Arrays.asList(ids.split(","))); - result.success("删除成功!"); - } - return result; - } - - /** - * @功能:刷新缓存 - * @return - */ - @RequestMapping(value = "/refleshCache") - public Result refleshCache() { - Result result = new Result(); - //清空字典缓存 - Set keys = redisTemplate.keys(CacheConstant.SYS_DICT_CACHE + "*"); - Set keys2 = redisTemplate.keys(CacheConstant.SYS_DICT_TABLE_CACHE + "*"); - Set keys3 = redisTemplate.keys(CacheConstant.SYS_DEPARTS_CACHE + "*"); - Set keys4 = redisTemplate.keys(CacheConstant.SYS_DEPART_IDS_CACHE + "*"); - Set keys5 = redisTemplate.keys( "jmreport:cache:dict*"); - Set keys6 = redisTemplate.keys( "jmreport:cache:dictTable*"); - redisTemplate.delete(keys); - redisTemplate.delete(keys2); - redisTemplate.delete(keys3); - redisTemplate.delete(keys4); - redisTemplate.delete(keys5); - redisTemplate.delete(keys6); - return result; - } - - /** - * 导出excel - * - * @param request - */ - @RequestMapping(value = "/exportXls") - public ModelAndView exportXls(SysDict sysDict, HttpServletRequest request) { - // Step.1 组装查询条件 - QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysDict, request.getParameterMap()); - //Step.2 AutoPoi 导出Excel - ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); - List pageList = new ArrayList(); - - List sysDictList = sysDictService.list(queryWrapper); - for (SysDict dictMain : sysDictList) { - SysDictPage vo = new SysDictPage(); - BeanUtils.copyProperties(dictMain, vo); - // 查询机票 - List sysDictItemList = sysDictItemService.selectItemsByMainId(dictMain.getId()); - vo.setSysDictItemList(sysDictItemList); - pageList.add(vo); - } - - // 导出文件名称 - mv.addObject(NormalExcelConstants.FILE_NAME, "数据字典"); - // 注解对象Class - mv.addObject(NormalExcelConstants.CLASS, SysDictPage.class); - // 自定义表格参数 - LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); - mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("数据字典列表", "导出人:"+user.getRealname(), "数据字典")); - // 导出数据列表 - mv.addObject(NormalExcelConstants.DATA_LIST, pageList); - return mv; - } - - /** - * 通过excel导入数据 - * - * @param request - * @param - * @return - */ - @RequiresRoles({"admin"}) - @PostMapping(value = "/importExcel") - public Result importExcel(HttpServletRequest request, HttpServletResponse response) { - MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; - Map fileMap = multipartRequest.getFileMap(); - for (Map.Entry entity : fileMap.entrySet()) { - MultipartFile file = entity.getValue();// 获取上传文件对象 - ImportParams params = new ImportParams(); - params.setTitleRows(2); - params.setHeadRows(2); - params.setNeedSave(true); - try { - //导入Excel格式校验,看匹配的字段文本概率 - Boolean t = ExcelImportCheckUtil.check(file.getInputStream(), SysDictPage.class, params); - if(!t){ - throw new RuntimeException("导入Excel校验失败 !"); - } - List list = ExcelImportUtil.importExcel(file.getInputStream(), SysDictPage.class, params); - // 错误信息 - List errorMessage = new ArrayList<>(); - int successLines = 0, errorLines = 0; - for (int i=0;i< list.size();i++) { - SysDict po = new SysDict(); - BeanUtils.copyProperties(list.get(i), po); - po.setDelFlag(CommonConstant.DEL_FLAG_0); - try { - Integer integer = sysDictService.saveMain(po, list.get(i).getSysDictItemList()); - if(integer>0){ - successLines++; - }else{ - errorLines++; - int lineNumber = i + 1; - errorMessage.add("第 " + lineNumber + " 行:字典编码已经存在,忽略导入。"); - } - } catch (Exception e) { - errorLines++; - int lineNumber = i + 1; - errorMessage.add("第 " + lineNumber + " 行:字典编码已经存在,忽略导入。"); - } - } - return ImportExcelUtil.imporReturnRes(errorLines,successLines,errorMessage); - } catch (Exception e) { - log.error(e.getMessage(),e); - return Result.error("文件导入失败:"+e.getMessage()); - } finally { - try { - file.getInputStream().close(); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - return Result.error("文件导入失败!"); - } - - - /** - * 查询被删除的列表 - * @return - */ - @GetMapping(value = "/deleteList") - public Result> deleteList() { - Result> result = new Result>(); - List list = this.sysDictService.queryDeleteList(); - result.setSuccess(true); - result.setResult(list); - return result; - } - - /** - * 物理删除 - * @param id - * @return - */ - @DeleteMapping(value = "/deletePhysic/{id}") - public Result deletePhysic(@PathVariable String id) { - try { - sysDictService.deleteOneDictPhysically(id); - return Result.OK("删除成功!"); - } catch (Exception e) { - e.printStackTrace(); - return Result.error("删除失败!"); - } - } - - /** - * 取回 - * @param id - * @return - */ - @PutMapping(value = "/back/{id}") - public Result back(@PathVariable String id) { - try { - sysDictService.updateDictDelFlag(0,id); - return Result.OK("操作成功!"); - } catch (Exception e) { - e.printStackTrace(); - return Result.error("操作失败!"); - } - } - -} +package com.jero.modules.system.controller; + + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authz.annotation.RequiresRoles; +import com.jero.common.api.vo.Result; +import com.jero.common.constant.CacheConstant; +import com.jero.common.constant.CommonConstant; +import com.jero.common.system.query.QueryGenerator; +import com.jero.common.system.vo.DictModel; +import com.jero.common.system.vo.DictQuery; +import com.jero.common.system.vo.LoginUser; +import com.jero.common.util.ImportExcelUtil; +import com.jero.common.util.SqlInjectionUtil; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysDict; +import com.jero.modules.system.entity.SysDictItem; +import com.jero.modules.system.model.SysDictTree; +import com.jero.modules.system.model.TreeSelectModel; +import com.jero.modules.system.service.ISysDictItemService; +import com.jero.modules.system.service.ISysDictService; +import com.jero.modules.system.vo.SysDictPage; +import org.jeecgframework.poi.excel.ExcelImportCheckUtil; +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.*; + +/** + *

+ * 字典表 前端控制器 + *

+ * + * @Author zhangweijian + * @since 2018-12-28 + */ +@RestController +@Api(tags = "字典控制器") +@RequestMapping("/sys/dict") +@Slf4j +public class SysDictController { + + @Autowired + private ISysDictService sysDictService; + @Autowired + private ISysDictItemService sysDictItemService; + @Autowired + public RedisTemplate redisTemplate; + + @RequestMapping(value = "/list", method = RequestMethod.GET) + @ApiOperation(value = "字典控制器-分页列表查询", notes = "字典控制器-分页列表查询") + public Result> queryPageList(SysDict sysDict, @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, HttpServletRequest req) { + Result> result = new Result>(); + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysDict, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = sysDictService.page(page, queryWrapper); + log.debug("查询当前页:"+pageList.getCurrent()); + log.debug("查询当前页数量:"+pageList.getSize()); + log.debug("查询结果数量:"+pageList.getRecords().size()); + log.debug("数据总数:"+pageList.getTotal()); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * @功能:获取树形字典数据 + * @param sysDict + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @SuppressWarnings("unchecked") + @ApiOperation(value = "字典控制器-树形字典数据", notes = "字典控制器-树形字典数据") + @RequestMapping(value = "/treeList", method = RequestMethod.GET) + public Result> treeList(SysDict sysDict, @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, HttpServletRequest req) { + Result> result = new Result<>(); + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + // 构造查询条件 + String dictName = sysDict.getDictName(); + if(oConvertUtils.isNotEmpty(dictName)) { + query.like(true, SysDict::getDictName, dictName); + } + query.orderByDesc(true, SysDict::getCreateTime); + List list = sysDictService.list(query); + List treeList = new ArrayList<>(); + for (SysDict node : list) { + treeList.add(new SysDictTree(node)); + } + result.setSuccess(true); + result.setResult(treeList); + return result; + } + + /** + * 获取字典数据 + * @param dictCode 字典code + * @param dictCode 表名,文本字段,code字段 | 举例:sys_user,realname,id + * @return + */ + @ApiOperation(value = "字典控制器-根据字典编码获取字典数据", notes = "字典控制器-根据字典编码获取字典数据") + @RequestMapping(value = "/getDictItems/{dictCode}", method = RequestMethod.GET) + public Result> getDictItems(@PathVariable String dictCode, @RequestParam(value = "sign",required = false) String sign, HttpServletRequest request) { + log.info(" dictCode : "+ dictCode); + Result> result = new Result>(); + List ls = null; + try { + if(dictCode.indexOf(",")!=-1) { + //关联表字典(举例:sys_user,realname,id) + String[] params = dictCode.split(","); + + if(params.length<3) { + result.error500("字典Code格式不正确!"); + return result; + } + //SQL注入校验(只限制非法串改数据库) + final String[] sqlInjCheck = {params[0],params[1],params[2]}; + SqlInjectionUtil.filterContent(sqlInjCheck); + + if(params.length==4) { + //SQL注入校验(查询条件SQL 特殊check,此方法仅供此处使用) + SqlInjectionUtil.specialFilterContent(params[3]); + ls = sysDictService.queryTableDictItemsByCodeAndFilter(params[0],params[1],params[2],params[3]); + }else if (params.length==3) { + ls = sysDictService.queryTableDictItemsByCode(params[0],params[1],params[2]); + }else{ + result.error500("字典Code格式不正确!"); + return result; + } + }else { + //字典表 + ls = sysDictService.queryDictItemsByCode(dictCode); + } + + result.setSuccess(true); + result.setResult(ls); + log.debug(result.toString()); + } catch (Exception e) { + log.error(e.getMessage(),e); + result.error500("操作失败"); + return result; + } + + return result; + } + + /** + * 获取全部字典数据 + * + * @return + */ + @ApiOperation(value = "字典控制器-获取全部字典数据", notes = "字典控制器-获取全部字典数据") + @RequestMapping(value = "/queryAllDictItems", method = RequestMethod.GET) + public Result queryAllDictItems(HttpServletRequest request) { + Map> res = new HashMap>(); + res = sysDictService.queryAllDictItems(); + return Result.OK(res); + } + + /** + * 获取字典数据 + * @param dictCode + * @return + */ + @ApiOperation(value = "字典控制器-通过字典code和字典值key获取字典数据", notes = "字典控制器-通过字典code和字典值key获取字典数据") + @RequestMapping(value = "/getDictText/{dictCode}/{key}", method = RequestMethod.GET) + public Result getDictText(@PathVariable("dictCode") String dictCode, @PathVariable("key") String key) { + log.info(" dictCode : "+ dictCode); + Result result = new Result(); + String text = null; + try { + text = sysDictService.queryDictTextByKey(dictCode, key); + result.setSuccess(true); + result.setResult(text); + } catch (Exception e) { + log.error(e.getMessage(),e); + result.error500("操作失败"); + return result; + } + return result; + } + + /** + * 大数据量的字典表 走异步加载 即前端输入内容过滤数据 + * @param dictCode + * @return + */ + @ApiOperation(value = "字典控制器-通过字典code获取字典数据", notes = "字典控制器-通过字典code获取字典数据") + @RequestMapping(value = "/loadDict/{dictCode}", method = RequestMethod.GET) + public Result> loadDict(@PathVariable String dictCode, + @RequestParam(name="keyword") String keyword, + @RequestParam(value = "sign",required = false) String sign, + @RequestParam(value = "pageSize", required = false) Integer pageSize) { + log.info(" 加载字典表数据,加载关键字: "+ keyword); + Result> result = new Result>(); + List ls = null; + try { + if(dictCode.indexOf(",")!=-1) { + String[] params = dictCode.split(","); + if(params.length!=3) { + result.error500("字典Code格式不正确!"); + return result; + } + if(pageSize!=null){ + ls = sysDictService.queryLittleTableDictItems(params[0],params[1],params[2],keyword, pageSize); + }else{ + ls = sysDictService.queryTableDictItems(params[0],params[1],params[2],keyword); + } + result.setSuccess(true); + result.setResult(ls); + log.info(result.toString()); + }else { + result.error500("字典Code格式不正确!"); + } + } catch (Exception e) { + log.error(e.getMessage(),e); + result.error500("操作失败"); + return result; + } + + return result; + } + + /** + * 根据字典code加载字典text 返回 + */ + @ApiOperation(value = "字典控制器-根据字典code加载字典text", notes = "字典控制器-根据字典code加载字典text") + @RequestMapping(value = "/loadDictItem/{dictCode}", method = RequestMethod.GET) + public Result> loadDictItem(@PathVariable String dictCode, @RequestParam(name="key") String keys, @RequestParam(value = "sign",required = false) String sign, HttpServletRequest request) { + Result> result = new Result<>(); + try { + if(dictCode.indexOf(",")!=-1) { + String[] params = dictCode.split(","); + if(params.length!=3) { + result.error500("字典Code格式不正确!"); + return result; + } + List texts = sysDictService.queryTableDictByKeys(params[0], params[1], params[2], keys); + + result.setSuccess(true); + result.setResult(texts); + log.info(result.toString()); + }else { + result.error500("字典Code格式不正确!"); + } + } catch (Exception e) { + log.error(e.getMessage(),e); + result.error500("操作失败"); + return result; + } + + return result; + } + + /** + * 根据表名——显示字段-存储字段 pid 加载树形数据 + */ + @ApiOperation(value = "字典控制器-根据表名—显示字段-存储字段 pid 加载树形数据", notes = "字典控制器-根据表名—显示字段-存储字段 pid 加载树形数据") + @RequestMapping(value = "/loadTreeData", method = RequestMethod.GET) + public Result> loadTreeData(@RequestParam(name="pid") String pid, @RequestParam(name="pidField") String pidField, + @RequestParam(name="tableName") String tbname, + @RequestParam(name="text") String text, + @RequestParam(name="code") String code, + @RequestParam(name="hasChildField", required = false) String hasChildField, + @RequestParam(value = "sign", required = false) String sign, HttpServletRequest request) { + Result> result = new Result>(); + + // SQL注入漏洞 sign签名校验(表名,label字段,val字段,条件) + String dictCode = tbname +","+ text +","+ code; + SqlInjectionUtil.filterContent(dictCode); + List ls = sysDictService.queryTreeList(null, tbname, text, code, pidField, pid, hasChildField); + result.setSuccess(true); + result.setResult(ls); + return result; + } + + /** + * 查询后返回树型数据 + */ + @ApiOperation(value = "字典控制器-根据表名—显示字段-存储字段 加载树形数据", notes = "字典控制器-根据表名—显示字段-存储字段 加载树形数据") + @RequestMapping(value = "/queryAllTreeData", method = RequestMethod.GET) + public Result> queryAllTreeData(@RequestParam(name="pidField") String pidField, + @RequestParam(name="tableName") String tbname, + @RequestParam(name="text") String text, + @RequestParam(name="code") String code, + HttpServletRequest request) { + Result> result = new Result>(); + + // SQL注入漏洞 sign签名校验(表名,label字段,val字段,条件) + String dictCode = tbname +","+ text +","+ code; + SqlInjectionUtil.filterContent(dictCode); + List ls = sysDictService.queryAllTreeData(tbname, text, code, pidField); + result.setSuccess(true); + result.setResult(ls); + return result; + } + + /** + * @功能:新增 + * @param sysDict + * @return + */ + @ApiOperation(value = "字典控制器-新增字典", notes = "字典控制器-新增字典") + @RequiresRoles({"admin"}) + @RequestMapping(value = "/add", method = RequestMethod.POST) + public Result add(@RequestBody SysDict sysDict) { + Result result = new Result(); + try { + sysDict.setCreateTime(new Date()); + sysDict.setDelFlag(CommonConstant.DEL_FLAG_0); + sysDictService.save(sysDict); + result.success("保存成功!"); + } catch (Exception e) { + log.error(e.getMessage(),e); + result.error500("操作失败"); + } + return result; + } + + /** + * @功能:编辑 + * @param sysDict + * @return + */ + @ApiOperation(value = "字典控制器-编辑字典", notes = "字典控制器-编辑字典") + @RequiresRoles({"admin"}) + @RequestMapping(value = "/edit", method = RequestMethod.PUT) + public Result edit(@RequestBody SysDict sysDict) { + Result result = new Result(); + SysDict sysdict = sysDictService.getById(sysDict.getId()); + if(sysdict==null) { + result.error500("未找到对应实体"); + }else { + sysDict.setUpdateTime(new Date()); + boolean ok = sysDictService.updateById(sysDict); + if(ok) { + result.success("编辑成功!"); + } + } + return result; + } + + /** + * @功能:删除 + * @param id + * @return + */ + @ApiOperation(value = "字典控制器-删除字典", notes = "字典控制器-删除字典") + @RequiresRoles({"admin"}) + @DeleteMapping(value = "/delete") + @CacheEvict(value=CacheConstant.SYS_DICT_CACHE, allEntries=true) + public Result delete(@RequestParam(name="id",required=true) String id) { + Result result = new Result(); + boolean ok = sysDictService.removeById(id); + if(ok) { + result.success("删除成功!"); + }else{ + result.error500("删除失败!"); + } + return result; + } + + /** + * @功能:批量删除 + * @param ids + * @return + */ + @ApiOperation(value = "字典控制器-批量字典", notes = "字典控制器-批量字典") + @RequiresRoles({"admin"}) + @DeleteMapping(value = "/deleteBatch") + @CacheEvict(value= CacheConstant.SYS_DICT_CACHE, allEntries=true) + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + Result result = new Result(); + if(oConvertUtils.isEmpty(ids)) { + result.error500("参数不识别!"); + }else { + sysDictService.removeByIds(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } + + /** + * @功能:刷新缓存 + * @date 修改时间 2021.4.8 + * @return + */ + @RequestMapping(value = "/refleshCache") + public Result refleshCache() { + Result result = new Result(); + sysDictService.refreshCache(); + return result; + } + + /** + * 导出excel + * + * @param request + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(SysDict sysDict, HttpServletRequest request) { + // Step.1 组装查询条件 + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysDict, request.getParameterMap()); + //Step.2 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + List pageList = new ArrayList(); + + List sysDictList = sysDictService.list(queryWrapper); + for (SysDict dictMain : sysDictList) { + SysDictPage vo = new SysDictPage(); + BeanUtils.copyProperties(dictMain, vo); + // 查询机票 + List sysDictItemList = sysDictItemService.selectItemsByMainId(dictMain.getId()); + vo.setSysDictItemList(sysDictItemList); + pageList.add(vo); + } + + // 导出文件名称 + mv.addObject(NormalExcelConstants.FILE_NAME, "数据字典"); + // 注解对象Class + mv.addObject(NormalExcelConstants.CLASS, SysDictPage.class); + // 自定义表格参数 + LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("数据字典列表", "导出人:"+user.getRealname(), "数据字典")); + // 导出数据列表 + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } + + /** + * 通过excel导入数据 + * + * @param request + * @param + * @return + */ + @RequiresRoles({"admin"}) + @PostMapping(value = "/importExcel") + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(2); + params.setNeedSave(true); + try { + //导入Excel格式校验,看匹配的字段文本概率 + Boolean t = ExcelImportCheckUtil.check(file.getInputStream(), SysDictPage.class, params); + if(!t){ + throw new RuntimeException("导入Excel校验失败 !"); + } + List list = ExcelImportUtil.importExcel(file.getInputStream(), SysDictPage.class, params); + // 错误信息 + List errorMessage = new ArrayList<>(); + int successLines = 0, errorLines = 0; + for (int i=0;i< list.size();i++) { + SysDict po = new SysDict(); + BeanUtils.copyProperties(list.get(i), po); + po.setDelFlag(CommonConstant.DEL_FLAG_0); + try { + Integer integer = sysDictService.saveMain(po, list.get(i).getSysDictItemList()); + if(integer>0){ + successLines++; + }else{ + errorLines++; + int lineNumber = i + 1; + errorMessage.add("第 " + lineNumber + " 行:字典编码已经存在,忽略导入。"); + } + } catch (Exception e) { + errorLines++; + int lineNumber = i + 1; + errorMessage.add("第 " + lineNumber + " 行:字典编码已经存在,忽略导入。"); + } + } + return ImportExcelUtil.imporReturnRes(errorLines,successLines,errorMessage); + } catch (Exception e) { + log.error(e.getMessage(),e); + return Result.error("文件导入失败:"+e.getMessage()); + } finally { + try { + file.getInputStream().close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + return Result.error("文件导入失败!"); + } + + + /** + * 查询被删除的列表 + * @return + */ + @GetMapping(value = "/deleteList") + public Result> deleteList() { + Result> result = new Result>(); + List list = this.sysDictService.queryDeleteList(); + result.setSuccess(true); + result.setResult(list); + return result; + } + + /** + * 物理删除 + * @param id + * @return + */ + @DeleteMapping(value = "/deletePhysic/{id}") + public Result deletePhysic(@PathVariable String id) { + try { + sysDictService.deleteOneDictPhysically(id); + return Result.OK("删除成功!"); + } catch (Exception e) { + e.printStackTrace(); + return Result.error("删除失败!"); + } + } + + /** + * 取回 + * @param id + * @return + */ + @PutMapping(value = "/back/{id}") + public Result back(@PathVariable String id) { + try { + sysDictService.updateDictDelFlag(0,id); + return Result.OK("操作成功!"); + } catch (Exception e) { + e.printStackTrace(); + return Result.error("操作失败!"); + } + } + +} diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDictService.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDictService.java index 5e0f0a81..575a217a 100644 --- a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDictService.java +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDictService.java @@ -1,138 +1,145 @@ -package com.jero.modules.system.service; - -import java.util.List; -import java.util.Map; - -import com.jero.common.system.vo.DictModel; -import com.jero.common.system.vo.DictQuery; -import com.jero.modules.system.entity.SysDict; -import com.baomidou.mybatisplus.extension.service.IService; -import com.jero.modules.system.entity.SysDictItem; -import com.jero.modules.system.model.TreeSelectModel; - -/** - *

- * 字典表 服务类 - *

- * - * @Author zhangweijian - * @since 2018-12-28 - */ -public interface ISysDictService extends IService { - - public List queryDictItemsByCode(String code); - - public Map> queryAllDictItems(); - - @Deprecated - List queryTableDictItemsByCode(String table, String text, String code); - - @Deprecated - public List queryTableDictItemsByCodeAndFilter(String table, String text, String code, String filterSql); - - public String queryDictTextByKey(String code, String key); - - @Deprecated - String queryTableDictTextByKey(String table, String text, String code, String key); - - @Deprecated - List queryTableDictByKeys(String table, String text, String code, String keys); - - /** - * 根据字典类型删除关联表中其对应的数据 - * - * @param sysDict - * @return - */ - boolean deleteByDictId(SysDict sysDict); - - /** - * 添加一对多 - */ - public Integer saveMain(SysDict sysDict, List sysDictItemList); - - /** - * 查询所有部门 作为字典信息 id -->value,departName -->text - * @return - */ - public List queryAllDepartBackDictModel(); - - /** - * 查询所有用户 作为字典信息 username -->value,realname -->text - * @return - */ - public List queryAllUserBackDictModel(); - - /** - * 通过关键字查询字典表 - * @param table - * @param text - * @param code - * @param keyword - * @return - */ - @Deprecated - public List queryTableDictItems(String table, String text, String code,String keyword); - - /** - * 查询字典表数据 只查询前10条 - * @param table - * @param text - * @param code - * @param keyword - * @return - */ - public List queryLittleTableDictItems(String table, String text, String code,String keyword, int pageSize); - - /** - * 根据表名、显示字段名、存储字段名 查询树 - * @param table - * @param text - * @param code - * @param pidField - * @param pid - * @param hasChildField - * @return - */ - List queryTreeList(String query,String table, String text, String code, String pidField,String pid,String hasChildField); - - /** - * 根据表名、显示字段名、存储字段名 和查询条件拼接树结构 - * @param table - * @param text - * @param code - * @param pidField - * @return - */ - List queryAllTreeData(String table, String text, String code, String pidField); - - /** - * 真实删除 - * @param id - */ - public void deleteOneDictPhysically(String id); - - /** - * 修改delFlag - * @param delFlag - * @param id - */ - public void updateDictDelFlag(int delFlag,String id); - - /** - * 查询被逻辑删除的数据 - * @return - */ - public List queryDeleteList(); - - /** - * 分页查询 - * @param query - * @param pageSize - * @param pageNo - * @return - */ - @Deprecated - public List queryDictTablePageList(DictQuery query,int pageSize, int pageNo); - -} +package com.jero.modules.system.service; + +import java.util.List; +import java.util.Map; + +import com.jero.common.system.vo.DictModel; +import com.jero.common.system.vo.DictQuery; +import com.jero.modules.system.entity.SysDict; +import com.baomidou.mybatisplus.extension.service.IService; +import com.jero.modules.system.entity.SysDictItem; +import com.jero.modules.system.model.TreeSelectModel; + +/** + *

+ * 字典表 服务类 + *

+ * + * @Author zhangweijian + * @since 2018-12-28 + */ +public interface ISysDictService extends IService { + + public List queryDictItemsByCode(String code); + + public Map> queryAllDictItems(); + + @Deprecated + List queryTableDictItemsByCode(String table, String text, String code); + + @Deprecated + public List queryTableDictItemsByCodeAndFilter(String table, String text, String code, String filterSql); + + public String queryDictTextByKey(String code, String key); + + @Deprecated + String queryTableDictTextByKey(String table, String text, String code, String key); + + @Deprecated + List queryTableDictByKeys(String table, String text, String code, String keys); + + /** + * 根据字典类型删除关联表中其对应的数据 + * + * @param sysDict + * @return + */ + boolean deleteByDictId(SysDict sysDict); + + /** + * 添加一对多 + */ + public Integer saveMain(SysDict sysDict, List sysDictItemList); + + /** + * 查询所有部门 作为字典信息 id -->value,departName -->text + * @return + */ + public List queryAllDepartBackDictModel(); + + /** + * 查询所有用户 作为字典信息 username -->value,realname -->text + * @return + */ + public List queryAllUserBackDictModel(); + + /** + * 通过关键字查询字典表 + * @param table + * @param text + * @param code + * @param keyword + * @return + */ + @Deprecated + public List queryTableDictItems(String table, String text, String code,String keyword); + + /** + * 查询字典表数据 只查询前10条 + * @param table + * @param text + * @param code + * @param keyword + * @return + */ + public List queryLittleTableDictItems(String table, String text, String code,String keyword, int pageSize); + + /** + * 根据表名、显示字段名、存储字段名 查询树 + * @param table + * @param text + * @param code + * @param pidField + * @param pid + * @param hasChildField + * @return + */ + List queryTreeList(String query,String table, String text, String code, String pidField,String pid,String hasChildField); + + /** + * 根据表名、显示字段名、存储字段名 和查询条件拼接树结构 + * @param table + * @param text + * @param code + * @param pidField + * @return + */ + List queryAllTreeData(String table, String text, String code, String pidField); + + /** + * 真实删除 + * @param id + */ + public void deleteOneDictPhysically(String id); + + /** + * 修改delFlag + * @param delFlag + * @param id + */ + public void updateDictDelFlag(int delFlag,String id); + + /** + * 查询被逻辑删除的数据 + * @return + */ + public List queryDeleteList(); + + /** + * 分页查询 + * @param query + * @param pageSize + * @param pageNo + * @return + */ + @Deprecated + public List queryDictTablePageList(DictQuery query,int pageSize, int pageNo); + + /** + * 刷新dict缓存 + * @date 2021/4/8 9:06 + * @return void + */ + void refreshCache(); + +} diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDictServiceImpl.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDictServiceImpl.java index 4ba92636..1a96d51a 100644 --- a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDictServiceImpl.java +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDictServiceImpl.java @@ -1,290 +1,313 @@ -package com.jero.modules.system.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.extern.slf4j.Slf4j; -import com.jero.common.constant.CacheConstant; -import com.jero.common.constant.CommonConstant; -import com.jero.common.system.vo.DictModel; -import com.jero.common.system.vo.DictQuery; -import com.jero.common.util.oConvertUtils; -import com.jero.modules.system.entity.SysDict; -import com.jero.modules.system.entity.SysDictItem; -import com.jero.modules.system.mapper.SysDictItemMapper; -import com.jero.modules.system.mapper.SysDictMapper; -import com.jero.modules.system.model.TreeSelectModel; -import com.jero.modules.system.service.ISysDictService; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - *

- * 字典表 服务实现类 - *

- * - * @Author zhangweijian - * @since 2018-12-28 - */ -@Service -@Slf4j -public class SysDictServiceImpl extends ServiceImpl implements ISysDictService { - - @Autowired - private SysDictMapper sysDictMapper; - @Autowired - private SysDictItemMapper sysDictItemMapper; - - /** - * 通过查询指定code 获取字典 - * @param code - * @return - */ - @Override - @Cacheable(value = CacheConstant.SYS_DICT_CACHE,key = "#code") - public List queryDictItemsByCode(String code) { - log.debug("无缓存dictCache的时候调用这里!"); - return sysDictMapper.queryDictItemsByCode(code); - } - - @Override - public Map> queryAllDictItems() { - Map> res = new HashMap>(); - List ls = sysDictMapper.selectList(null); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); - queryWrapper.eq(SysDictItem::getStatus, 1); - queryWrapper.orderByAsc(SysDictItem::getSortOrder); - List sysDictItemList = sysDictItemMapper.selectList(queryWrapper); - - for (SysDict d : ls) { - List dictModelList = sysDictItemList.stream().filter(s -> d.getId().equals(s.getDictId())).map(item -> { - DictModel dictModel = new DictModel(); - dictModel.setText(item.getItemText()); - dictModel.setValue(item.getItemValue()); - return dictModel; - }).collect(Collectors.toList()); - res.put(d.getDictCode(), dictModelList); - } - log.debug("-------登录加载系统字典-----" + res.toString()); - return res; - } - - /** - * 通过查询指定code 获取字典值text - * @param code - * @param key - * @return - */ - - @Override - @Cacheable(value = CacheConstant.SYS_DICT_CACHE,key = "#code+':'+#key") - public String queryDictTextByKey(String code, String key) { - log.debug("无缓存dictText的时候调用这里!"); - return sysDictMapper.queryDictTextByKey(code, key); - } - - /** - * 通过查询指定table的 text code 获取字典 - * dictTableCache采用redis缓存有效期10分钟 - * @param table - * @param text - * @param code - * @return - */ - @Override - //@Cacheable(value = CacheConstant.SYS_DICT_TABLE_CACHE) - public List queryTableDictItemsByCode(String table, String text, String code) { - log.debug("无缓存dictTableList的时候调用这里!"); - return sysDictMapper.queryTableDictItemsByCode(table,text,code); - } - - @Override - public List queryTableDictItemsByCodeAndFilter(String table, String text, String code, String filterSql) { - log.debug("无缓存dictTableList的时候调用这里!"); - return sysDictMapper.queryTableDictItemsByCodeAndFilter(table,text,code,filterSql); - } - - /** - * 通过查询指定table的 text code 获取字典值text - * dictTableCache采用redis缓存有效期10分钟 - * @param table - * @param text - * @param code - * @param key - * @return - */ - @Override - @Cacheable(value = CacheConstant.SYS_DICT_TABLE_CACHE) - public String queryTableDictTextByKey(String table,String text,String code, String key) { - log.debug("无缓存dictTable的时候调用这里!"); - return sysDictMapper.queryTableDictTextByKey(table,text,code,key); - } - - /** - * 通过查询指定table的 text code 获取字典,包含text和value - * dictTableCache采用redis缓存有效期10分钟 - * @param table - * @param text - * @param code - * @param keys (逗号分隔) - * @return - */ - @Override - //update-begin--Author:lvdandan Date:20201204 for:JT-36【online】树形列表bug修改后,还是显示原来值 暂时去掉缓存 - //@Cacheable(value = CacheConstant.SYS_DICT_TABLE_BY_KEYS_CACHE) - //update-end--Author:lvdandan Date:20201204 for:JT-36【online】树形列表bug修改后,还是显示原来值 暂时去掉缓存 - public List queryTableDictByKeys(String table, String text, String code, String keys) { - if(oConvertUtils.isEmpty(keys)){ - return null; - } - String[] keyArray = keys.split(","); - List dicts = sysDictMapper.queryTableDictByKeys(table, text, code, keyArray); - List texts = new ArrayList<>(dicts.size()); - // 查询出来的顺序可能是乱的,需要排个序 - for (String key : keyArray) { - for (DictModel dict : dicts) { - if (key.equals(dict.getValue())) { - texts.add(dict.getText()); - break; - } - } - } - return texts; - } - - /** - * 根据字典类型id删除关联表中其对应的数据 - */ - @Override - public boolean deleteByDictId(SysDict sysDict) { - sysDict.setDelFlag(CommonConstant.DEL_FLAG_1); - return this.updateById(sysDict); - } - - @Override - @Transactional - public Integer saveMain(SysDict sysDict, List sysDictItemList) { - int insert=0; - try{ - insert = sysDictMapper.insert(sysDict); - if (sysDictItemList != null) { - for (SysDictItem entity : sysDictItemList) { - entity.setDictId(sysDict.getId()); - entity.setStatus(1); - sysDictItemMapper.insert(entity); - } - } - }catch(Exception e){ - return insert; - } - return insert; - } - - @Override - public List queryAllDepartBackDictModel() { - return baseMapper.queryAllDepartBackDictModel(); - } - - @Override - public List queryAllUserBackDictModel() { - return baseMapper.queryAllUserBackDictModel(); - } - - @Override - public List queryTableDictItems(String table, String text, String code, String keyword) { - return baseMapper.queryTableDictItems(table, text, code, "%"+keyword+"%"); - } - - @Override - public List queryLittleTableDictItems(String table, String text, String code, String keyword, int pageSize) { - Page page = new Page(1, pageSize); - IPage pageList = baseMapper.queryTableDictItems(page, table, text, code, "%"+keyword+"%"); - return pageList.getRecords(); - } - - @Override - public List queryTreeList(String query,String table, String text, String code, String pidField, String pid, String hasChildField) { - return baseMapper.queryTreeList(query, table, text, code, pidField, pid,hasChildField); - } - - @Override - public List queryAllTreeData(String table, String text, String code, String pidField) { - // 先查出要查询的数据 - List serachTreeNode = this.baseMapper.queryTreeDataByKeyword(table, text, code, pidField); - - // 构建一个HashMap,按ID为key存储全部查询出的数据结构 - HashMap resultMap = new HashMap<>(); - for (TreeSelectModel treeSelectModel : serachTreeNode){ - resultMap.put(treeSelectModel.getKey(), treeSelectModel); - - TreeSelectModel copyTreeSelectModel = treeSelectModel; - // 叠加的查询父节点 - while (StringUtils.isNotEmpty(copyTreeSelectModel.getParentId())){ - if (resultMap.get(copyTreeSelectModel.getParentId()) != null){ - break; - } - - TreeSelectModel newTreeSelectModel = this.baseMapper.queryTreeDataItemById(copyTreeSelectModel.getParentId(), table, text, code, pidField); - if(newTreeSelectModel == null){ - break; - } - - resultMap.put(newTreeSelectModel.getKey(), newTreeSelectModel); - - copyTreeSelectModel = newTreeSelectModel; - } - } - System.out.println("aaa"); - - // 遍历map里全部的节点,取出父节点放入list,并循环添加他的子节点 - List treeNodeList = new ArrayList<>(); - for (String key : resultMap.keySet()){ - TreeSelectModel curTreeSelectModel = resultMap.get(key); - if (StringUtils.isEmpty(curTreeSelectModel.getParentId())){ - treeNodeList.add(curTreeSelectModel); - } else { - // 如果有父节点,则找出自己的父节点,把自己添加进父节点的children属性里 - TreeSelectModel existParentNode = resultMap.get(curTreeSelectModel.getParentId()); - if (existParentNode != null){ - existParentNode.getChildren().add(curTreeSelectModel); - } - } - } - - return treeNodeList; - } - - @Override - public void deleteOneDictPhysically(String id) { - this.baseMapper.deleteOneById(id); - this.sysDictItemMapper.delete(new LambdaQueryWrapper().eq(SysDictItem::getDictId,id)); - } - - @Override - public void updateDictDelFlag(int delFlag, String id) { - baseMapper.updateDictDelFlag(delFlag,id); - } - - @Override - public List queryDeleteList() { - return baseMapper.queryDeleteList(); - } - - @Override - public List queryDictTablePageList(DictQuery query, int pageSize, int pageNo) { - Page page = new Page(pageNo,pageSize,false); - Page pageList = baseMapper.queryDictTablePageList(page, query); - return pageList.getRecords(); - } -} +package com.jero.modules.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import com.jero.common.constant.CacheConstant; +import com.jero.common.constant.CommonConstant; +import com.jero.common.system.vo.DictModel; +import com.jero.common.system.vo.DictQuery; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SysDict; +import com.jero.modules.system.entity.SysDictItem; +import com.jero.modules.system.mapper.SysDictItemMapper; +import com.jero.modules.system.mapper.SysDictMapper; +import com.jero.modules.system.model.TreeSelectModel; +import com.jero.modules.system.service.ISysDictService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + *

+ * 字典表 服务实现类 + *

+ * + * @Author zhangweijian + * @since 2018-12-28 + */ +@Service +@Slf4j +public class SysDictServiceImpl extends ServiceImpl implements ISysDictService { + + @Autowired + private SysDictMapper sysDictMapper; + @Autowired + private SysDictItemMapper sysDictItemMapper; + @Resource + private RedisTemplate redisTemplate; + + /** + * 通过查询指定code 获取字典 + * @param code + * @return + */ + @Override + @Cacheable(value = CacheConstant.SYS_DICT_CACHE,key = "#code") + public List queryDictItemsByCode(String code) { + log.debug("无缓存dictCache的时候调用这里!"); + return sysDictMapper.queryDictItemsByCode(code); + } + + @Override + public Map> queryAllDictItems() { + Map> res = new HashMap>(); + List ls = sysDictMapper.selectList(null); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(SysDictItem::getStatus, 1); + queryWrapper.orderByAsc(SysDictItem::getSortOrder); + List sysDictItemList = sysDictItemMapper.selectList(queryWrapper); + + for (SysDict d : ls) { + List dictModelList = sysDictItemList.stream().filter(s -> d.getId().equals(s.getDictId())).map(item -> { + DictModel dictModel = new DictModel(); + dictModel.setText(item.getItemText()); + dictModel.setValue(item.getItemValue()); + return dictModel; + }).collect(Collectors.toList()); + res.put(d.getDictCode(), dictModelList); + } + log.debug("-------登录加载系统字典-----" + res.toString()); + return res; + } + + /** + * 通过查询指定code 获取字典值text + * @param code + * @param key + * @return + */ + + @Override + @Cacheable(value = CacheConstant.SYS_DICT_CACHE,key = "#code+':'+#key") + public String queryDictTextByKey(String code, String key) { + log.debug("无缓存dictText的时候调用这里!"); + return sysDictMapper.queryDictTextByKey(code, key); + } + + /** + * 通过查询指定table的 text code 获取字典 + * dictTableCache采用redis缓存有效期10分钟 + * @param table + * @param text + * @param code + * @return + */ + @Override + //@Cacheable(value = CacheConstant.SYS_DICT_TABLE_CACHE) + public List queryTableDictItemsByCode(String table, String text, String code) { + log.debug("无缓存dictTableList的时候调用这里!"); + return sysDictMapper.queryTableDictItemsByCode(table,text,code); + } + + @Override + public List queryTableDictItemsByCodeAndFilter(String table, String text, String code, String filterSql) { + log.debug("无缓存dictTableList的时候调用这里!"); + return sysDictMapper.queryTableDictItemsByCodeAndFilter(table,text,code,filterSql); + } + + /** + * 通过查询指定table的 text code 获取字典值text + * dictTableCache采用redis缓存有效期10分钟 + * @param table + * @param text + * @param code + * @param key + * @return + */ + @Override + @Cacheable(value = CacheConstant.SYS_DICT_TABLE_CACHE) + public String queryTableDictTextByKey(String table,String text,String code, String key) { + log.debug("无缓存dictTable的时候调用这里!"); + return sysDictMapper.queryTableDictTextByKey(table,text,code,key); + } + + /** + * 通过查询指定table的 text code 获取字典,包含text和value + * dictTableCache采用redis缓存有效期10分钟 + * @param table + * @param text + * @param code + * @param keys (逗号分隔) + * @return + */ + @Override + //update-begin--Author:lvdandan Date:20201204 for:JT-36【online】树形列表bug修改后,还是显示原来值 暂时去掉缓存 + //@Cacheable(value = CacheConstant.SYS_DICT_TABLE_BY_KEYS_CACHE) + //update-end--Author:lvdandan Date:20201204 for:JT-36【online】树形列表bug修改后,还是显示原来值 暂时去掉缓存 + public List queryTableDictByKeys(String table, String text, String code, String keys) { + if(oConvertUtils.isEmpty(keys)){ + return null; + } + String[] keyArray = keys.split(","); + List dicts = sysDictMapper.queryTableDictByKeys(table, text, code, keyArray); + List texts = new ArrayList<>(dicts.size()); + // 查询出来的顺序可能是乱的,需要排个序 + for (String key : keyArray) { + for (DictModel dict : dicts) { + if (key.equals(dict.getValue())) { + texts.add(dict.getText()); + break; + } + } + } + return texts; + } + + /** + * 根据字典类型id删除关联表中其对应的数据 + */ + @Override + public boolean deleteByDictId(SysDict sysDict) { + sysDict.setDelFlag(CommonConstant.DEL_FLAG_1); + return this.updateById(sysDict); + } + + @Override + @Transactional + public Integer saveMain(SysDict sysDict, List sysDictItemList) { + int insert=0; + try{ + insert = sysDictMapper.insert(sysDict); + if (sysDictItemList != null) { + for (SysDictItem entity : sysDictItemList) { + entity.setDictId(sysDict.getId()); + entity.setStatus(1); + sysDictItemMapper.insert(entity); + } + } + }catch(Exception e){ + return insert; + } + return insert; + } + + @Override + public List queryAllDepartBackDictModel() { + return baseMapper.queryAllDepartBackDictModel(); + } + + @Override + public List queryAllUserBackDictModel() { + return baseMapper.queryAllUserBackDictModel(); + } + + @Override + public List queryTableDictItems(String table, String text, String code, String keyword) { + return baseMapper.queryTableDictItems(table, text, code, "%"+keyword+"%"); + } + + @Override + public List queryLittleTableDictItems(String table, String text, String code, String keyword, int pageSize) { + Page page = new Page(1, pageSize); + IPage pageList = baseMapper.queryTableDictItems(page, table, text, code, "%"+keyword+"%"); + return pageList.getRecords(); + } + + @Override + public List queryTreeList(String query,String table, String text, String code, String pidField, String pid, String hasChildField) { + return baseMapper.queryTreeList(query, table, text, code, pidField, pid,hasChildField); + } + + @Override + public List queryAllTreeData(String table, String text, String code, String pidField) { + // 先查出要查询的数据 + List serachTreeNode = this.baseMapper.queryTreeDataByKeyword(table, text, code, pidField); + + // 构建一个HashMap,按ID为key存储全部查询出的数据结构 + HashMap resultMap = new HashMap<>(); + for (TreeSelectModel treeSelectModel : serachTreeNode){ + resultMap.put(treeSelectModel.getKey(), treeSelectModel); + + TreeSelectModel copyTreeSelectModel = treeSelectModel; + // 叠加的查询父节点 + while (StringUtils.isNotEmpty(copyTreeSelectModel.getParentId())){ + if (resultMap.get(copyTreeSelectModel.getParentId()) != null){ + break; + } + + TreeSelectModel newTreeSelectModel = this.baseMapper.queryTreeDataItemById(copyTreeSelectModel.getParentId(), table, text, code, pidField); + if(newTreeSelectModel == null){ + break; + } + + resultMap.put(newTreeSelectModel.getKey(), newTreeSelectModel); + + copyTreeSelectModel = newTreeSelectModel; + } + } + System.out.println("aaa"); + + // 遍历map里全部的节点,取出父节点放入list,并循环添加他的子节点 + List treeNodeList = new ArrayList<>(); + for (String key : resultMap.keySet()){ + TreeSelectModel curTreeSelectModel = resultMap.get(key); + if (StringUtils.isEmpty(curTreeSelectModel.getParentId())){ + treeNodeList.add(curTreeSelectModel); + } else { + // 如果有父节点,则找出自己的父节点,把自己添加进父节点的children属性里 + TreeSelectModel existParentNode = resultMap.get(curTreeSelectModel.getParentId()); + if (existParentNode != null){ + existParentNode.getChildren().add(curTreeSelectModel); + } + } + } + + return treeNodeList; + } + + @Override + public void deleteOneDictPhysically(String id) { + this.baseMapper.deleteOneById(id); + this.sysDictItemMapper.delete(new LambdaQueryWrapper().eq(SysDictItem::getDictId,id)); + } + + @Override + public void updateDictDelFlag(int delFlag, String id) { + baseMapper.updateDictDelFlag(delFlag,id); + } + + @Override + public List queryDeleteList() { + return baseMapper.queryDeleteList(); + } + + @Override + public List queryDictTablePageList(DictQuery query, int pageSize, int pageNo) { + Page page = new Page(pageNo,pageSize,false); + Page pageList = baseMapper.queryDictTablePageList(page, query); + return pageList.getRecords(); + } + /** + * 刷新dict缓存 + * @date 2021/4/8 9:07 + * @param + * @return void + */ + @Override + public void refreshCache() { + //清空字典缓存 + Set keys = redisTemplate.keys(CacheConstant.SYS_DICT_CACHE + "*"); + Set keys2 = redisTemplate.keys(CacheConstant.SYS_DICT_TABLE_CACHE + "*"); + Set keys3 = redisTemplate.keys(CacheConstant.SYS_DEPARTS_CACHE + "*"); + Set keys4 = redisTemplate.keys(CacheConstant.SYS_DEPART_IDS_CACHE + "*"); + Set keys5 = redisTemplate.keys( "jmreport:cache:dict*"); + Set keys6 = redisTemplate.keys( "jmreport:cache:dictTable*"); + redisTemplate.delete(keys); + redisTemplate.delete(keys2); + redisTemplate.delete(keys3); + redisTemplate.delete(keys4); + redisTemplate.delete(keys5); + redisTemplate.delete(keys6); + } +}