lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/SysCategoryController.java
@@ -5,15 +5,15 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import liquibase.pro.packaged.Q; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.exception.JeecgBootException; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.vo.DictModel; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.ImportExcelUtil; import org.jeecg.common.util.SqlInjectionUtil; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.system.entity.SysCategory; @@ -33,7 +33,10 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.*; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** @@ -56,6 +59,7 @@ /** * 分页列表查询 * * @param sysCategory * @param pageNo * @param pageSize @@ -94,7 +98,9 @@ @GetMapping(value = "/childList") public Result<List<SysCategory>> queryPageList(SysCategory sysCategory,HttpServletRequest req) { Result<List<SysCategory>> result = new Result<List<SysCategory>>(); QueryWrapper<SysCategory> queryWrapper = QueryGenerator.initQueryWrapper(sysCategory, req.getParameterMap()); QueryWrapper<SysCategory> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("pid", sysCategory.getPid()); queryWrapper.orderByAsc("code"); List<SysCategory> list = sysCategoryService.list(queryWrapper); result.setSuccess(true); result.setResult(list); @@ -104,42 +110,35 @@ /** * 添加 * * @param sysCategory * @return */ @PostMapping(value = "/add") public Result<SysCategory> add(@RequestBody SysCategory sysCategory) { Result<SysCategory> result = new Result<SysCategory>(); try { sysCategoryService.addSysCategory(sysCategory); result.success("添加成功!"); } catch (Exception e) { log.error(e.getMessage(),e); result.error500("操作失败"); } return result; } /** * 编辑 * * @param sysCategory * @return */ @RequestMapping(value = "/edit", method = { RequestMethod.PUT,RequestMethod.POST }) public Result<SysCategory> edit(@RequestBody SysCategory sysCategory) { Result<SysCategory> result = new Result<SysCategory>(); SysCategory sysCategoryEntity = sysCategoryService.getById(sysCategory.getId()); if(sysCategoryEntity==null) { result.error500("未找到对应实体"); }else { sysCategoryService.updateSysCategory(sysCategory); result.success("修改成功!"); } return result; } /** * 通过id删除 * * @param id * @return */ @@ -159,6 +158,7 @@ /** * 批量删除 * * @param ids * @return */ @@ -176,6 +176,7 @@ /** * 通过id查询 * * @param id * @return */ @@ -200,8 +201,7 @@ @RequestMapping(value = "/exportXls") public ModelAndView exportXls(HttpServletRequest request, SysCategory sysCategory) { // Step.1 组装查询条件查询数据 QueryWrapper<SysCategory> queryWrapper = QueryGenerator.initQueryWrapper(sysCategory, request.getParameterMap()); List<SysCategory> pageList = sysCategoryService.list(queryWrapper); List<SysCategory> pageList = sysCategoryService.listByParams(sysCategory); // Step.2 AutoPoi 导出Excel ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); // 过滤选中数据 @@ -234,63 +234,31 @@ Map<String, MultipartFile> fileMap = multipartRequest.getFileMap(); // 错误信息 List<String> errorMessage = new ArrayList<>(); int successLines = 0, errorLines = 0; for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) { // 获取上传文件对象 MultipartFile file = entity.getValue(); ImportParams params = new ImportParams(); params.setTitleRows(2); params.setTitleRows(0); params.setHeadRows(1); params.setNeedSave(true); try { List<SysCategory> listSysCategorys = ExcelImportUtil.importExcel(file.getInputStream(), SysCategory.class, params); //按照编码长度排序 Collections.sort(listSysCategorys); log.info("排序后的list====>",listSysCategorys); for (int i = 0; i < listSysCategorys.size(); i++) { SysCategory sysCategoryExcel = listSysCategorys.get(i); String code = sysCategoryExcel.getCode(); if(code.length()>3){ String pCode = sysCategoryExcel.getCode().substring(0,code.length()-3); log.info("pCode====>",pCode); String pId=sysCategoryService.queryIdByCode(pCode); log.info("pId====>",pId); if(StringUtils.isNotBlank(pId)){ sysCategoryExcel.setPid(pId); } }else{ sysCategoryExcel.setPid("0"); } try { sysCategoryService.save(sysCategoryExcel); successLines++; } catch (Exception e) { errorLines++; String message = e.getMessage().toLowerCase(); int lineNumber = i + 1; // 通过索引名判断出错信息 if (message.contains(CommonConstant.SQL_INDEX_UNIQ_CATEGORY_CODE)) { errorMessage.add("第 " + lineNumber + " 行:分类编码已经存在,忽略导入。"); } else { errorMessage.add("第 " + lineNumber + " 行:未知错误,忽略导入"); log.error(e.getMessage(), e); } } //组装树结构 List<SysCategory> treeNodes = buildTree(listSysCategorys); for (SysCategory sysCategory : treeNodes) { sysCategoryService.deepAdd(sysCategory, errorMessage); } } catch (Exception e) { errorMessage.add("发生异常:" + e.getMessage()); log.error(e.getMessage(), e); } finally { try { file.getInputStream().close(); } catch (IOException e) { e.printStackTrace(); } catch (IOException ignored) { } } } return ImportExcelUtil.imporReturnRes(errorLines,successLines,errorMessage); return Result.ok("导入成功"); } /** @@ -381,6 +349,7 @@ /** * 校验编码 * * @param pid * @param code * @return @@ -388,23 +357,24 @@ @GetMapping(value = "/checkCode") public Result<?> checkCode(@RequestParam(name="pid",required = false) String pid,@RequestParam(name="code",required = false) String code) { if(oConvertUtils.isEmpty(code)){ return Result.error("错误,类型编码为空!"); return Result.error("错误,分类编码为空!"); } if(oConvertUtils.isEmpty(pid)){ SysCategory parent = sysCategoryService.getById(pid); String rootCode = null; if (parent != null) { rootCode = parent.getRootCode(); } SysCategory original = sysCategoryService.getByCodeAndRootCode(code, rootCode); if (original != null) { return Result.error("编码已存在,请重新输入!"); } return Result.ok(); } SysCategory parent = this.sysCategoryService.getById(pid); if(code.startsWith(parent.getCode())){ return Result.ok(); }else{ return Result.error("编码不符合规范,须以\""+parent.getCode()+"\"开头!"); } } /** * 分类字典树控件 加载节点 * * @param pid * @param pcode * @param condition @@ -467,6 +437,7 @@ /** * [列表页面]加载分类字典数据 用于值的替换 * * @param code * @return */ @@ -494,6 +465,7 @@ /** * 根据父级id批量查询子节点 * * @param parentIds * @return */ @@ -514,4 +486,32 @@ } /** * 组装 树型结构 * * @param list * @return */ private List<SysCategory> buildTree(List<SysCategory> list) { //根节点 List<SysCategory> rootList = new ArrayList<>(); //节点 Map Map<String, SysCategory> nodeMap = list.stream().collect(Collectors.toMap(SysCategory::getCode, node -> node)); for (SysCategory node : list) { if (StringUtils.isBlank(node.getParentCode()) || ISysCategoryService.ROOT_PID_VALUE.equals(node.getParentCode())) { rootList.add(node); } else { SysCategory parent = nodeMap.get(node.getParentCode()); if (parent == null) { throw new JeecgBootException("父节点不存在:" + node.getParentCode()); } parent.addChild(node); } } return rootList; } } lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysCategory.java
@@ -1,6 +1,7 @@ package org.jeecg.modules.system.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; @@ -9,6 +10,8 @@ import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.util.ArrayList; import java.util.List; /** * @Description: 分类字典 @@ -18,49 +21,82 @@ */ @Data @TableName("sys_category") public class SysCategory implements Serializable,Comparable<SysCategory>{ public class SysCategory implements Serializable { private static final long serialVersionUID = 1L; /**主键*/ /** * 主键 */ @TableId(type = IdType.ASSIGN_ID) private java.lang.String id; /**父级节点*/ private java.lang.String pid; /**类型名称*/ @Excel(name = "类型名称", width = 15) private java.lang.String name; /**类型编码*/ @Excel(name = "类型编码", width = 15) private java.lang.String code; /**创建人*/ private java.lang.String createBy; /**创建日期*/ private String id; /** * 父级节点 */ private String pid; /** * 类型编码 */ @Excel(name = "分类编码", width = 15, orderNum = "1") private String code; /** * 类型名称 */ @Excel(name = "分类名称", width = 15, orderNum = "2") private String name; /** * 创建人 */ private String createBy; /** * 创建日期 */ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private java.util.Date createTime; /**更新人*/ private java.lang.String updateBy; /**更新日期*/ /** * 更新人 */ private String updateBy; /** * 更新日期 */ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private java.util.Date updateTime; /**所属部门*/ private java.lang.String sysOrgCode; /**是否有子节点*/ @Excel(name = "是否有子节点(1:有)", width = 15) private java.lang.String hasChild; /** * 所属部门 */ private String sysOrgCode; /** * 是否有子节点 */ private String hasChild; /** * 根节点编码 */ @Excel(name = "根节点编码", width = 15, orderNum = "4") private String rootCode; /** * 所有父节点ID */ private String parentIds; @Override public int compareTo(SysCategory o) { //比较条件我们定的是按照code的长度升序 // <0:当前对象比传入对象小。 // =0:当前对象等于传入对象。 // >0:当前对象比传入对象大。 int s = this.code.length() - o.code.length(); return s; } @TableField(exist = false) @Excel(name = "父节点编码", width = 15, orderNum = "3") private String parentCode; @TableField(exist = false) private List<SysCategory> children; @Override public String toString() { return "SysCategory [code=" + code + ", name=" + name + "]"; } public void addChild(SysCategory node) { if (children == null) { children = new ArrayList<>(); } children.add(node); } } lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysCategoryMapper.java
@@ -3,6 +3,8 @@ import java.util.List; import java.util.Map; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.jeecg.modules.system.entity.SysCategory; @@ -35,4 +37,5 @@ public String queryIdByCode(@Param("code") String code); List<SysCategory> listByParams(@Param(Constants.WRAPPER) QueryWrapper<SysCategory> queryWrapper); } lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysCategoryMapper.xml
@@ -32,6 +32,13 @@ </if> </if> </select> <select id="listByParams" resultType="org.jeecg.modules.system.entity.SysCategory"> select t.*, p.code as parentCode from sys_category t left join sys_category p on t.pid = p.id ${ew.customSqlSegment} </select> </mapper> lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysCategoryService.java
@@ -16,58 +16,67 @@ */ public interface ISysCategoryService extends IService<SysCategory> { /**根节点父ID的值*/ public static final String ROOT_PID_VALUE = "0"; /** * 根节点父ID的值 */ String ROOT_PID_VALUE = "0"; /** * 存在子节点 */ public static final String HAS_CHILD = "1"; String HAS_CHILD = "1"; /** * 添加分类字典 * * @param sysCategory */ void addSysCategory(SysCategory sysCategory); /** * 修改分类字典 * * @param sysCategory */ void updateSysCategory(SysCategory sysCategory); /** * 根据父级编码加载分类字典的数据 * * @param pcode * @return * @throws JeecgBootException */ public List<TreeSelectModel> queryListByCode(String pcode) throws JeecgBootException; List<TreeSelectModel> queryListByCode(String pcode) throws JeecgBootException; /** * 根据pid查询子节点集合 * * @param pid * @return */ public List<TreeSelectModel> queryListByPid(String pid); List<TreeSelectModel> queryListByPid(String pid); /** * 根据pid查询子节点集合,支持查询条件 * * @param pid * @param condition * @return */ public List<TreeSelectModel> queryListByPid(String pid, Map<String,String> condition); List<TreeSelectModel> queryListByPid(String pid, Map<String, String> condition); /** * 根据code查询id * * @param code * @return */ public String queryIdByCode(String code); String queryIdByCode(String code); /** * 删除节点时同时删除子节点及修改父级节点 * * @param ids */ void deleteSysCategory(String ids); @@ -89,4 +98,26 @@ */ List<String> loadDictItem(String ids, boolean delNotExist); /** * 加载所有分类字典 * * @param query * @return */ List<SysCategory> listByParams(SysCategory query); /** * 递归添加 * * @param sysCategory */ void deepAdd(SysCategory sysCategory, List<String> errorMessage); /** * 取某个节点下的编码 * @param code * @param rootCode * @return */ SysCategory getByCodeAndRootCode(String code, String rootCode); } lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysCategoryServiceImpl.java
@@ -1,15 +1,14 @@ package org.jeecg.modules.system.service.impl; import com.alibaba.fastjson.JSONObject; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.FillRuleConstant; import org.apache.commons.lang3.StringUtils; import org.jeecg.common.constant.SymbolConstant; import org.jeecg.common.exception.JeecgBootException; import org.jeecg.common.util.FillRuleUtil; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.system.entity.SysCategory; import org.jeecg.modules.system.mapper.SysCategoryMapper; @@ -18,10 +17,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; /** @@ -33,47 +30,66 @@ @Service public class SysCategoryServiceImpl extends ServiceImpl<SysCategoryMapper, SysCategory> implements ISysCategoryService { @Resource private SysCategoryMapper sysCategoryMapper; @Override @Transactional(rollbackFor = Exception.class) public void addSysCategory(SysCategory sysCategory) { String categoryCode = ""; String categoryPid = ISysCategoryService.ROOT_PID_VALUE; String parentCode = null; if(oConvertUtils.isNotEmpty(sysCategory.getPid())){ categoryPid = sysCategory.getPid(); //PID 不是根节点 说明需要设置父节点 hasChild 为1 if(!ISysCategoryService.ROOT_PID_VALUE.equals(categoryPid)){ SysCategory parent = baseMapper.selectById(categoryPid); parentCode = parent.getCode(); if(parent!=null && !ISysCategoryService.HAS_CHILD.equals(parent.getHasChild())){ //修改字典分类 编码为手动输入 if (StringUtils.isNotBlank(sysCategory.getPid())) { SysCategory parent = sysCategoryMapper.selectById(sysCategory.getPid()); if (parent == null) { //父节点不存在 默认为根节点 throw new JeecgBootException("父节点不存在,请重新添加!"); } else { //校验编码唯一 SysCategory original = getByCodeAndRootCode(sysCategory.getCode(), parent.getRootCode()); if (original != null) { throw new JeecgBootException("分类编码已存在,请修改后重试!"); } if (ISysCategoryService.HAS_CHILD.equals(parent.getHasChild())) { parent.setHasChild(ISysCategoryService.HAS_CHILD); baseMapper.updateById(parent); sysCategoryMapper.updateById(parent); } sysCategory.setRootCode(parent.getRootCode()); String parentIds = parent.getParentIds() == null ? parent.getId() : (parent.getParentIds() + "," + parent.getId()); sysCategory.setParentIds(parentIds); } } else { //校验编码唯一 SysCategory original = getByCodeAndRootCode(sysCategory.getCode(), null); if (original != null) { throw new JeecgBootException("分类编码已存在,请修改后重试!"); } //update-begin--Author:baihailong Date:20191209 for:分类字典编码规则生成器做成公用配置 JSONObject formData = new JSONObject(); formData.put("pid",categoryPid); categoryCode = (String) FillRuleUtil.executeRule(FillRuleConstant.CATEGORY,formData); //update-end--Author:baihailong Date:20191209 for:分类字典编码规则生成器做成公用配置 sysCategory.setCode(categoryCode); sysCategory.setPid(categoryPid); baseMapper.insert(sysCategory); //父节点不存在 默认为根节点 sysCategory.setPid(ISysCategoryService.ROOT_PID_VALUE); sysCategory.setRootCode(sysCategory.getCode()); sysCategory.setParentIds(null); } sysCategoryMapper.insert(sysCategory); } @Override @Transactional(rollbackFor = Exception.class) public void updateSysCategory(SysCategory sysCategory) { SysCategory entity = sysCategoryMapper.selectById(sysCategory.getId()); if (entity == null) { throw new JeecgBootException("编辑的数据不存在,请刷新重试!"); } if(oConvertUtils.isEmpty(sysCategory.getPid())){ sysCategory.setPid(ISysCategoryService.ROOT_PID_VALUE); }else{ //如果当前节点父ID不为空 则设置父节点的hasChild 为1 SysCategory parent = baseMapper.selectById(sysCategory.getPid()); SysCategory parent = sysCategoryMapper.selectById(sysCategory.getPid()); if(parent!=null && !ISysCategoryService.HAS_CHILD.equals(parent.getHasChild())){ parent.setHasChild(ISysCategoryService.HAS_CHILD); baseMapper.updateById(parent); sysCategoryMapper.updateById(parent); } else { sysCategory.setPid(ISysCategoryService.ROOT_PID_VALUE); } } baseMapper.updateById(sysCategory); sysCategoryMapper.updateById(sysCategory); } @Override @@ -132,6 +148,7 @@ /** * 查询节点下所有子节点 * * @param ids * @return */ @@ -155,6 +172,7 @@ /** * 查询需修改标识的父节点ids * * @param ids * @return */ @@ -188,6 +206,7 @@ /** * 递归 根据父id获取子节点id * * @param pidVal * @param sb * @return @@ -235,4 +254,91 @@ return textList; } @Override public List<SysCategory> listByParams(SysCategory query) { QueryWrapper<SysCategory> queryWrapper = new QueryWrapper<>(query); if (query != null) { if (StringUtils.isNotBlank(query.getName())) { queryWrapper.like("t.name", query.getName()); } if (StringUtils.isNotBlank(query.getCode())) { queryWrapper.like("t.code", query.getCode()); } } queryWrapper.orderByDesc("t.id"); return sysCategoryMapper.listByParams(queryWrapper); } @Override @Transactional(rollbackFor = Exception.class) public void deepAdd(SysCategory sysCategory, List<String> errorMessage) { String parenCode = (StringUtils.isBlank(sysCategory.getParentCode()) ? "0" : sysCategory.getParentCode()); if (ROOT_PID_VALUE.equals(parenCode)) { sysCategory.setPid(ROOT_PID_VALUE); sysCategory.setRootCode(sysCategory.getCode()); sysCategory.setParentIds(null); //根节点 SysCategory entity = this.getByCodeAndRootCode(sysCategory.getCode(), null); if (entity != null) { sysCategory.setId(entity.getId()); sysCategoryMapper.updateById(sysCategory); } else { sysCategoryMapper.insert(sysCategory); } } else { //获取上级节点 String pid = sysCategory.getPid(); SysCategory parent = this.getById(pid); if (parent == null) { String rootCode = sysCategory.getRootCode(); parent = this.getByCodeAndRootCode(parenCode, rootCode); } if (parent != null) { sysCategory.setPid(parent.getId()); sysCategory.setRootCode(parent.getRootCode()); String parentIds = (parent.getParentIds() == null ? parent.getId() : (parent.getParentIds() + "," + parent.getId())); sysCategory.setParentIds(parentIds); if (!ISysCategoryService.HAS_CHILD.equals(parent.getHasChild())) { //更新根节点 parent.setHasChild(HAS_CHILD); sysCategoryMapper.updateById(parent); } SysCategory entity = this.getByCodeAndRootCode(sysCategory.getCode(), parent.getRootCode()); if (entity != null) { sysCategory.setId(entity.getId()); sysCategoryMapper.updateById(sysCategory); } else { sysCategoryMapper.insert(sysCategory); } } else { errorMessage.add(String.format("编码[%s]的父节点没有找到,", sysCategory.getCode())); return; } } if (CollectionUtil.isNotEmpty(sysCategory.getChildren())) { sysCategory.getChildren().forEach(child -> { child.setPid(sysCategory.getId()); this.deepAdd(child, errorMessage); }); } } /** * 查询编码是否已存在 * * @param code 分类编码 * @param rootCode 根节点编码 为空,添加根节点, 不为空,添加子节点 * @return */ @Override public SysCategory getByCodeAndRootCode(String code, String rootCode) { LambdaQueryWrapper<SysCategory> queryWrapper = new LambdaQueryWrapper<>(); if (StringUtils.isNotBlank(rootCode)) { queryWrapper.eq(SysCategory::getRootCode, rootCode); } queryWrapper.eq(SysCategory::getCode, code); return sysCategoryMapper.selectOne(queryWrapper); } }