ソースを参照

样品分类树状结构

LLL 1 年間 前
コミット
62ef34ee9a

+ 137 - 17
itdmServer/module-iTDM/src/main/java/org/jeecg/modules/inventory/controller/ItdmSampleClassificationController.java

@@ -12,6 +12,7 @@ import javax.servlet.http.HttpServletResponse;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.common.system.vo.SelectTreeModel;
 import org.jeecg.modules.inventory.entity.ItdmSampleClassification;
 import org.jeecg.modules.inventory.service.IItdmSampleClassificationService;
 
@@ -39,17 +40,17 @@ import org.jeecg.common.aspect.annotation.AutoLog;
  /**
  * @Description: 样品分类表
  * @Author: jeecg-boot
- * @Date:   2023-06-26
+ * @Date:   2023-06-29
  * @Version: V1.0
  */
 @Api(tags="样品分类表")
 @RestController
 @RequestMapping("/inventory/itdmSampleClassification")
 @Slf4j
-public class ItdmSampleClassificationController extends JeecgController<ItdmSampleClassification, IItdmSampleClassificationService> {
+public class ItdmSampleClassificationController extends JeecgController<ItdmSampleClassification, IItdmSampleClassificationService>{
 	@Autowired
 	private IItdmSampleClassificationService itdmSampleClassificationService;
-	
+
 	/**
 	 * 分页列表查询
 	 *
@@ -61,16 +62,135 @@ public class ItdmSampleClassificationController extends JeecgController<ItdmSamp
 	 */
 	//@AutoLog(value = "样品分类表-分页列表查询")
 	@ApiOperation(value="样品分类表-分页列表查询", notes="样品分类表-分页列表查询")
-	@GetMapping(value = "/list")
+	@GetMapping(value = "/rootList")
 	public Result<IPage<ItdmSampleClassification>> queryPageList(ItdmSampleClassification itdmSampleClassification,
 								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
 								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
 								   HttpServletRequest req) {
+		String hasQuery = req.getParameter("hasQuery");
+        if(hasQuery != null && "true".equals(hasQuery)){
+            QueryWrapper<ItdmSampleClassification> queryWrapper =  QueryGenerator.initQueryWrapper(itdmSampleClassification, req.getParameterMap());
+            List<ItdmSampleClassification> list = itdmSampleClassificationService.queryTreeListNoPage(queryWrapper);
+            IPage<ItdmSampleClassification> pageList = new Page<>(1, 10, list.size());
+            pageList.setRecords(list);
+            return Result.OK(pageList);
+        }else{
+            String parentId = itdmSampleClassification.getPid();
+            if (oConvertUtils.isEmpty(parentId)) {
+                parentId = "0";
+            }
+            itdmSampleClassification.setPid(null);
+            QueryWrapper<ItdmSampleClassification> queryWrapper = QueryGenerator.initQueryWrapper(itdmSampleClassification, req.getParameterMap());
+            // 使用 eq 防止模糊查询
+            queryWrapper.eq("pid", parentId);
+            Page<ItdmSampleClassification> page = new Page<ItdmSampleClassification>(pageNo, pageSize);
+            IPage<ItdmSampleClassification> pageList = itdmSampleClassificationService.page(page, queryWrapper);
+            return Result.OK(pageList);
+        }
+	}
+
+	 /**
+	  * 【vue3专用】加载节点的子数据
+	  *
+	  * @param pid
+	  * @return
+	  */
+	 @RequestMapping(value = "/loadTreeChildren", method = RequestMethod.GET)
+	 public Result<List<SelectTreeModel>> loadTreeChildren(@RequestParam(name = "pid") String pid) {
+		 Result<List<SelectTreeModel>> result = new Result<>();
+		 try {
+			 List<SelectTreeModel> ls = itdmSampleClassificationService.queryListByPid(pid);
+			 result.setResult(ls);
+			 result.setSuccess(true);
+		 } catch (Exception e) {
+			 e.printStackTrace();
+			 result.setMessage(e.getMessage());
+			 result.setSuccess(false);
+		 }
+		 return result;
+	 }
+
+	 /**
+	  * 【vue3专用】加载一级节点/如果是同步 则所有数据
+	  *
+	  * @param async
+	  * @param pcode
+	  * @return
+	  */
+	 @RequestMapping(value = "/loadTreeRoot", method = RequestMethod.GET)
+	 public Result<List<SelectTreeModel>> loadTreeRoot(@RequestParam(name = "async") Boolean async, @RequestParam(name = "pcode") String pcode) {
+		 Result<List<SelectTreeModel>> result = new Result<>();
+		 try {
+			 List<SelectTreeModel> ls = itdmSampleClassificationService.queryListByCode(pcode);
+			 if (!async) {
+				 loadAllChildren(ls);
+			 }
+			 result.setResult(ls);
+			 result.setSuccess(true);
+		 } catch (Exception e) {
+			 e.printStackTrace();
+			 result.setMessage(e.getMessage());
+			 result.setSuccess(false);
+		 }
+		 return result;
+	 }
+
+	 /**
+	  * 【vue3专用】递归求子节点 同步加载用到
+	  *
+	  * @param ls
+	  */
+	 private void loadAllChildren(List<SelectTreeModel> ls) {
+		 for (SelectTreeModel tsm : ls) {
+			 List<SelectTreeModel> temp = itdmSampleClassificationService.queryListByPid(tsm.getKey());
+			 if (temp != null && temp.size() > 0) {
+				 tsm.setChildren(temp);
+				 loadAllChildren(temp);
+			 }
+		 }
+	 }
+
+	 /**
+      * 获取子数据
+      * @param itdmSampleClassification
+      * @param req
+      * @return
+      */
+	//@AutoLog(value = "样品分类表-获取子数据")
+	@ApiOperation(value="样品分类表-获取子数据", notes="样品分类表-获取子数据")
+	@GetMapping(value = "/childList")
+	public Result<IPage<ItdmSampleClassification>> queryPageList(ItdmSampleClassification itdmSampleClassification,HttpServletRequest req) {
 		QueryWrapper<ItdmSampleClassification> queryWrapper = QueryGenerator.initQueryWrapper(itdmSampleClassification, req.getParameterMap());
-		Page<ItdmSampleClassification> page = new Page<ItdmSampleClassification>(pageNo, pageSize);
-		IPage<ItdmSampleClassification> pageList = itdmSampleClassificationService.page(page, queryWrapper);
+		List<ItdmSampleClassification> list = itdmSampleClassificationService.list(queryWrapper);
+		IPage<ItdmSampleClassification> pageList = new Page<>(1, 10, list.size());
+        pageList.setRecords(list);
 		return Result.OK(pageList);
 	}
+
+    /**
+      * 批量查询子节点
+      * @param parentIds 父ID(多个采用半角逗号分割)
+      * @return 返回 IPage
+      * @param parentIds
+      * @return
+      */
+	//@AutoLog(value = "样品分类表-批量获取子数据")
+    @ApiOperation(value="样品分类表-批量获取子数据", notes="样品分类表-批量获取子数据")
+    @GetMapping("/getChildListBatch")
+    public Result getChildListBatch(@RequestParam("parentIds") String parentIds) {
+        try {
+            QueryWrapper<ItdmSampleClassification> queryWrapper = new QueryWrapper<>();
+            List<String> parentIdList = Arrays.asList(parentIds.split(","));
+            queryWrapper.in("pid", parentIdList);
+            List<ItdmSampleClassification> list = itdmSampleClassificationService.list(queryWrapper);
+            IPage<ItdmSampleClassification> 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());
+        }
+    }
 	
 	/**
 	 *   添加
@@ -80,10 +200,10 @@ public class ItdmSampleClassificationController extends JeecgController<ItdmSamp
 	 */
 	@AutoLog(value = "样品分类表-添加")
 	@ApiOperation(value="样品分类表-添加", notes="样品分类表-添加")
-	//@RequiresPermissions("org.jeecg.modules:itdm_sample_classification:add")
+    //@RequiresPermissions("org.jeecg.modules:itdm_sample_classification:add")
 	@PostMapping(value = "/add")
 	public Result<String> add(@RequestBody ItdmSampleClassification itdmSampleClassification) {
-		itdmSampleClassificationService.save(itdmSampleClassification);
+		itdmSampleClassificationService.addItdmSampleClassification(itdmSampleClassification);
 		return Result.OK("添加成功!");
 	}
 	
@@ -95,10 +215,10 @@ public class ItdmSampleClassificationController extends JeecgController<ItdmSamp
 	 */
 	@AutoLog(value = "样品分类表-编辑")
 	@ApiOperation(value="样品分类表-编辑", notes="样品分类表-编辑")
-	//@RequiresPermissions("org.jeecg.modules:itdm_sample_classification:edit")
+    //@RequiresPermissions("org.jeecg.modules:itdm_sample_classification:edit")
 	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
 	public Result<String> edit(@RequestBody ItdmSampleClassification itdmSampleClassification) {
-		itdmSampleClassificationService.updateById(itdmSampleClassification);
+		itdmSampleClassificationService.updateItdmSampleClassification(itdmSampleClassification);
 		return Result.OK("编辑成功!");
 	}
 	
@@ -110,10 +230,10 @@ public class ItdmSampleClassificationController extends JeecgController<ItdmSamp
 	 */
 	@AutoLog(value = "样品分类表-通过id删除")
 	@ApiOperation(value="样品分类表-通过id删除", notes="样品分类表-通过id删除")
-	//@RequiresPermissions("org.jeecg.modules:itdm_sample_classification:delete")
+    //@RequiresPermissions("org.jeecg.modules:itdm_sample_classification:delete")
 	@DeleteMapping(value = "/delete")
 	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
-		itdmSampleClassificationService.removeById(id);
+		itdmSampleClassificationService.deleteItdmSampleClassification(id);
 		return Result.OK("删除成功!");
 	}
 	
