From 7e254edced5f0361882471ebffbad572c181235d Mon Sep 17 00:00:00 2001
From: zhangherong <571457620@qq.com>
Date: 星期一, 12 五月 2025 18:09:32 +0800
Subject: [PATCH] art: 系统管理-分类字典功能改造,导入功能修改

---
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysCategoryService.java         |  135 ++-
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/SysCategoryController.java    |  912 +++++++++++++++---------------
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysCategory.java                  |  124 ++-
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysCategoryMapper.java            |    5 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysCategoryServiceImpl.java |  502 ++++++++++------
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysCategoryMapper.xml         |    7 
 6 files changed, 934 insertions(+), 751 deletions(-)

diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/SysCategoryController.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/SysCategoryController.java
index 9ab89a7..90d9e49 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/SysCategoryController.java
+++ b/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,485 +33,485 @@
 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;
 
- /**
+/**
  * @Description: 鍒嗙被瀛楀吀
  * @Author: jeecg-boot
- * @Date:   2019-05-29
+ * @Date: 2019-05-29
  * @Version: V1.0
  */
 @RestController
 @RequestMapping("/sys/category")
 @Slf4j
 public class SysCategoryController {
-	@Autowired
-	private ISysCategoryService sysCategoryService;
+    @Autowired
+    private ISysCategoryService sysCategoryService;
 
-     /**
-      * 鍒嗙被缂栫爜0
-      */
-     private static final String CATEGORY_ROOT_CODE = "0";
-
-	/**
-	  * 鍒嗛〉鍒楄〃鏌ヨ
-	 * @param sysCategory
-	 * @param pageNo
-	 * @param pageSize
-	 * @param req
-	 * @return
-	 */
-	@GetMapping(value = "/rootList")
-	public Result<IPage<SysCategory>> queryPageList(SysCategory sysCategory,
-									  @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
-									  @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
-									  HttpServletRequest req) {
-		if(oConvertUtils.isEmpty(sysCategory.getPid())){
-			sysCategory.setPid("0");
-		}
-		Result<IPage<SysCategory>> result = new Result<IPage<SysCategory>>();
-		
-		//--author:os_chengtgen---date:20190804 -----for: 鍒嗙被瀛楀吀椤甸潰鏄剧ず閿欒,issues:377--------start
-		//--author:liusq---date:20211119 -----for: 銆恦ue3銆戝垎绫诲瓧鍏搁〉闈㈡煡璇㈡潯浠堕厤缃�--------start
-		QueryWrapper<SysCategory> queryWrapper = QueryGenerator.initQueryWrapper(sysCategory, req.getParameterMap());
-		String name = sysCategory.getName();
-		String code = sysCategory.getCode();
-		//QueryWrapper<SysCategory> queryWrapper = new QueryWrapper<SysCategory>();
-		if(StringUtils.isBlank(name)&&StringUtils.isBlank(code)){
-			queryWrapper.eq("pid", sysCategory.getPid());
-		}
-		//--author:liusq---date:20211119 -----for: 鍒嗙被瀛楀吀椤甸潰鏌ヨ鏉′欢閰嶇疆--------end
-		//--author:os_chengtgen---date:20190804 -----for:銆恦ue3銆� 鍒嗙被瀛楀吀椤甸潰鏄剧ず閿欒,issues:377--------end
-
-		Page<SysCategory> page = new Page<SysCategory>(pageNo, pageSize);
-		IPage<SysCategory> pageList = sysCategoryService.page(page, queryWrapper);
-		result.setSuccess(true);
-		result.setResult(pageList);
-		return result;
-	}
-	
-	@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());
-		List<SysCategory> list = sysCategoryService.list(queryWrapper);
-		result.setSuccess(true);
-		result.setResult(list);
-		return result;
-	}
-	
-	
-	/**
-	  *   娣诲姞
-	 * @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
-	 */
-	@DeleteMapping(value = "/delete")
-	public Result<SysCategory> delete(@RequestParam(name="id",required=true) String id) {
-		Result<SysCategory> result = new Result<SysCategory>();
-		SysCategory sysCategory = sysCategoryService.getById(id);
-		if(sysCategory==null) {
-			result.error500("鏈壘鍒板搴斿疄浣�");
-		}else {
-			this.sysCategoryService.deleteSysCategory(id);
-			result.success("鍒犻櫎鎴愬姛!");
-		}
-		
-		return result;
-	}
-	
-	/**
-	  *  鎵归噺鍒犻櫎
-	 * @param ids
-	 * @return
-	 */
-	@DeleteMapping(value = "/deleteBatch")
-	public Result<SysCategory> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
-		Result<SysCategory> result = new Result<SysCategory>();
-		if(ids==null || "".equals(ids.trim())) {
-			result.error500("鍙傛暟涓嶈瘑鍒紒");
-		}else {
-			this.sysCategoryService.deleteSysCategory(ids);
-			result.success("鍒犻櫎鎴愬姛!");
-		}
-		return result;
-	}
-	
-	/**
-	  * 閫氳繃id鏌ヨ
-	 * @param id
-	 * @return
-	 */
-	@GetMapping(value = "/queryById")
-	public Result<SysCategory> queryById(@RequestParam(name="id",required=true) String id) {
-		Result<SysCategory> result = new Result<SysCategory>();
-		SysCategory sysCategory = sysCategoryService.getById(id);
-		if(sysCategory==null) {
-			result.error500("鏈壘鍒板搴斿疄浣�");
-		}else {
-			result.setResult(sysCategory);
-			result.setSuccess(true);
-		}
-		return result;
-	}
-
-  /**
-      * 瀵煎嚭excel
-   *
-   * @param request
-   */
-  @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);
-      // Step.2 AutoPoi 瀵煎嚭Excel
-      ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
-      // 杩囨护閫変腑鏁版嵁
-      String selections = request.getParameter("selections");
-      if(oConvertUtils.isEmpty(selections)) {
-    	  mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
-      }else {
-    	  List<String> selectionList = Arrays.asList(selections.split(","));
-    	  List<SysCategory> exportList = pageList.stream().filter(item -> selectionList.contains(item.getId())).collect(Collectors.toList());
-    	  mv.addObject(NormalExcelConstants.DATA_LIST, exportList);
-      }
-      //瀵煎嚭鏂囦欢鍚嶇О
-      mv.addObject(NormalExcelConstants.FILE_NAME, "鍒嗙被瀛楀吀鍒楄〃");
-      mv.addObject(NormalExcelConstants.CLASS, SysCategory.class);
-      LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-      mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("鍒嗙被瀛楀吀鍒楄〃鏁版嵁", "瀵煎嚭浜�:"+user.getRealname(), "瀵煎嚭淇℃伅"));
-      return mv;
-  }
-
-  /**
-      * 閫氳繃excel瀵煎叆鏁版嵁
-   *
-   * @param request
-   * @param response
-   * @return
-   */
-  @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
-  public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) throws IOException{
-      MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
-      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.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);
-					  }
-				  }
-              }
-          } catch (Exception e) {
-			  errorMessage.add("鍙戠敓寮傚父锛�" + e.getMessage());
-			  log.error(e.getMessage(), e);
-          } finally {
-              try {
-                  file.getInputStream().close();
-              } catch (IOException e) {
-                  e.printStackTrace();
-              }
-          }
-      }
-      return ImportExcelUtil.imporReturnRes(errorLines,successLines,errorMessage);
-  }
-  
-  
-  
-  /**
-     * 鍔犺浇鍗曚釜鏁版嵁 鐢ㄤ簬鍥炴樉
-   */
-    @RequestMapping(value = "/loadOne", method = RequestMethod.GET)
- 	public Result<SysCategory> loadOne(@RequestParam(name="field") String field,@RequestParam(name="val") String val) {
- 		Result<SysCategory> result = new Result<SysCategory>();
- 		try {
-			//update-begin-author:taoyan date:2022-5-6 for: issues/3663 sql娉ㄥ叆闂
-			boolean isClassField = SqlInjectionUtil.isClassField(field, SysCategory.class);
-			if (!isClassField) {
-				return Result.error("瀛楁鏃犳晥锛岃妫�鏌�!");
-			}
-			//update-end-author:taoyan date:2022-5-6 for: issues/3663 sql娉ㄥ叆闂
- 			QueryWrapper<SysCategory> query = new QueryWrapper<SysCategory>();
- 			query.eq(field, val);
- 			List<SysCategory> ls = this.sysCategoryService.list(query);
- 			if(ls==null || ls.size()==0) {
- 				result.setMessage("鏌ヨ鏃犳灉");
- 	 			result.setSuccess(false);
- 			}else if(ls.size()>1) {
- 				result.setMessage("鏌ヨ鏁版嵁寮傚父,["+field+"]瀛樺湪澶氫釜鍊�:"+val);
- 	 			result.setSuccess(false);
- 			}else {
- 				result.setSuccess(true);
- 				result.setResult(ls.get(0));
- 			}
- 		} catch (Exception e) {
- 			e.printStackTrace();
- 			result.setMessage(e.getMessage());
- 			result.setSuccess(false);
- 		}
- 		return result;
- 	}
-   
     /**
-          * 鍔犺浇鑺傜偣鐨勫瓙鏁版嵁
+     * 鍒嗙被缂栫爜0
+     */
+    private static final String CATEGORY_ROOT_CODE = "0";
+
+    /**
+     * 鍒嗛〉鍒楄〃鏌ヨ
+     *
+     * @param sysCategory
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @GetMapping(value = "/rootList")
+    public Result<IPage<SysCategory>> queryPageList(SysCategory sysCategory,
+                                                    @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                    @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                    HttpServletRequest req) {
+        if (oConvertUtils.isEmpty(sysCategory.getPid())) {
+            sysCategory.setPid("0");
+        }
+        Result<IPage<SysCategory>> result = new Result<IPage<SysCategory>>();
+
+        //--author:os_chengtgen---date:20190804 -----for: 鍒嗙被瀛楀吀椤甸潰鏄剧ず閿欒,issues:377--------start
+        //--author:liusq---date:20211119 -----for: 銆恦ue3銆戝垎绫诲瓧鍏搁〉闈㈡煡璇㈡潯浠堕厤缃�--------start
+        QueryWrapper<SysCategory> queryWrapper = QueryGenerator.initQueryWrapper(sysCategory, req.getParameterMap());
+        String name = sysCategory.getName();
+        String code = sysCategory.getCode();
+        //QueryWrapper<SysCategory> queryWrapper = new QueryWrapper<SysCategory>();
+        if (StringUtils.isBlank(name) && StringUtils.isBlank(code)) {
+            queryWrapper.eq("pid", sysCategory.getPid());
+        }
+        //--author:liusq---date:20211119 -----for: 鍒嗙被瀛楀吀椤甸潰鏌ヨ鏉′欢閰嶇疆--------end
+        //--author:os_chengtgen---date:20190804 -----for:銆恦ue3銆� 鍒嗙被瀛楀吀椤甸潰鏄剧ず閿欒,issues:377--------end
+
+        Page<SysCategory> page = new Page<SysCategory>(pageNo, pageSize);
+        IPage<SysCategory> pageList = sysCategoryService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    @GetMapping(value = "/childList")
+    public Result<List<SysCategory>> queryPageList(SysCategory sysCategory, HttpServletRequest req) {
+        Result<List<SysCategory>> result = new Result<List<SysCategory>>();
+        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);
+        return result;
+    }
+
+
+    /**
+     * 娣诲姞
+     *
+     * @param sysCategory
+     * @return
+     */
+    @PostMapping(value = "/add")
+    public Result<SysCategory> add(@RequestBody SysCategory sysCategory) {
+        Result<SysCategory> result = new Result<SysCategory>();
+        sysCategoryService.addSysCategory(sysCategory);
+        result.success("娣诲姞鎴愬姛锛�");
+        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>();
+        sysCategoryService.updateSysCategory(sysCategory);
+        result.success("淇敼鎴愬姛!");
+        return result;
+    }
+
+    /**
+     * 閫氳繃id鍒犻櫎
+     *
+     * @param id
+     * @return
+     */
+    @DeleteMapping(value = "/delete")
+    public Result<SysCategory> delete(@RequestParam(name = "id", required = true) String id) {
+        Result<SysCategory> result = new Result<SysCategory>();
+        SysCategory sysCategory = sysCategoryService.getById(id);
+        if (sysCategory == null) {
+            result.error500("鏈壘鍒板搴斿疄浣�");
+        } else {
+            this.sysCategoryService.deleteSysCategory(id);
+            result.success("鍒犻櫎鎴愬姛!");
+        }
+
+        return result;
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎
+     *
+     * @param ids
+     * @return
+     */
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<SysCategory> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<SysCategory> result = new Result<SysCategory>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("鍙傛暟涓嶈瘑鍒紒");
+        } else {
+            this.sysCategoryService.deleteSysCategory(ids);
+            result.success("鍒犻櫎鎴愬姛!");
+        }
+        return result;
+    }
+
+    /**
+     * 閫氳繃id鏌ヨ
+     *
+     * @param id
+     * @return
+     */
+    @GetMapping(value = "/queryById")
+    public Result<SysCategory> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<SysCategory> result = new Result<SysCategory>();
+        SysCategory sysCategory = sysCategoryService.getById(id);
+        if (sysCategory == null) {
+            result.error500("鏈壘鍒板搴斿疄浣�");
+        } else {
+            result.setResult(sysCategory);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 瀵煎嚭excel
+     *
+     * @param request
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, SysCategory sysCategory) {
+        // Step.1 缁勮鏌ヨ鏉′欢鏌ヨ鏁版嵁
+        List<SysCategory> pageList = sysCategoryService.listByParams(sysCategory);
+        // Step.2 AutoPoi 瀵煎嚭Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        // 杩囨护閫変腑鏁版嵁
+        String selections = request.getParameter("selections");
+        if (oConvertUtils.isEmpty(selections)) {
+            mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
+        } else {
+            List<String> selectionList = Arrays.asList(selections.split(","));
+            List<SysCategory> exportList = pageList.stream().filter(item -> selectionList.contains(item.getId())).collect(Collectors.toList());
+            mv.addObject(NormalExcelConstants.DATA_LIST, exportList);
+        }
+        //瀵煎嚭鏂囦欢鍚嶇О
+        mv.addObject(NormalExcelConstants.FILE_NAME, "鍒嗙被瀛楀吀鍒楄〃");
+        mv.addObject(NormalExcelConstants.CLASS, SysCategory.class);
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("鍒嗙被瀛楀吀鍒楄〃鏁版嵁", "瀵煎嚭浜�:" + user.getRealname(), "瀵煎嚭淇℃伅"));
+        return mv;
+    }
+
+    /**
+     * 閫氳繃excel瀵煎叆鏁版嵁
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) throws IOException {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        // 閿欒淇℃伅
+        List<String> errorMessage = new ArrayList<>();
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            // 鑾峰彇涓婁紶鏂囦欢瀵硅薄
+            MultipartFile file = entity.getValue();
+            ImportParams params = new ImportParams();
+            params.setTitleRows(0);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+            try {
+                List<SysCategory> listSysCategorys = ExcelImportUtil.importExcel(file.getInputStream(), SysCategory.class, params);
+                //缁勮鏍戠粨鏋�
+                List<SysCategory> treeNodes = buildTree(listSysCategorys);
+                for (SysCategory sysCategory : treeNodes) {
+                    sysCategoryService.deepAdd(sysCategory, errorMessage);
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException ignored) {
+                }
+            }
+        }
+        return Result.ok("瀵煎叆鎴愬姛");
+    }
+
+
+    /**
+     * 鍔犺浇鍗曚釜鏁版嵁 鐢ㄤ簬鍥炴樉
+     */
+    @RequestMapping(value = "/loadOne", method = RequestMethod.GET)
+    public Result<SysCategory> loadOne(@RequestParam(name = "field") String field, @RequestParam(name = "val") String val) {
+        Result<SysCategory> result = new Result<SysCategory>();
+        try {
+            //update-begin-author:taoyan date:2022-5-6 for: issues/3663 sql娉ㄥ叆闂
+            boolean isClassField = SqlInjectionUtil.isClassField(field, SysCategory.class);
+            if (!isClassField) {
+                return Result.error("瀛楁鏃犳晥锛岃妫�鏌�!");
+            }
+            //update-end-author:taoyan date:2022-5-6 for: issues/3663 sql娉ㄥ叆闂
+            QueryWrapper<SysCategory> query = new QueryWrapper<SysCategory>();
+            query.eq(field, val);
+            List<SysCategory> ls = this.sysCategoryService.list(query);
+            if (ls == null || ls.size() == 0) {
+                result.setMessage("鏌ヨ鏃犳灉");
+                result.setSuccess(false);
+            } else if (ls.size() > 1) {
+                result.setMessage("鏌ヨ鏁版嵁寮傚父,[" + field + "]瀛樺湪澶氫釜鍊�:" + val);
+                result.setSuccess(false);
+            } else {
+                result.setSuccess(true);
+                result.setResult(ls.get(0));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.setMessage(e.getMessage());
+            result.setSuccess(false);
+        }
+        return result;
+    }
+
+    /**
+     * 鍔犺浇鑺傜偣鐨勫瓙鏁版嵁
      */
     @RequestMapping(value = "/loadTreeChildren", method = RequestMethod.GET)
-	public Result<List<TreeSelectModel>> loadTreeChildren(@RequestParam(name="pid") String pid) {
-		Result<List<TreeSelectModel>> result = new Result<List<TreeSelectModel>>();
-		try {
-			List<TreeSelectModel> ls = this.sysCategoryService.queryListByPid(pid);
-			result.setResult(ls);
-			result.setSuccess(true);
-		} catch (Exception e) {
-			e.printStackTrace();
-			result.setMessage(e.getMessage());
-			result.setSuccess(false);
-		}
-		return result;
-	}
-    
+    public Result<List<TreeSelectModel>> loadTreeChildren(@RequestParam(name = "pid") String pid) {
+        Result<List<TreeSelectModel>> result = new Result<List<TreeSelectModel>>();
+        try {
+            List<TreeSelectModel> ls = this.sysCategoryService.queryListByPid(pid);
+            result.setResult(ls);
+            result.setSuccess(true);
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.setMessage(e.getMessage());
+            result.setSuccess(false);
+        }
+        return result;
+    }
+
     /**
-         * 鍔犺浇涓�绾ц妭鐐�/濡傛灉鏄悓姝� 鍒欐墍鏈夋暟鎹�
+     * 鍔犺浇涓�绾ц妭鐐�/濡傛灉鏄悓姝� 鍒欐墍鏈夋暟鎹�
      */
     @RequestMapping(value = "/loadTreeRoot", method = RequestMethod.GET)
-   	public Result<List<TreeSelectModel>> loadTreeRoot(@RequestParam(name="async") Boolean async,@RequestParam(name="pcode") String pcode) {
-   		Result<List<TreeSelectModel>> result = new Result<List<TreeSelectModel>>();
-   		try {
-   			List<TreeSelectModel> ls = this.sysCategoryService.queryListByCode(pcode);
-   			if(!async) {
-   				loadAllCategoryChildren(ls);
-   			}
-   			result.setResult(ls);
-   			result.setSuccess(true);
-   		} catch (Exception e) {
-   			e.printStackTrace();
-   			result.setMessage(e.getMessage());
-   			result.setSuccess(false);
-   		}
-   		return result;
-   	}
-  
+    public Result<List<TreeSelectModel>> loadTreeRoot(@RequestParam(name = "async") Boolean async, @RequestParam(name = "pcode") String pcode) {
+        Result<List<TreeSelectModel>> result = new Result<List<TreeSelectModel>>();
+        try {
+            List<TreeSelectModel> ls = this.sysCategoryService.queryListByCode(pcode);
+            if (!async) {
+                loadAllCategoryChildren(ls);
+            }
+            result.setResult(ls);
+            result.setSuccess(true);
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.setMessage(e.getMessage());
+            result.setSuccess(false);
+        }
+        return result;
+    }
+
     /**
-         * 閫掑綊姹傚瓙鑺傜偣 鍚屾鍔犺浇鐢ㄥ埌
+     * 閫掑綊姹傚瓙鑺傜偣 鍚屾鍔犺浇鐢ㄥ埌
      */
-  	private void loadAllCategoryChildren(List<TreeSelectModel> ls) {
-  		for (TreeSelectModel tsm : ls) {
-			List<TreeSelectModel> temp = this.sysCategoryService.queryListByPid(tsm.getKey());
-			if(temp!=null && temp.size()>0) {
-				tsm.setChildren(temp);
-				loadAllCategoryChildren(temp);
-			}
-		}
-  	}
+    private void loadAllCategoryChildren(List<TreeSelectModel> ls) {
+        for (TreeSelectModel tsm : ls) {
+            List<TreeSelectModel> temp = this.sysCategoryService.queryListByPid(tsm.getKey());
+            if (temp != null && temp.size() > 0) {
+                tsm.setChildren(temp);
+                loadAllCategoryChildren(temp);
+            }
+        }
+    }
 
-	 /**
-	  * 鏍¢獙缂栫爜
-	  * @param pid
-	  * @param code
-	  * @return
-	  */
-	 @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("閿欒,绫诲瀷缂栫爜涓虹┖!");
-		}
-		if(oConvertUtils.isEmpty(pid)){
-			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 code
+     * @return
+     */
+    @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("閿欒,鍒嗙被缂栫爜涓虹┖!");
+        }
+        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();
+    }
 
 
-	 /**
-	  * 鍒嗙被瀛楀吀鏍戞帶浠� 鍔犺浇鑺傜偣
-	  * @param pid
-	  * @param pcode
-	  * @param condition
-	  * @return
-	  */
-	 @RequestMapping(value = "/loadTreeData", method = RequestMethod.GET)
-	 public Result<List<TreeSelectModel>> loadDict(@RequestParam(name="pid",required = false) String pid,@RequestParam(name="pcode",required = false) String pcode, @RequestParam(name="condition",required = false) String condition) {
-		 Result<List<TreeSelectModel>> result = new Result<List<TreeSelectModel>>();
-		 //pid濡傛灉浼犲�间簡 灏卞拷鐣code鐨勪綔鐢�
-		 if(oConvertUtils.isEmpty(pid)){
-		 	if(oConvertUtils.isEmpty(pcode)){
-				result.setSuccess(false);
-				result.setMessage("鍔犺浇鍒嗙被瀛楀吀鏍戝弬鏁版湁璇�.[null]!");
-				return result;
-			}else{
-		 		if(ISysCategoryService.ROOT_PID_VALUE.equals(pcode)){
-					pid = ISysCategoryService.ROOT_PID_VALUE;
-				}else{
-					pid = this.sysCategoryService.queryIdByCode(pcode);
-				}
-				if(oConvertUtils.isEmpty(pid)){
-					result.setSuccess(false);
-					result.setMessage("鍔犺浇鍒嗙被瀛楀吀鏍戝弬鏁版湁璇�.[code]!");
-					return result;
-				}
-			}
-		 }
-		 Map<String, String> query = null;
-		 if(oConvertUtils.isNotEmpty(condition)) {
-			 query = JSON.parseObject(condition, Map.class);
-		 }
-		 List<TreeSelectModel> ls = sysCategoryService.queryListByPid(pid,query);
-		 result.setSuccess(true);
-		 result.setResult(ls);
-		 return result;
-	 }
+    /**
+     * 鍒嗙被瀛楀吀鏍戞帶浠� 鍔犺浇鑺傜偣
+     *
+     * @param pid
+     * @param pcode
+     * @param condition
+     * @return
+     */
+    @RequestMapping(value = "/loadTreeData", method = RequestMethod.GET)
+    public Result<List<TreeSelectModel>> loadDict(@RequestParam(name = "pid", required = false) String pid, @RequestParam(name = "pcode", required = false) String pcode, @RequestParam(name = "condition", required = false) String condition) {
+        Result<List<TreeSelectModel>> result = new Result<List<TreeSelectModel>>();
+        //pid濡傛灉浼犲�间簡 灏卞拷鐣code鐨勪綔鐢�
+        if (oConvertUtils.isEmpty(pid)) {
+            if (oConvertUtils.isEmpty(pcode)) {
+                result.setSuccess(false);
+                result.setMessage("鍔犺浇鍒嗙被瀛楀吀鏍戝弬鏁版湁璇�.[null]!");
+                return result;
+            } else {
+                if (ISysCategoryService.ROOT_PID_VALUE.equals(pcode)) {
+                    pid = ISysCategoryService.ROOT_PID_VALUE;
+                } else {
+                    pid = this.sysCategoryService.queryIdByCode(pcode);
+                }
+                if (oConvertUtils.isEmpty(pid)) {
+                    result.setSuccess(false);
+                    result.setMessage("鍔犺浇鍒嗙被瀛楀吀鏍戝弬鏁版湁璇�.[code]!");
+                    return result;
+                }
+            }
+        }
+        Map<String, String> query = null;
+        if (oConvertUtils.isNotEmpty(condition)) {
+            query = JSON.parseObject(condition, Map.class);
+        }
+        List<TreeSelectModel> ls = sysCategoryService.queryListByPid(pid, query);
+        result.setSuccess(true);
+        result.setResult(ls);
+        return result;
+    }
 
