这里以大科室和小科为例子,并使用stream流的方式封装
创建一个你需要封装成什么结构的vo封装对象
- 封装vo对象
@Data
@ApiModel(description = "Department")
public class DepartmentVo {
@ApiModelProperty(value = "科室编号")
private String depcode;
@ApiModelProperty(value = "科室名称")
private String depname;
@ApiModelProperty(value = "下级节点")
private List<DepartmentVo> children;
}
- 控制器
@RestController
@RequestMapping("/admin/hosp/department")
public class DepartmentController {
@Autowired
private DepartmentService departmentService;
//根据医院编号,查询医院所有科室列表
@GetMapping("/getDeptList/{hoscode}")
public Result getDeptList(@PathVariable String hoscode){
List<DepartmentVo> list = departmentService.findDeptTree(hoscode);
return Result.ok(list);
}
}
- 接口
根据医院编号,查询医院所有科室列表
List<DepartmentVo> findDeptTree(String hoscode);
1、先创建一个用于封装返回的最终数据的list集合
2、根据对应的条件,获取到装有所有数据的list集合
(下面使用的mongoDB所有就先new了对应的实体类,封装了下对应的code,查询获取到所有数据的集合)3、使用List中的stream流进行分类
(Department::getBigcode)
,根据Department实体类中的Bigcode属性进行分类,获取到分类后的KV键值对的Map,K是Bigcode(大科室编号),V是所有数据,包含大科室和小科室
------------------------一层遍历------------------------
4、遍历分类后的map集合,这里采用获取到Map中的entry对象,获取到KV
5、K为大科室的编号,V为大科室编号对应的全部数据(包含这个大科室+对应小科室的全部数据)
6、new一个上面对应你想要封装成的结构对象,封装除了小科室意外的别的数据,并等待一会装接下来小科室封装后的list集合
7、new一个用来封装小科室的list集合
_------------------二层遍历-----------------------
8、上面map集合中,再遍历包含大科室所有数据的list集合
9、在遍历中new一个上面你对应你想要封装成的结构对象,并用来封装小科室
10、封装对应的值,并将其加入到上面,封装大科室数据的结构对象中
_--------------------二层遍历----------------------
11、将二层遍历中封装好的结构对象,设置到到一层遍历中的结构对象中的child属性中
12、将一层遍历对象加入到最终的封装对象的list集合中
_---------------------一层遍历--------------------------
13、返回最终封装的list集合
- impl
//根据医院编号,查询医院所有科室列表
//根据医院编号,查询医院所有科室列表
@Override
public List<DepartmentVo> findDeptTree(String hoscode) {
//创建list集合,用于封装最终的数据
ArrayList<DepartmentVo> resultList = new ArrayList<>();
//根据医院编号,查询医院所有科室信息
Department department = new Department();
department.setHoscode(hoscode);
Example<Department> example = Example.of(department);
//所有科室列表信息
List<Department> departmentList = departmentRepository.findAll(example);
//根据大科室编号 分组
Map<String, List<Department>> departmentMap = departmentList.stream().collect(Collectors.groupingBy(Department::getBigcode));
//遍历map集合
for (Map.Entry<String,List<Department>> entry : departmentMap.entrySet()){
//大科室编号
String bigCode = entry.getKey();
//大科室编号对应的全部数据
List<Department> bigCodeList = entry.getValue();
//封装大科室
DepartmentVo departmentVo = new DepartmentVo();
departmentVo.setDepcode(bigCode);
departmentVo.setDepname(bigCodeList.get(0).getBigname());
//封装小科室
List<DepartmentVo> child = new ArrayList<>();
for (Department department1 : bigCodeList) {
//遍历大科室数据中的所有小科室
DepartmentVo departmentVo1 = new DepartmentVo();
departmentVo1.setDepcode(department1.getDepcode());
departmentVo1.setDepname(department1.getDepname());
//封装小科室
child.add(departmentVo1);
}
//把小科室list集合放到大科室child对象中
departmentVo.setChildren(child);
//放入最终的返回集合中
resultList.add(departmentVo);
}
return resultList;
}
这样子就可以封装二级的树形结构的数据,并以上的json形式返回