@@ -125,11 +245,11 @@ public class ItdmSampleClassificationController extends JeecgController<ItdmSamp
 	 */
 	@AutoLog(value = "样品分类表-批量删除")
 	@ApiOperation(value="样品分类表-批量删除", notes="样品分类表-批量删除")
-	//@RequiresPermissions("org.jeecg.modules:itdm_sample_classification:deleteBatch")
+    //@RequiresPermissions("org.jeecg.modules:itdm_sample_classification:deleteBatch")
 	@DeleteMapping(value = "/deleteBatch")
 	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
 		this.itdmSampleClassificationService.removeByIds(Arrays.asList(ids.split(",")));
-		return Result.OK("批量删除成功!");
+		return Result.OK("批量删除成功");
 	}
 	
 	/**
@@ -158,7 +278,7 @@ public class ItdmSampleClassificationController extends JeecgController<ItdmSamp
     //@RequiresPermissions("org.jeecg.modules:itdm_sample_classification:exportXls")
     @RequestMapping(value = "/exportXls")
     public ModelAndView exportXls(HttpServletRequest request, ItdmSampleClassification itdmSampleClassification) {
-        return super.exportXls(request, itdmSampleClassification, ItdmSampleClassification.class, "样品分类表");
+		return super.exportXls(request, itdmSampleClassification, ItdmSampleClassification.class, "样品分类表");
     }
 
     /**
@@ -168,10 +288,10 @@ public class ItdmSampleClassificationController extends JeecgController<ItdmSamp
     * @param response
     * @return
     */