-	 /**
-	  * 鍒嗙被瀛楀吀鎺т欢鏁版嵁鍥炴樉[琛ㄥ崟椤甸潰]
-	  *
-	  * @param ids
-	  * @param delNotExist 鏄惁绉婚櫎涓嶅瓨鍦ㄧ殑椤癸紝榛樿涓簍rue锛岃涓篺alse濡傛灉鏌愪釜key涓嶅瓨鍦ㄦ暟鎹簱涓紝鍒欑洿鎺ヨ繑鍥瀔ey鏈韩
-	  * @return
-	  */
-	 @RequestMapping(value = "/loadDictItem", method = RequestMethod.GET)
-	 public Result<List<String>> loadDictItem(@RequestParam(name = "ids") String ids, @RequestParam(name = "delNotExist", required = false, defaultValue = "true") boolean delNotExist) {
-		 Result<List<String>> result = new Result<>();
-		 // 闈炵┖鍒ゆ柇
-		 if (StringUtils.isBlank(ids)) {
-			 result.setSuccess(false);
-			 result.setMessage("ids 涓嶈兘涓虹┖");
-			 return result;
-		 }
-		 // 鏌ヨ鏁版嵁
-		 List<String> textList = sysCategoryService.loadDictItem(ids, delNotExist);
-		 result.setSuccess(true);
-		 result.setResult(textList);
-		 return result;
-	 }
+    /**
+     * 鍒嗙被瀛楀吀鎺т欢鏁版嵁鍥炴樉[琛ㄥ崟椤甸潰]
+     *
+     * @param ids
+     * @param delNotExist 鏄惁绉婚櫎涓嶅瓨鍦ㄧ殑椤癸紝榛樿涓簍rue锛岃涓篺alse濡傛灉鏌愪釜key涓嶅瓨鍦ㄦ暟鎹簱涓紝鍒欑洿鎺ヨ繑鍥瀔ey鏈韩
+     * @return
+     */
+    @RequestMapping(value = "/loadDictItem", method = RequestMethod.GET)
+    public Result<List<String>> loadDictItem(@RequestParam(name = "ids") String ids, @RequestParam(name = "delNotExist", required = false, defaultValue = "true") boolean delNotExist) {
+        Result<List<String>> result = new Result<>();
+        // 闈炵┖鍒ゆ柇
+        if (StringUtils.isBlank(ids)) {
+            result.setSuccess(false);
+            result.setMessage("ids 涓嶈兘涓虹┖");
+            return result;
+        }
+        // 鏌ヨ鏁版嵁
+        List<String> textList = sysCategoryService.loadDictItem(ids, delNotExist);
+        result.setSuccess(true);
+        result.setResult(textList);
+        return result;
+    }
 
-	 /**
-	  * [鍒楄〃椤甸潰]鍔犺浇鍒嗙被瀛楀吀鏁版嵁 鐢ㄤ簬鍊肩殑鏇挎崲
-	  * @param code
-	  * @return
-	  */
-	 @RequestMapping(value = "/loadAllData", method = RequestMethod.GET)
-	 public Result<List<DictModel>> loadAllData(@RequestParam(name="code",required = true) String code) {
-		 Result<List<DictModel>> result = new Result<List<DictModel>>();
-		 LambdaQueryWrapper<SysCategory> query = new LambdaQueryWrapper<SysCategory>();
-		 if(oConvertUtils.isNotEmpty(code) && !CATEGORY_ROOT_CODE.equals(code)){
-			 query.likeRight(SysCategory::getCode,code);
-		 }
-		 List<SysCategory> list = this.sysCategoryService.list(query);
-		 if(list==null || list.size()==0) {
-			 result.setMessage("鏃犳暟鎹�,鍙傛暟鏈夎.[code]");
-			 result.setSuccess(false);
-			 return result;
-		 }
-		 List<DictModel> rdList = new ArrayList<DictModel>();
-		 for (SysCategory c : list) {
-			 rdList.add(new DictModel(c.getId(),c.getName()));
-		 }
-		 result.setSuccess(true);
-		 result.setResult(rdList);
-		 return result;
-	 }
+    /**
+     * [鍒楄〃椤甸潰]鍔犺浇鍒嗙被瀛楀吀鏁版嵁 鐢ㄤ簬鍊肩殑鏇挎崲
+     *
+     * @param code
+     * @return
+     */
+    @RequestMapping(value = "/loadAllData", method = RequestMethod.GET)
+    public Result<List<DictModel>> loadAllData(@RequestParam(name = "code", required = true) String code) {
+        Result<List<DictModel>> result = new Result<List<DictModel>>();
+        LambdaQueryWrapper<SysCategory> query = new LambdaQueryWrapper<SysCategory>();
+        if (oConvertUtils.isNotEmpty(code) && !CATEGORY_ROOT_CODE.equals(code)) {
+            query.likeRight(SysCategory::getCode, code);
+        }
+        List<SysCategory> list = this.sysCategoryService.list(query);
+        if (list == null || list.size() == 0) {
+            result.setMessage("鏃犳暟鎹�,鍙傛暟鏈夎.[code]");
+            result.setSuccess(false);
+            return result;
+        }
+        List<DictModel> rdList = new ArrayList<DictModel>();
+        for (SysCategory c : list) {
+            rdList.add(new DictModel(c.getId(), c.getName()));
+        }
+        result.setSuccess(true);
+        result.setResult(rdList);
+        return result;
+    }
 