-    //@RequiresPermissions("itdm_sample_classification:importExcel")
+    //@RequiresPermissions("org.jeecg.modules:itdm_sample_classification:importExcel")
     @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
     public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
-        return super.importExcel(request, response, ItdmSampleClassification.class);
+		return super.importExcel(request, response, ItdmSampleClassification.class);
     }
 
 }

+ 7 - 7
itdmServer/module-iTDM/src/main/java/org/jeecg/modules/inventory/entity/ItdmSampleClassification.java

@@ -1,7 +1,6 @@
 package org.jeecg.modules.inventory.entity;
 
 import java.io.Serializable;
-import java.io.UnsupportedEncodingException;
 import java.util.Date;
 import java.math.BigDecimal;
 import com.baomidou.mybatisplus.annotation.IdType;
@@ -15,19 +14,16 @@ import org.jeecgframework.poi.excel.annotation.Excel;
 import org.jeecg.common.aspect.annotation.Dict;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-import lombok.EqualsAndHashCode;
-import lombok.experimental.Accessors;
+import java.io.UnsupportedEncodingException;
 
 /**
  * @Description: 样品分类表
  * @Author: jeecg-boot
- * @Date:   2023-06-26
+ * @Date:   2023-06-29
  * @Version: V1.0
  */
 @Data
 @TableName("itdm_sample_classification")