-	 /**
-	  * 鏍规嵁鐖剁骇id鎵归噺鏌ヨ瀛愯妭鐐�
-	  * @param parentIds
-	  * @return
-	  */
-	 @GetMapping("/getChildListBatch")
-	 public Result getChildListBatch(@RequestParam("parentIds") String parentIds) {
-		 try {
-			 QueryWrapper<SysCategory> queryWrapper = new QueryWrapper<>();
-			 List<String> parentIdList = Arrays.asList(parentIds.split(","));
-			 queryWrapper.in("pid", parentIdList);
-			 List<SysCategory> list = sysCategoryService.list(queryWrapper);
-			 IPage<SysCategory> pageList = new Page<>(1, 10, list.size());
-			 pageList.setRecords(list);
-			 return Result.OK(pageList);
-		 } catch (Exception e) {
-			 log.error(e.getMessage(), e);
-			 return Result.error("鎵归噺鏌ヨ瀛愯妭鐐瑰け璐ワ細" + e.getMessage());
-		 }
-	 }
+    /**
+     * 鏍规嵁鐖剁骇id鎵归噺鏌ヨ瀛愯妭鐐�
+     *
+     * @param parentIds
+     * @return
+     */
+    @GetMapping("/getChildListBatch")
+    public Result getChildListBatch(@RequestParam("parentIds") String parentIds) {
+        try {
+            QueryWrapper<SysCategory> queryWrapper = new QueryWrapper<>();
+            List<String> parentIdList = Arrays.asList(parentIds.split(","));
+            queryWrapper.in("pid", parentIdList);
+            List<SysCategory> list = sysCategoryService.list(queryWrapper);
+            IPage<SysCategory> pageList = new Page<>(1, 10, list.size());
+            pageList.setRecords(list);
+            return Result.OK(pageList);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return Result.error("鎵归噺鏌ヨ瀛愯妭鐐瑰け璐ワ細" + e.getMessage());
+        }
+    }
+
+
+    /**
+     * 缁勮 鏍戝瀷缁撴瀯
+     *
+     * @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;
+    }
 
 
 }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysCategory.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysCategory.java
index d7b86e9..e86ba7e 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysCategory.java
+++ b/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,58 +10,93 @@
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * @Description: 鍒嗙被瀛楀吀
  * @Author: jeecg-boot
- * @Date:   2019-05-29
+ * @Date: 2019-05-29
  * @Version: V1.0
  */
 @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;
-	/**鍒涘缓鏃ユ湡*/
-	@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;
-	/**鏇存柊鏃ユ湡*/
-	@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;
 
-	@Override
-	public int compareTo(SysCategory o) {
-		//姣旇緝鏉′欢鎴戜滑瀹氱殑鏄寜鐓ode鐨勯暱搴﹀崌搴�
-		// <0锛氬綋鍓嶅璞℃瘮浼犲叆瀵硅薄灏忋��
-		// =0锛氬綋鍓嶅璞$瓑浜庝紶鍏ュ璞°��
-		// >0锛氬綋鍓嶅璞℃瘮浼犲叆瀵硅薄澶с��
-		int	 s = this.code.length() - o.code.length();
-		return s;
-	}
-	@Override
-	public String toString() {
-		return "SysCategory [code=" + code + ", name=" + name + "]";
-	}
+    /**
+     * 涓婚敭
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    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 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 String sysOrgCode;
+    /**
+     * 鏄惁鏈夊瓙鑺傜偣
+     */
+    private String hasChild;
+    /**
+     * 鏍硅妭鐐圭紪鐮�
+     */
+    @Excel(name = "鏍硅妭鐐圭紪鐮�", width = 15, orderNum = "4")
+    private String rootCode;
+    /**
+     * 鎵�鏈夌埗鑺傜偣ID
+     */
+    private String parentIds;
+
+    @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);
+    }
 }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysCategoryMapper.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysCategoryMapper.java
index 3abefa6..5ed953b 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysCategoryMapper.java
+++ b/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;
@@ -33,6 +35,7 @@
      */
 	@Select("SELECT ID FROM sys_category WHERE CODE = #{code,jdbcType=VARCHAR}")
 	public String queryIdByCode(@Param("code")  String code);
-	
 
+
+    List<SysCategory> listByParams(@Param(Constants.WRAPPER) QueryWrapper<SysCategory> queryWrapper);
 }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysCategoryMapper.xml b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysCategoryMapper.xml
index 741670c..da74623 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysCategoryMapper.xml
+++ b/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>
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysCategoryService.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysCategoryService.java
index 6c8b301..77ff435 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysCategoryService.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysCategoryService.java
@@ -11,82 +11,113 @@
 /**
  * @Description: 鍒嗙被瀛楀吀
  * @Author: jeecg-boot
- * @Date:   2019-05-29
+ * @Date: 2019-05-29
  * @Version: V1.0
  */
 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);
+    void addSysCategory(SysCategory sysCategory);
 
     /**
      * 淇敼鍒嗙被瀛楀吀
+     *
      * @param sysCategory
      */