-@Accessors(chain = true)
-@EqualsAndHashCode(callSuper = false)
 @ApiModel(value="itdm_sample_classification对象", description="样品分类表")
 public class ItdmSampleClassification implements Serializable {
     private static final long serialVersionUID = 1L;
@@ -43,7 +39,6 @@ public class ItdmSampleClassification implements Serializable {
 	/**上级id*/
 	@Excel(name = "上级id", width = 15)
     @ApiModelProperty(value = "上级id")
-    @Dict(dictTable = "itdm_sample_classification", dicText = "name", dicCode = "id")
     private java.lang.String pid;
 	/**状态*/
 	@Excel(name = "状态", width = 15, dicCode = "sample_type_status")
@@ -73,4 +68,9 @@ public class ItdmSampleClassification implements Serializable {
 	/**所属部门*/
     @ApiModelProperty(value = "所属部门")
     private java.lang.String sysOrgCode;
+	/**是否有子节点*/
+	@Excel(name = "是否有子节点", width = 15, dicCode = "yn")
+	@Dict(dicCode = "yn")
+    @ApiModelProperty(value = "是否有子节点")
+    private java.lang.String hasChild;
 }

+ 22 - 4
itdmServer/module-iTDM/src/main/java/org/jeecg/modules/inventory/mapper/ItdmSampleClassificationMapper.java

@@ -1,17 +1,35 @@
 package org.jeecg.modules.inventory.mapper;
 
-import java.util.List;
-
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
+import org.jeecg.common.system.vo.SelectTreeModel;
 import org.jeecg.modules.inventory.entity.ItdmSampleClassification;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
+import java.util.Map;
 
 /**
  * @Description: 样品分类表
  * @Author: jeecg-boot
- * @Date:   2023-06-26
+ * @Date:   2023-06-29
  * @Version: V1.0
  */
 public interface ItdmSampleClassificationMapper extends BaseMapper<ItdmSampleClassification> {
 
+	/**
+	 * 编辑节点状态
+	 * @param id
+	 * @param status
+	 */
+	void updateTreeNodeStatus(@Param("id") String id,@Param("status") String status);
+
+	/**
+	 * 【vue3专用】根据父级ID查询树节点数据
+	 *
+	 * @param pid
+	 * @param query
+	 * @return
+	 */
+	List<SelectTreeModel> queryListByPid(@Param("pid") String pid, @Param("query") Map<String, String> query);
+
 }

+ 20 - 0
itdmServer/module-iTDM/src/main/java/org/jeecg/modules/inventory/mapper/xml/ItdmSampleClassificationMapper.xml

@@ -2,4 +2,24 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.jeecg.modules.inventory.mapper.ItdmSampleClassificationMapper">
 
+	<update id="updateTreeNodeStatus" parameterType="java.lang.String">
+		update itdm_sample_classification set has_child = #{status} where id = #{id}
+	</update>
+
+  	<!-- 【vue3专用】 -->
+	<select id="queryListByPid" parameterType="java.lang.Object" resultType="org.jeecg.common.system.vo.SelectTreeModel">
+		select
+		  id as "key",
+		  name as "title",
+		  (case when has_child = '1' then 0 else 1 end) as isLeaf,
+		  pid as parentId
+		from itdm_sample_classification
+		where pid = #{pid}
+		<if test="query != null">
+			<foreach collection="query.entrySet()" item="value" index="key">
+				and ${key} = #{value}
+			</foreach>
+		</if>
+	</select>
+
 </mapper>

+ 61 - 1
itdmServer/module-iTDM/src/main/java/org/jeecg/modules/inventory/service/IItdmSampleClassificationService.java

@@ -1,14 +1,74 @@
 package org.jeecg.modules.inventory.service;
 
+import org.jeecg.common.system.vo.SelectTreeModel;
 import org.jeecg.modules.inventory.entity.ItdmSampleClassification;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.common.exception.JeecgBootException;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import java.util.List;
 
 /**
  * @Description: 样品分类表
  * @Author: jeecg-boot
- * @Date:   2023-06-26
+ * @Date:   2023-06-29
  * @Version: V1.0
  */
 public interface IItdmSampleClassificationService extends IService<ItdmSampleClassification> {
 
+	/**根节点父ID的值*/
+	public static final String ROOT_PID_VALUE = "0";
+	
+	/**树节点有子节点状态值*/
+	public static final String HASCHILD = "1";
+	
+	/**树节点无子节点状态值*/
+	public static final String NOCHILD = "0";
+
+	/**
+	 * 新增节点
+	 *
+	 * @param itdmSampleClassification
+	 */
+	void addItdmSampleClassification(ItdmSampleClassification itdmSampleClassification);
+	
+	/**
+   * 修改节点
+   *
+   * @param itdmSampleClassification
+   * @throws JeecgBootException
+   */
+	void updateItdmSampleClassification(ItdmSampleClassification itdmSampleClassification) throws JeecgBootException;
+	
+	/**
+	 * 删除节点
+	 *
+	 * @param id
+   * @throws JeecgBootException
+	 */
+	void deleteItdmSampleClassification(String id) throws JeecgBootException;
+
+	  /**
+	   * 查询所有数据,无分页
+	   *
+	   * @param queryWrapper
+	   * @return List<ItdmSampleClassification>
+	   */
+    List<ItdmSampleClassification> queryTreeListNoPage(QueryWrapper<ItdmSampleClassification> queryWrapper);
+
+	/**
+	 * 【vue3专用】根据父级编码加载分类字典的数据
+	 *
+	 * @param parentCode
+	 * @return
+	 */
+	List<SelectTreeModel> queryListByCode(String parentCode);
+
+	/**
+	 * 【vue3专用】根据pid查询子节点集合
+	 *
+	 * @param pid
+	 * @return
+	 */
+	List<SelectTreeModel> queryListByPid(String pid);
+
 }

+ 201 - 1
itdmServer/module-iTDM/src/main/java/org/jeecg/modules/inventory/service/impl/ItdmSampleClassificationServiceImpl.java

@@ -1,19 +1,219 @@
 package org.jeecg.modules.inventory.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.common.system.vo.SelectTreeModel;
 import org.jeecg.modules.inventory.entity.ItdmSampleClassification;
 import org.jeecg.modules.inventory.mapper.ItdmSampleClassificationMapper;
 import org.jeecg.modules.inventory.service.IItdmSampleClassificationService;
 import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.springframework.transaction.annotation.Transactional;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
 /**
  * @Description: 样品分类表
  * @Author: jeecg-boot
- * @Date:   2023-06-26
+ * @Date:   2023-06-29
  * @Version: V1.0
  */
 @Service
 public class ItdmSampleClassificationServiceImpl extends ServiceImpl<ItdmSampleClassificationMapper, ItdmSampleClassification> implements IItdmSampleClassificationService {
 
+	@Override
+	public void addItdmSampleClassification(ItdmSampleClassification itdmSampleClassification) {
+	   //新增时设置hasChild为0
+	    itdmSampleClassification.setHasChild(IItdmSampleClassificationService.NOCHILD);
+		if(oConvertUtils.isEmpty(itdmSampleClassification.getPid())){
+			itdmSampleClassification.setPid(IItdmSampleClassificationService.ROOT_PID_VALUE);
+		}else{
+			//如果当前节点父ID不为空 则设置父节点的hasChildren 为1
+			ItdmSampleClassification parent = baseMapper.selectById(itdmSampleClassification.getPid());
+			if(parent!=null && !"1".equals(parent.getHasChild())){
+				parent.setHasChild("1");
+				baseMapper.updateById(parent);
+			}
+		}
+		baseMapper.insert(itdmSampleClassification);
+	}
+	
+	@Override
+	public void updateItdmSampleClassification(ItdmSampleClassification itdmSampleClassification) {
+		ItdmSampleClassification entity = this.getById(itdmSampleClassification.getId());
+		if(entity==null) {
+			throw new JeecgBootException("未找到对应实体");
+		}
+		String old_pid = entity.getPid();
+		String new_pid = itdmSampleClassification.getPid();
+		if(!old_pid.equals(new_pid)) {
+			updateOldParentNode(old_pid);
+			if(oConvertUtils.isEmpty(new_pid)){
+				itdmSampleClassification.setPid(IItdmSampleClassificationService.ROOT_PID_VALUE);
+			}
+			if(!IItdmSampleClassificationService.ROOT_PID_VALUE.equals(itdmSampleClassification.getPid())) {
+				baseMapper.updateTreeNodeStatus(itdmSampleClassification.getPid(), IItdmSampleClassificationService.HASCHILD);
+			}
+		}
+		baseMapper.updateById(itdmSampleClassification);
+	}
+	
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void deleteItdmSampleClassification(String id) throws JeecgBootException {
+		//查询选中节点下所有子节点一并删除
+        id = this.queryTreeChildIds(id);
+        if(id.indexOf(",")>0) {
+            StringBuffer sb = new StringBuffer();
+            String[] idArr = id.split(",");
+            for (String idVal : idArr) {
+                if(idVal != null){
+                    ItdmSampleClassification itdmSampleClassification = this.getById(idVal);
+                    String pidVal = itdmSampleClassification.getPid();
+                    //查询此节点上一级是否还有其他子节点
+                    List<ItdmSampleClassification> dataList = baseMapper.selectList(new QueryWrapper<ItdmSampleClassification>().eq("pid", pidVal).notIn("id",Arrays.asList(idArr)));
+                    boolean flag = (dataList == null || dataList.size() == 0) && !Arrays.asList(idArr).contains(pidVal) && !sb.toString().contains(pidVal);
+                    if(flag){
+                        //如果当前节点原本有子节点 现在木有了,更新状态
+                        sb.append(pidVal).append(",");
+                    }
+                }
+            }
+            //批量删除节点
+            baseMapper.deleteBatchIds(Arrays.asList(idArr));
+            //修改已无子节点的标识
+            String[] pidArr = sb.toString().split(",");
+            for(String pid : pidArr){
+                this.updateOldParentNode(pid);
+            }
+        }else{
+            ItdmSampleClassification itdmSampleClassification = this.getById(id);
+            if(itdmSampleClassification==null) {
+                throw new JeecgBootException("未找到对应实体");
+            }
+            updateOldParentNode(itdmSampleClassification.getPid());
+            baseMapper.deleteById(id);
+        }
+	}
+	
+	@Override
+    public List<ItdmSampleClassification> queryTreeListNoPage(QueryWrapper<ItdmSampleClassification> queryWrapper) {
+        List<ItdmSampleClassification> dataList = baseMapper.selectList(queryWrapper);
+        List<ItdmSampleClassification> mapList = new ArrayList<>();
+        for(ItdmSampleClassification data : dataList){
+            String pidVal = data.getPid();
+            //递归查询子节点的根节点
+            if(pidVal != null && !IItdmSampleClassificationService.NOCHILD.equals(pidVal)){
+                ItdmSampleClassification rootVal = this.getTreeRoot(pidVal);
+                if(rootVal != null && !mapList.contains(rootVal)){
+                    mapList.add(rootVal);
+                }
+            }else{
+                if(!mapList.contains(data)){
+                    mapList.add(data);
+                }
+            }
+        }
+        return mapList;
+    }
+
+    @Override
+    public List<SelectTreeModel> queryListByCode(String parentCode) {
+        String pid = ROOT_PID_VALUE;
+        if (oConvertUtils.isNotEmpty(parentCode)) {
+            LambdaQueryWrapper<ItdmSampleClassification> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(ItdmSampleClassification::getPid, parentCode);
+            List<ItdmSampleClassification> list = baseMapper.selectList(queryWrapper);
+            if (list == null || list.size() == 0) {
+                throw new JeecgBootException("该编码【" + parentCode + "】不存在,请核实!");
+            }
+            if (list.size() > 1) {
+                throw new JeecgBootException("该编码【" + parentCode + "】存在多个,请核实!");
+            }
+            pid = list.get(0).getId();
+        }
+        return baseMapper.queryListByPid(pid, null);
+    }
+
+    @Override
+    public List<SelectTreeModel> queryListByPid(String pid) {
+        if (oConvertUtils.isEmpty(pid)) {
+            pid = ROOT_PID_VALUE;
+        }
+        return baseMapper.queryListByPid(pid, null);
+    }
+
+	/**
+	 * 根据所传pid查询旧的父级节点的子节点并修改相应状态值
+	 * @param pid
+	 */
+	private void updateOldParentNode(String pid) {
+		if(!IItdmSampleClassificationService.ROOT_PID_VALUE.equals(pid)) {
+			Long count = baseMapper.selectCount(new QueryWrapper<ItdmSampleClassification>().eq("pid", pid));
+			if(count==null || count<=1) {
+				baseMapper.updateTreeNodeStatus(pid, IItdmSampleClassificationService.NOCHILD);
+			}
+		}
+	}
+
+	/**
+     * 递归查询节点的根节点
+     * @param pidVal
+     * @return
+     */
+    private ItdmSampleClassification getTreeRoot(String pidVal){
+        ItdmSampleClassification data =  baseMapper.selectById(pidVal);
+        if(data != null && !IItdmSampleClassificationService.ROOT_PID_VALUE.equals(data.getPid())){
+            return this.getTreeRoot(data.getPid());
+        }else{
+            return data;
+        }
+    }
+
+    /**
+     * 根据id查询所有子节点id
+     * @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();
+    }
+
+    /**
+     * 递归查询所有子节点
+     * @param pidVal
+     * @param sb
+     * @return
+     */
+    private StringBuffer getTreeChildIds(String pidVal,StringBuffer sb){
+        List<ItdmSampleClassification> dataList = baseMapper.selectList(new QueryWrapper<ItdmSampleClassification>().eq("pid", pidVal));
+        if(dataList != null && dataList.size()>0){
+            for(ItdmSampleClassification tree : dataList) {
+                if(!sb.toString().contains(tree.getId())){
+                    sb.append(",").append(tree.getId());
+                }
+                this.getTreeChildIds(tree.getId(),sb);
+            }
+        }
+        return sb;
+    }
+
 }