-	void updateSysCategory(SysCategory sysCategory);
-	
-	/**
+    void updateSysCategory(SysCategory sysCategory);
+
+    /**
      * 鏍规嵁鐖剁骇缂栫爜鍔犺浇鍒嗙被瀛楀吀鐨勬暟鎹�
-	 * @param pcode
-	 * @return
+     *
+     * @param pcode
+     * @return
      * @throws JeecgBootException
-	 */
-	public List<TreeSelectModel> queryListByCode(String pcode) throws JeecgBootException;
-	
-	/**
-	  * 鏍规嵁pid鏌ヨ瀛愯妭鐐归泦鍚�
-	 * @param pid
-	 * @return
-	 */
-	public List<TreeSelectModel> queryListByPid(String pid);
+     */
+    List<TreeSelectModel> queryListByCode(String pcode) throws JeecgBootException;
 
-	/**
-	 * 鏍规嵁pid鏌ヨ瀛愯妭鐐归泦鍚�,鏀寔鏌ヨ鏉′欢
-	 * @param pid
-	 * @param condition
-	 * @return
-	 */
-	public List<TreeSelectModel> queryListByPid(String pid, Map<String,String> condition);
+    /**
+     * 鏍规嵁pid鏌ヨ瀛愯妭鐐归泦鍚�
+     *
+     * @param pid
+     * @return
+     */
+    List<TreeSelectModel> queryListByPid(String pid);
 
-	/**
-	 * 鏍规嵁code鏌ヨid
-	 * @param code
-	 * @return
-	 */
-	public String queryIdByCode(String code);
+    /**
+     * 鏍规嵁pid鏌ヨ瀛愯妭鐐归泦鍚�,鏀寔鏌ヨ鏉′欢
+     *
+     * @param pid
+     * @param condition
+     * @return
+     */
+    List<TreeSelectModel> queryListByPid(String pid, Map<String, String> condition);
 
-	/**
-	 * 鍒犻櫎鑺傜偣鏃跺悓鏃跺垹闄ゅ瓙鑺傜偣鍙婁慨鏀圭埗绾ц妭鐐�
-	 * @param ids
-	 */
-	void deleteSysCategory(String ids);
+    /**
+     * 鏍规嵁code鏌ヨid
+     *
+     * @param code
+     * @return
+     */
+    String queryIdByCode(String code);
 
-	/**
-	 * 鍒嗙被瀛楀吀鎺т欢鏁版嵁鍥炴樉[琛ㄥ崟椤甸潰]
-	 *
-	 * @param ids
-	 * @return
-	 */
-	List<String> loadDictItem(String ids);
+    /**
+     * 鍒犻櫎鑺傜偣鏃跺悓鏃跺垹闄ゅ瓙鑺傜偣鍙婁慨鏀圭埗绾ц妭鐐�
+     *
+     * @param ids
+     */
+    void deleteSysCategory(String ids);
 
-	/**
-	 * 鍒嗙被瀛楀吀鎺т欢鏁版嵁鍥炴樉[琛ㄥ崟椤甸潰]
-	 *
-	 * @param ids
-	 * @param delNotExist 鏄惁绉婚櫎涓嶅瓨鍦ㄧ殑椤癸紝璁句负false濡傛灉鏌愪釜key涓嶅瓨鍦ㄦ暟鎹簱涓紝鍒欑洿鎺ヨ繑鍥瀔ey鏈韩
-	 * @return
-	 */
-	List<String> loadDictItem(String ids, boolean delNotExist);
+    /**
+     * 鍒嗙被瀛楀吀鎺т欢鏁版嵁鍥炴樉[琛ㄥ崟椤甸潰]
+     *
+     * @param ids
+     * @return
+     */
+    List<String> loadDictItem(String ids);
 
+    /**
+     * 鍒嗙被瀛楀吀鎺т欢鏁版嵁鍥炴樉[琛ㄥ崟椤甸潰]
+     *
+     * @param ids
+     * @param delNotExist 鏄惁绉婚櫎涓嶅瓨鍦ㄧ殑椤癸紝璁句负false濡傛灉鏌愪釜key涓嶅瓨鍦ㄦ暟鎹簱涓紝鍒欑洿鎺ヨ繑鍥瀔ey鏈韩
+     * @return
+     */
+    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);
 }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysCategoryServiceImpl.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysCategoryServiceImpl.java
index 437be4e..2a9d5d6 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysCategoryServiceImpl.java
+++ b/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,221 +17,328 @@
 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;
 
 /**
  * @Description: 鍒嗙被瀛楀吀
  * @Author: jeecg-boot
- * @Date:   2019-05-29
+ * @Date: 2019-05-29
  * @Version: V1.0
  */
 @Service
 public class SysCategoryServiceImpl extends ServiceImpl<SysCategoryMapper, SysCategory> implements ISysCategoryService {
 
-	@Override
-	public void addSysCategory(SysCategory sysCategory) {
-		String categoryCode = "";
-		String categoryPid = ISysCategoryService.ROOT_PID_VALUE;
-		String parentCode = null;
-		if(oConvertUtils.isNotEmpty(sysCategory.getPid())){
-			categoryPid = sysCategory.getPid();
+    @Resource
+    private SysCategoryMapper sysCategoryMapper;
 
-			//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())){
-					parent.setHasChild(ISysCategoryService.HAS_CHILD);
-					baseMapper.updateById(parent);
-				}
-			}
-		}
-		//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);
-	}
-	
-	@Override
-	public void updateSysCategory(SysCategory sysCategory) {
-		if(oConvertUtils.isEmpty(sysCategory.getPid())){
-			sysCategory.setPid(ISysCategoryService.ROOT_PID_VALUE);
-		}else{
-			//濡傛灉褰撳墠鑺傜偣鐖禝D涓嶄负绌� 鍒欒缃埗鑺傜偣鐨刪asChild 涓�1
-			SysCategory parent = baseMapper.selectById(sysCategory.getPid());
-			if(parent!=null && !ISysCategoryService.HAS_CHILD.equals(parent.getHasChild())){
-				parent.setHasChild(ISysCategoryService.HAS_CHILD);
-				baseMapper.updateById(parent);
-			}
-		}
-		baseMapper.updateById(sysCategory);
-	}
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void addSysCategory(SysCategory sysCategory) {
+        //淇敼瀛楀吀鍒嗙被  缂栫爜涓烘墜鍔ㄨ緭鍏�
+        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);
+                    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("鍒嗙被缂栫爜宸插瓨鍦紝璇蜂慨鏀瑰悗閲嶈瘯锛�");
+            }
+            //鐖惰妭鐐逛笉瀛樺湪 榛樿涓烘牴鑺傜偣
+            sysCategory.setPid(ISysCategoryService.ROOT_PID_VALUE);
+            sysCategory.setRootCode(sysCategory.getCode());
+            sysCategory.setParentIds(null);
+        }
+        sysCategoryMapper.insert(sysCategory);
+    }
 
-	@Override
-	public List<TreeSelectModel> queryListByCode(String pcode) throws JeecgBootException{
-		String pid = ROOT_PID_VALUE;
-		if(oConvertUtils.isNotEmpty(pcode)) {
-			List<SysCategory> list = baseMapper.selectList(new LambdaQueryWrapper<SysCategory>().eq(SysCategory::getCode, pcode));
-			if(list==null || list.size() ==0) {
-				throw new JeecgBootException("璇ョ紪鐮併��"+pcode+"銆戜笉瀛樺湪锛岃鏍稿疄!");
-			}
-			if(list.size()>1) {
-				throw new JeecgBootException("璇ョ紪鐮併��"+pcode+"銆戝瓨鍦ㄥ涓紝璇锋牳瀹�!");
-			}
-			pid = list.get(0).getId();
-		}
-		return baseMapper.queryListByPid(pid,null);
-	}
+    @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 {
+            //濡傛灉褰撳墠鑺傜偣鐖禝D涓嶄负绌� 鍒欒缃埗鑺傜偣鐨刪asChild 涓�1
+            SysCategory parent = sysCategoryMapper.selectById(sysCategory.getPid());
+            if (parent != null && !ISysCategoryService.HAS_CHILD.equals(parent.getHasChild())) {
+                parent.setHasChild(ISysCategoryService.HAS_CHILD);
+                sysCategoryMapper.updateById(parent);
+            } else {
+                sysCategory.setPid(ISysCategoryService.ROOT_PID_VALUE);
+            }
+        }
+        sysCategoryMapper.updateById(sysCategory);
+    }
 
-	@Override
-	public List<TreeSelectModel> queryListByPid(String pid) {
-		if(oConvertUtils.isEmpty(pid)) {
-			pid = ROOT_PID_VALUE;
-		}
-		return baseMapper.queryListByPid(pid,null);
-	}
+    @Override
+    public List<TreeSelectModel> queryListByCode(String pcode) throws JeecgBootException {
+        String pid = ROOT_PID_VALUE;
+        if (oConvertUtils.isNotEmpty(pcode)) {
+            List<SysCategory> list = baseMapper.selectList(new LambdaQueryWrapper<SysCategory>().eq(SysCategory::getCode, pcode));
+            if (list == null || list.size() == 0) {
+                throw new JeecgBootException("璇ョ紪鐮併��" + pcode + "銆戜笉瀛樺湪锛岃鏍稿疄!");
+            }
+            if (list.size() > 1) {
+                throw new JeecgBootException("璇ョ紪鐮併��" + pcode + "銆戝瓨鍦ㄥ涓紝璇锋牳瀹�!");
+            }
+            pid = list.get(0).getId();
+        }
+        return baseMapper.queryListByPid(pid, null);
+    }
 
-	@Override
-	public List<TreeSelectModel> queryListByPid(String pid, Map<String, String> condition) {
-		if(oConvertUtils.isEmpty(pid)) {
-			pid = ROOT_PID_VALUE;
-		}
-		return baseMapper.queryListByPid(pid,condition);
-	}
+    @Override
+    public List<TreeSelectModel> queryListByPid(String pid) {
+        if (oConvertUtils.isEmpty(pid)) {
+            pid = ROOT_PID_VALUE;
+        }
+        return baseMapper.queryListByPid(pid, null);
+    }
 
-	@Override
-	public String queryIdByCode(String code) {
-		return baseMapper.queryIdByCode(code);
-	}
+    @Override
+    public List<TreeSelectModel> queryListByPid(String pid, Map<String, String> condition) {
+        if (oConvertUtils.isEmpty(pid)) {
+            pid = ROOT_PID_VALUE;
+        }
+        return baseMapper.queryListByPid(pid, condition);
+    }
 
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void deleteSysCategory(String ids) {
-		String allIds = this.queryTreeChildIds(ids);
-		String pids = this.queryTreePids(ids);
-		//1.鍒犻櫎鏃跺皢鑺傜偣涓嬫墍鏈夊瓙鑺傜偣涓�骞跺垹闄�
-		this.baseMapper.deleteBatchIds(Arrays.asList(allIds.split(",")));
-		//2.灏嗙埗鑺傜偣涓凡缁忔病鏈変笅绾х殑鑺傜偣锛屼慨鏀逛负娌℃湁瀛愯妭鐐�
-		if(oConvertUtils.isNotEmpty(pids)){
-			LambdaUpdateWrapper<SysCategory> updateWrapper = new UpdateWrapper<SysCategory>()
-					.lambda()
-					.in(SysCategory::getId,Arrays.asList(pids.split(",")))
-					.set(SysCategory::getHasChild,"0");
-			this.update(updateWrapper);
-		}
-	}
+    @Override
+    public String queryIdByCode(String code) {
+        return baseMapper.queryIdByCode(code);
+    }
 
-	/**
-	 * 鏌ヨ鑺傜偣涓嬫墍鏈夊瓙鑺傜偣
-	 * @param ids
-	 * @return
-	 */
-	private String queryTreeChildIds(String ids) {
-		//鑾峰彇id鏁扮粍
-		String[] idArr = ids.split(",");
-		StringBuffer sb = new StringBuffer();
-		for (String pidVal : idArr) {
-			if(pidVal != null){
-				if(!sb.toString().contains(pidVal)){
-					if(sb.toString().length() > 0){
-						sb.append(",");
-					}
-					sb.append(pidVal);
-					this.getTreeChildIds(pidVal,sb);
-				}
-			}
-		}
-		return sb.toString();
-	}
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteSysCategory(String ids) {
+        String allIds = this.queryTreeChildIds(ids);
+        String pids = this.queryTreePids(ids);
+        //1.鍒犻櫎鏃跺皢鑺傜偣涓嬫墍鏈夊瓙鑺傜偣涓�骞跺垹闄�
+        this.baseMapper.deleteBatchIds(Arrays.asList(allIds.split(",")));
+        //2.灏嗙埗鑺傜偣涓凡缁忔病鏈変笅绾х殑鑺傜偣锛屼慨鏀逛负娌℃湁瀛愯妭鐐�
+        if (oConvertUtils.isNotEmpty(pids)) {
+            LambdaUpdateWrapper<SysCategory> updateWrapper = new UpdateWrapper<SysCategory>()
+                    .lambda()
+                    .in(SysCategory::getId, Arrays.asList(pids.split(",")))
+                    .set(SysCategory::getHasChild, "0");
+            this.update(updateWrapper);
+        }
+    }
 
-	/**
-	 * 鏌ヨ闇�淇敼鏍囪瘑鐨勭埗鑺傜偣ids
-	 * @param ids
-	 * @return
-	 */
-	private String queryTreePids(String ids) {
-		StringBuffer sb = new StringBuffer();
-		//鑾峰彇id鏁扮粍
-		String[] idArr = ids.split(",");
-		for (String id : idArr) {
-			if(id != null){
-				SysCategory category = this.baseMapper.selectById(id);
-				//鏍规嵁id鏌ヨpid鍊�
-				String metaPid = category.getPid();
-				//鏌ヨ姝よ妭鐐逛笂涓�绾ф槸鍚﹁繕鏈夊叾浠栧瓙鑺傜偣
-				LambdaQueryWrapper<SysCategory> queryWrapper = new LambdaQueryWrapper<>();
-				queryWrapper.eq(SysCategory::getPid,metaPid);
-				queryWrapper.notIn(SysCategory::getId,Arrays.asList(idArr));
-				List<SysCategory> dataList = this.baseMapper.selectList(queryWrapper);
-                boolean flag = (dataList == null || dataList.size()==0) && !Arrays.asList(idArr).contains(metaPid)
+    /**
+     * 鏌ヨ鑺傜偣涓嬫墍鏈夊瓙鑺傜偣
+     *
+     * @param ids
+     * @return
+     */
+    private String queryTreeChildIds(String ids) {
+        //鑾峰彇id鏁扮粍
+        String[] idArr = ids.split(",");
+        StringBuffer sb = new StringBuffer();
+        for (String pidVal : idArr) {
+            if (pidVal != null) {
+                if (!sb.toString().contains(pidVal)) {
+                    if (sb.toString().length() > 0) {
+                        sb.append(",");
+                    }
+                    sb.append(pidVal);
+                    this.getTreeChildIds(pidVal, sb);
+                }
+            }
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 鏌ヨ闇�淇敼鏍囪瘑鐨勭埗鑺傜偣ids
+     *
+     * @param ids
+     * @return
+     */
+    private String queryTreePids(String ids) {
+        StringBuffer sb = new StringBuffer();
+        //鑾峰彇id鏁扮粍
+        String[] idArr = ids.split(",");
+        for (String id : idArr) {
+            if (id != null) {
+                SysCategory category = this.baseMapper.selectById(id);
+                //鏍规嵁id鏌ヨpid鍊�
+                String metaPid = category.getPid();
+                //鏌ヨ姝よ妭鐐逛笂涓�绾ф槸鍚﹁繕鏈夊叾浠栧瓙鑺傜偣
+                LambdaQueryWrapper<SysCategory> queryWrapper = new LambdaQueryWrapper<>();
+                queryWrapper.eq(SysCategory::getPid, metaPid);
+                queryWrapper.notIn(SysCategory::getId, Arrays.asList(idArr));
+                List<SysCategory> dataList = this.baseMapper.selectList(queryWrapper);
+                boolean flag = (dataList == null || dataList.size() == 0) && !Arrays.asList(idArr).contains(metaPid)
                         && !sb.toString().contains(metaPid);
-                if(flag){
-					//濡傛灉褰撳墠鑺傜偣鍘熸湰鏈夊瓙鑺傜偣 鐜板湪鏈ㄦ湁浜嗭紝鏇存柊鐘舵��
-					sb.append(metaPid).append(",");
-				}
-			}
-		}
-		if(sb.toString().endsWith(SymbolConstant.COMMA)){
-			sb = sb.deleteCharAt(sb.length() - 1);
-		}
-		return sb.toString();
-	}
+                if (flag) {
+                    //濡傛灉褰撳墠鑺傜偣鍘熸湰鏈夊瓙鑺傜偣 鐜板湪鏈ㄦ湁浜嗭紝鏇存柊鐘舵��
+                    sb.append(metaPid).append(",");
+                }
+            }
+        }
+        if (sb.toString().endsWith(SymbolConstant.COMMA)) {
+            sb = sb.deleteCharAt(sb.length() - 1);
+        }
+        return sb.toString();
+    }
 
-	/**
-	 * 閫掑綊 鏍规嵁鐖秈d鑾峰彇瀛愯妭鐐筰d
-	 * @param pidVal
-	 * @param sb
-	 * @return
-	 */
-	private StringBuffer getTreeChildIds(String pidVal,StringBuffer sb){
-		LambdaQueryWrapper<SysCategory> queryWrapper = new LambdaQueryWrapper<>();
-		queryWrapper.eq(SysCategory::getPid,pidVal);
-		List<SysCategory> dataList = baseMapper.selectList(queryWrapper);
-		if(dataList != null && dataList.size()>0){
-			for(SysCategory category : dataList) {
-				if(!sb.toString().contains(category.getId())){
-					sb.append(",").append(category.getId());
-				}
-				this.getTreeChildIds(category.getId(), sb);
-			}
-		}
-		return sb;
-	}
+    /**
+     * 閫掑綊 鏍规嵁鐖秈d鑾峰彇瀛愯妭鐐筰d
+     *
+     * @param pidVal
+     * @param sb
+     * @return
+     */
+    private StringBuffer getTreeChildIds(String pidVal, StringBuffer sb) {
+        LambdaQueryWrapper<SysCategory> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SysCategory::getPid, pidVal);
+        List<SysCategory> dataList = baseMapper.selectList(queryWrapper);
+        if (dataList != null && dataList.size() > 0) {
+            for (SysCategory category : dataList) {
+                if (!sb.toString().contains(category.getId())) {
+                    sb.append(",").append(category.getId());
+                }
+                this.getTreeChildIds(category.getId(), sb);
+            }
+        }
+        return sb;
+    }
 
-	@Override
-	public List<String> loadDictItem(String ids) {
-		return this.loadDictItem(ids, true);
-	}
+    @Override
+    public List<String> loadDictItem(String ids) {
+        return this.loadDictItem(ids, true);
+    }
 
-	@Override
-	public List<String> loadDictItem(String ids, boolean delNotExist) {
-		String[] idArray = ids.split(",");
-		LambdaQueryWrapper<SysCategory> query = new LambdaQueryWrapper<>();
-		query.in(SysCategory::getId, Arrays.asList(idArray));
-		// 鏌ヨ鏁版嵁
-		List<SysCategory> list = super.list(query);
-		// 鍙栧嚭name骞惰繑鍥�
-		List<String> textList;
-		// update-begin--author:sunjianlei--date:20210514--for锛氭柊澧瀌elNotExist鍙傛暟锛岃涓篺alse涓嶅垹闄ゆ暟鎹簱閲屼笉瀛樺湪鐨刱ey ----
-		if (delNotExist) {
-			textList = list.stream().map(SysCategory::getName).collect(Collectors.toList());
-		} else {
-			textList = new ArrayList<>();
-			for (String id : idArray) {
-				List<SysCategory> res = list.stream().filter(i -> id.equals(i.getId())).collect(Collectors.toList());
-				textList.add(res.size() > 0 ? res.get(0).getName() : id);
-			}
-		}
-		// update-end--author:sunjianlei--date:20210514--for锛氭柊澧瀌elNotExist鍙傛暟锛岃涓篺alse涓嶅垹闄ゆ暟鎹簱閲屼笉瀛樺湪鐨刱ey ----
-		return textList;
-	}
+    @Override
+    public List<String> loadDictItem(String ids, boolean delNotExist) {
+        String[] idArray = ids.split(",");
+        LambdaQueryWrapper<SysCategory> query = new LambdaQueryWrapper<>();
+        query.in(SysCategory::getId, Arrays.asList(idArray));
+        // 鏌ヨ鏁版嵁
+        List<SysCategory> list = super.list(query);
+        // 鍙栧嚭name骞惰繑鍥�
+        List<String> textList;
+        // update-begin--author:sunjianlei--date:20210514--for锛氭柊澧瀌elNotExist鍙傛暟锛岃涓篺alse涓嶅垹闄ゆ暟鎹簱閲屼笉瀛樺湪鐨刱ey ----
+        if (delNotExist) {
+            textList = list.stream().map(SysCategory::getName).collect(Collectors.toList());
+        } else {
+            textList = new ArrayList<>();
+            for (String id : idArray) {
+                List<SysCategory> res = list.stream().filter(i -> id.equals(i.getId())).collect(Collectors.toList());
+                textList.add(res.size() > 0 ? res.get(0).getName() : id);
+            }
+        }
+        // update-end--author:sunjianlei--date:20210514--for锛氭柊澧瀌elNotExist鍙傛暟锛岃涓篺alse涓嶅垹闄ゆ暟鎹簱閲屼笉瀛樺湪鐨刱ey ----
+        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);
+    }
 
 }

--
Gitblit v1.9.3