尚医通即为网上预约挂号系统,网上预约挂号是近年来开展的一项便民就医服务,旨在缓解看病难、挂号难的就医难题,许多患者为看一次病要跑很多次医院,最终还不一定能保证看得上医生。网上预约挂号全面提供的预约挂号业务从根本上解决了这一就医难题。随时随地轻松挂号!不用排长队!
pom
4.0.0
common
model
service
server-gateway
service-client
hospital-manage
org.springframework.boot
spring-boot-starter-parent
2.2.1.RELEASE
pers.jl
hospital
1.0
pom
1.8
Hoxton.RELEASE
2.2.0.RELEASE
3.3.1
8.0
2.7.0
0.7.0
1.2.29
4.5.1
2.2.0-beta2
4.1.1
3.9.1
2.10.1
org.springframework.cloud
spring-cloud-dependencies
${cloud.version}
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
${alibaba.version}
pom
import
com.baomidou
mybatis-plus-boot-starter
${mybatis-plus.version}
mysql
mysql-connector-java
${mysql.version}
io.springfox
springfox-swagger2
${swagger.version}
io.springfox
springfox-swagger-ui
${swagger.version}
io.jsonwebtoken
jjwt
${jwt.version}
org.apache.httpcomponents
httpclient
${httpclient.version}
com.alibaba
fastjson
${fastjson.version}
com.alibaba
easyexcel
${easyexcel.version}
com.aliyun
aliyun-java-sdk-core
${aliyun.version}
com.aliyun.oss
aliyun-sdk-oss
${oss.version}
joda-time
joda-time
${jodatime.version}
4.0.0
hospital
pers.jl
1.0
common
pom
1.0
org.springframework.boot
spring-boot-starter-web
provided
com.baomidou
mybatis-plus-boot-starter
provided
org.projectlombok
lombok
io.springfox
springfox-swagger2
io.springfox
springfox-swagger-ui
common
pers.jl
1.0
4.0.0
common-util
1.0
jar
common-util
common-util
org.apache.httpcomponents
httpclient
com.alibaba
fastjson
io.jsonwebtoken
jjwt
com.alibaba
easyexcel
joda-time
joda-time
common
pers.jl
1.0
4.0.0
service-util
1.0
jar
service-util
service-util
pers.jl
common-util
1.0
org.springframework.boot
spring-boot-starter-data-redis
org.apache.commons
commons-pool2
2.6.0
hospital
pers.jl
1.0
4.0.0
model
1.0
jar
model
model
org.projectlombok
lombok
com.baomidou
mybatis-plus-boot-starter
provided
io.springfox
springfox-swagger2
provided
com.alibaba
easyexcel
provided
org.springframework.boot
spring-boot-starter-data-mongodb
provided
com.alibaba
fastjson
provided
hospital
pers.jl
1.0
4.0.0
service
pom
1.0
pers.jl
service-util
1.0
pers.jl
model
1.0
org.springframework.boot
spring-boot-starter-web
com.baomidou
mybatis-plus-boot-starter
mysql
mysql-connector-java
org.springframework.boot
spring-boot-devtools
true
org.springframework.cloud
spring-cloud-starter-openfeign
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
com.alibaba.cloud
spring-cloud-starter-alibaba-sentinel
org.springframework.boot
spring-boot-maven-plugin
src/main/java
**/*.yml
**/*.properties
**/*.xml
false
src/main/resources
**/*.yml
**/*.properties
**/*.xml
false
// 根据id查询子数据
@Override
public List getDictById(int id) {
LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
// 父id等于当前id的数据全部查出来
lambdaQueryWrapper.eq(Dict::getParentId,id);
List list = this.list(lambdaQueryWrapper);
// 对集合中的每个子数据做判断,判断是否含有子数据,给hasChildren赋值
list.stream().map(item -> {
boolean res = check(item.getId());
item.setHasChildren(res);
return item;
}).collect(Collectors.toList());
return list;
}
// 判断是否含有子节点
public boolean check(long id){
LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(Dict::getParentId,id);
// 统计子数据个数
long count = this.count(lambdaQueryWrapper);
return count > 0;
}
service层
// 导出成excel文件
@Override
public void exportExcel(HttpServletResponse response) {
// 1. 设置下载信息
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = "dict";// 设置文件名
// 在头信息中设置,以下载方式打开
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
// 2. 查询数据
List dictList = this.list();
// 将数据替换成DictEeVo对象封装到响应体,安全。
List dictEeVoList = dictList.stream().map(item -> {
DictEeVo dictEeVo = new DictEeVo();
BeanUtils.copyProperties(item, dictEeVo);
return dictEeVo;
}).collect(Collectors.toList());
// 3. 导出
try {
EasyExcel.write(response.getOutputStream(),DictEeVo.class)
.sheet("数据字典")
.doWrite(dictEeVoList);
} catch (IOException e) {
// 导出失败抛出异常
throw new YyghException("数据导出失败!",404);
}
}
监听器
public class DictListener extends AnalysisEventListener {
private IDictService dictService;
public DictListener(IDictService dictService) {
this.dictService = dictService;
}
//一行一行读取
@Override
public void invoke(DictEeVo dictEeVo, AnalysisContext analysisContext) {
//调用方法添加数据库
Dict dict = new Dict();
BeanUtils.copyProperties(dictEeVo,dict);
dictService.save(dict);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}
service层
// 导入excel文件
@Override
public void importData(MultipartFile file) {
try {
EasyExcel.read(file.getInputStream(),DictEeVo.class,new DictListener(this))
.sheet().doRead();
} catch (IOException e) {
throw new YyghException("数据导入失败!",404);
}
}
controller层
/**
* 医院上传接口
*
* @return
*/
@PostMapping("/saveHospital")
public Result saveHosp(HttpServletRequest request) {
// 1. 请求发送过来中,含有一个map数据,获取请求中的map数据
Map parameterMap = request.getParameterMap();
// 2. 使用工具类将map数据中的值类型转成Object类型方便操作的map数据
Map resultMap = HttpRequestHelper.switchMap(parameterMap);
// 3. 根据医院编码查询医院对象,然后比较密钥是否正确
// 获取请求体中的医院编码和签名密钥
String hoscode = (String) resultMap.get("hoscode");
String sign = (String) resultMap.get("sign");
// 根据编码查出医院对象的签名,并使用md5加密
String signKey = MD5.encrypt(hospitalSetService.getSignKey(hoscode));
if (!sign.equals(signKey)){
// 不正确,抛出签名异常,
throw new YyghException(ResultCodeEnum.SIGN_ERROR);
}
// 正确将数据中的图片logo数据使用base64转码,然后继续处理
String logoData = (String)resultMap.get("logoData");
logoData = logoData.replaceAll(" ","+");
resultMap.put("logoData",logoData);
// 4. 将map数据传给service层接口处理,保存或者更新数据
hospitalService.saveOrUpdate(resultMap);
// 5. 响应成功
return Result.ok();
}
service层
// 保存或更新医院上传数据
@Override
public void saveOrUpdate(Map resultMap) {
// 1. 使用JSONObject将map数据转换字符串,然后转成成医院对象
String toJSONString = JSONObject.toJSONString(resultMap);
Hospital hospital = JSONObject.parseObject(toJSONString, Hospital.class);
// 根据医院编码在Mongodb中获取医院对象
Hospital hospitalInMongo = hospitalRepository.findByHoscode(hospital.getHoscode());
// 2. 判断医院对象是否存在,然后设置相应的值
if (hospitalInMongo == null) {
// 医院对象不存在,新增操作
hospital.setStatus(1);
hospital.setIsDeleted(0);
hospital.setCreateTime(new Date());
hospital.setUpdateTime(new Date());
hospitalRepository.save(hospital);
}else {
// 存在,更新医院数据
// 设置id,这样调用save方法,才能更新
hospital.setId(hospitalInMongo.getId());
hospital.setStatus(1);
hospital.setIsDeleted(0);
hospital.setCreateTime(new Date());
hospital.setUpdateTime(new Date());
// hospital中含有id,方法自动更新
hospitalRepository.save(hospital);
}
}
repository层
/**
* 采用mongodb的MongoRepository方式操作数据库
*
*/@Repository
public interface HospitalRepository extends MongoRepository {
// Spring Data对Mongodb提供了数据访问的支持。
// 我们可以按照Spring Data 规范定义方法就可以简单实现对数据库的访问
// 根据医院编码查询Mongodb中是否含有该医院对象
Hospital findByHoscode(String hoscode);
}
controller层
/**
* 查询医院信息
* @param request
* @return
*/
@PostMapping("/hospital/show")
public Result getHospital(HttpServletRequest request){
// 1. 请求发送过来中,含有一个map数据,获取请求中的map数据
Map parameterMap = request.getParameterMap();
// 2. 使用工具类将map数据中的值类型转成Object类型方便操作的map数据
Map resultMap = HttpRequestHelper.switchMap(parameterMap);
// 3. 根据医院编码查询医院对象,然后比较密钥是否正确
// 获取请求体中的医院编码和签名密钥
String hoscode = (String) resultMap.get("hoscode");
String sign = (String) resultMap.get("sign");
// 根据编码查出医院对象的签名,并使用md5加密
String signKey = MD5.encrypt(hospitalSetService.getSignKey(hoscode));
if (!sign.equals(signKey)){
// 不正确,抛出签名异常,
throw new YyghException(ResultCodeEnum.SIGN_ERROR);
}
// 4. 执行查询操作
Hospital hospital = hospitalService.getByHoscode(hoscode);
// 返回结果
return Result.ok(hospital);
}
service层
// 查询医院对象
@Override
public Hospital getByHoscode(String hoscode) {
Hospital hospital = hospitalRepository.findByHoscode(hoscode);
return hospital;
}
/**
* 科室上传接口
*
* @return
*/
@PostMapping("/saveDepartment")
public Result saveDepartment(HttpServletRequest request) {
// 1. 请求发送过来中,含有一个map数据,获取请求中的map数据
Map parameterMap = request.getParameterMap();
// 2. 使用工具类将map数据中的值类型转成Object类型方便操作的map数据
Map resultMap = HttpRequestHelper.switchMap(parameterMap);
// 3. 根据医院编码查询科室对象,然后比较密钥是否正确
// 获取请求体中的医院编码、科室编码和签名密钥
String hoscode = (String) resultMap.get("hoscode");
String sign = (String) resultMap.get("sign");
// 根据医院编码查出科室对象的签名,并使用md5加密
String signKey = MD5.encrypt(hospitalSetService.getSignKey(hoscode));
if (!sign.equals(signKey)) {
// 不正确,抛出签名异常,
throw new YyghException(ResultCodeEnum.SIGN_ERROR);
}
// 4. 将map数据传给service层接口处理,保存或者更新数据
departmentService.saveOrUpdate(resultMap);
// 5. 响应成功
return Result.ok();
}
service层
// 保存或更新科室信息
@Override
public void saveOrUpdate(Map resultMap) {
// 1. 使用JSONObject将map数据转换字符串,然后转成成医院对象
String toJSONString = JSONObject.toJSONString(resultMap);
Department department = JSONObject.parseObject(toJSONString, Department.class);
// 根据医院编码和科室编码在Mongodb中获取医院对象
Department departmentInMongo = departmentRepository.findDepartmentByHoscodeAndDepcode(department.getHoscode(),department.getDepcode());
// 2. 判断科室对象是否存在,然后设置相应的值
if (departmentInMongo == null) {
// 科室对象不存在,新增操作
department.setIsDeleted(0);
department.setCreateTime(new Date());
department.setUpdateTime(new Date());
departmentRepository.save(department);
}else {
// 存在,更新科室数据
// 设置id,这样调用save方法,才能更新
department.setId(departmentInMongo.getId());
department.setIsDeleted(0);
department.setCreateTime(new Date());
department.setUpdateTime(new Date());
// hospital中含有id,方法自动更新
departmentRepository.save(department);
}
}
repository层
// 科室Repository
@Repository
public interface DepartmentRepository extends MongoRepository {
// 根据医院编码和科室编码查询科室对象
Department findDepartmentByHoscodeAndDepcode(String hoscode, String depcode);
}
controller层
/**
* 查询科室信息(分页查询)
* * @param request
* @return
*/
@PostMapping("/department/list")
public Result departmentList(HttpServletRequest request) {
// 1. 请求发送过来中,含有一个map数据,获取请求中的map数据
Map parameterMap = request.getParameterMap();
// 2. 使用工具类将map数据中的值类型转成Object类型方便操作的map数据
Map resultMap = HttpRequestHelper.switchMap(parameterMap);
// 3. 根据医院编码查询科室对象,然后比较密钥是否正确
// 获取请求体中的医院编码、科室编码和签名密钥
String hoscode = (String) resultMap.get("hoscode");
String sign = (String) resultMap.get("sign");
// 根据医院编码查出科室对象的签名,并使用md5加密
String signKey = MD5.encrypt(hospitalSetService.getSignKey(hoscode));
if (!sign.equals(signKey)) {
// 不正确,抛出签名异常,
throw new YyghException(ResultCodeEnum.SIGN_ERROR);
}
// 4. 获取科室分页数据
// 查询对象(使用DepartmentQueryVo的分页对象,可以保证数据安全,控制数据的展示)
Page departmentPage = departmentService.list(resultMap);
return Result.ok(departmentPage);
}
service层
// 查询科室分页信息
@Override
public Page list(Map resultMap) {
// 1.创建Pageable对象,设置当前页和每页记录数
// 获取第几页和当前页数(做了空值验证,如果为空默认赋值为1)
int page = StringUtils.isEmpty( resultMap.get("page")) ? 1 : Integer.parseInt((String) resultMap.get("page"));
int limit = StringUtils.isEmpty( resultMap.get("limit")) ? 1 : Integer.parseInt((String) resultMap.get("limit"));
Pageable pageable = PageRequest.of(page-1,limit);//0是第一页
// 2. 设置条件
String hoscode = (String) resultMap.get("hoscode");
Department department = new Department();
department.setIsDeleted(0);
department.setHoscode(hoscode);
// 使用匹配器,模糊查询设置条件
ExampleMatcher matcher = ExampleMatcher.matching()
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)// 字符串包含
.withIgnoreCase(true);// 忽略大小写
// 创建Example对象,条件查询
Example example = Example.of(department,matcher);
// 3. 查询
Page all = departmentRepository.findAll(example, pageable);
return all;
}
controller层
/**
* 删除科室
* @param request
* @return
*/
@PostMapping("/department/remove")
public Result DepartmentRemove(HttpServletRequest request){
// 1. 请求发送过来中,含有一个map数据,获取请求中的map数据
Map parameterMap = request.getParameterMap();
// 2. 使用工具类将map数据中的值类型转成Object类型方便操作的map数据
Map resultMap = HttpRequestHelper.switchMap(parameterMap);
// 3. 根据医院编码查询科室对象,然后比较密钥是否正确
// 获取请求体中的医院编码、科室编码和签名密钥
String hoscode = (String) resultMap.get("hoscode");
String sign = (String) resultMap.get("sign");
// 根据医院编码查出科室对象的签名,并使用md5加密
String signKey = MD5.encrypt(hospitalSetService.getSignKey(hoscode));
if (!sign.equals(signKey)) {
// 不正确,抛出签名异常,
throw new YyghException(ResultCodeEnum.SIGN_ERROR);
}
// 4. 根据医院编码和科室编码删除科室
String depcode = (String) resultMap.get("depcode");
departmentService.remove(hoscode,depcode);
return Result.ok();
}
service层
// 根据医院编码和科室编码删除科室
@Override
public void remove(String hoscode, String depcode) {
// 根据医院编码和科室编码查询科室对象
Department department = departmentRepository.findDepartmentByHoscodeAndDepcode(hoscode, depcode);
// 判断科室对象是否存在
if (department != null) {
// 科室对象存在,根据id删除(如果不存在,则不用删除)
departmentRepository.deleteById(department.getId());
}
}
controller层
/**
* 上传排班信息
* @param request
* @return
*/
@PostMapping("/saveSchedule")
public Result saveSchedule(HttpServletRequest request){
// 1. 请求发送过来中,含有一个map数据,获取请求中的map数据
Map parameterMap = request.getParameterMap();
// 2. 使用工具类将map数据中的值类型转成Object类型方便操作的map数据
Map resultMap = HttpRequestHelper.switchMap(parameterMap);
// 3. 根据医院编码查询科室对象,然后比较密钥是否正确
// 获取请求体中的医院编码、科室编码和签名密钥
String hoscode = (String) resultMap.get("hoscode");
String sign = (String) resultMap.get("sign");
// 根据医院编码查出科室对象的签名,并使用md5加密
String signKey = MD5.encrypt(hospitalSetService.getSignKey(hoscode));
if (!sign.equals(signKey)) {
// 不正确,抛出签名异常,
throw new YyghException(ResultCodeEnum.SIGN_ERROR);
}
// 4. 将map数据传给service层接口处理,保存或者更新数据
scheduleService.saveOrUpdate(resultMap);
// 5. 响应成功
return Result.ok();
}
service层
// 保存或者更新排班
@Override
public void saveOrUpdate(Map resultMap) {
// 1. 使用JSONObject将map数据转换字符串,然后转成成医院对象
String toJSONString = JSONObject.toJSONString(resultMap);
Schedule schedule = JSONObject.parseObject(toJSONString, Schedule.class);
// 根据医院编码和排班编码在Mongodb中获取排班对象
Schedule scheduleInMongo = scheduleRepository.findScheduleByHoscodeAndHosScheduleId(schedule.getHoscode(),schedule.getHosScheduleId());
// 2. 判断科室对象是否存在,然后设置相应的值
if (scheduleInMongo == null) {
// 科室对象不存在,新增操作
schedule.setIsDeleted(0);
schedule.setStatus(1);
schedule.setCreateTime(new Date());
schedule.setUpdateTime(new Date());
scheduleRepository.save(schedule);
}else {
// 存在,更新排班数据
// 设置id,这样调用save方法,才能更新
schedule.setId(scheduleInMongo.getId());
schedule.setIsDeleted(0);
schedule.setStatus(1);
schedule.setCreateTime(new Date());
schedule.setUpdateTime(new Date());
// schedule中含有id,方法自动更新
scheduleRepository.save(schedule);
}
}
repository层
// 排班接口
@Repository
public interface ScheduleRepository extends MongoRepository {
// 根据医院编码和排班编码获取排班对象
Schedule findScheduleByHoscodeAndHosScheduleId(String hoscode, String hosScheduleId);
}
controller层
/**
* 查询排班信息(分页查询)
* @param request
* @return
*/
@PostMapping("/schedule/list")
public Result scheduleList(HttpServletRequest request){
// 1. 请求发送过来中,含有一个map数据,获取请求中的map数据
Map parameterMap = request.getParameterMap();
// 2. 使用工具类将map数据中的值类型转成Object类型方便操作的map数据
Map resultMap = HttpRequestHelper.switchMap(parameterMap);
// 3. 根据医院编码查询科室对象,然后比较密钥是否正确
// 获取请求体中的医院编码、科室编码和签名密钥
String hoscode = (String) resultMap.get("hoscode");
String sign = (String) resultMap.get("sign");
// 根据医院编码查出科室对象的签名,并使用md5加密
String signKey = MD5.encrypt(hospitalSetService.getSignKey(hoscode));
if (!sign.equals(signKey)) {
// 不正确,抛出签名异常,
throw new YyghException(ResultCodeEnum.SIGN_ERROR);
}
// 4. 获取排班分页数据
// 查询对象
Page schedulePage = scheduleService.list(resultMap);
return Result.ok(schedulePage);
}
service层
// 获取排班分页数据
@Override
public Page list(Map resultMap) {
// 1.创建Pageable对象,设置当前页和每页记录数
// 获取第几页和当前页数(做了空值验证,如果为空默认赋值为1)
int page = StringUtils.isEmpty( resultMap.get("page")) ? 1 : Integer.parseInt((String) resultMap.get("page"));
int limit = StringUtils.isEmpty( resultMap.get("limit")) ? 1 : Integer.parseInt((String) resultMap.get("limit"));
Pageable pageable = PageRequest.of(page-1,limit);//0是第一页
// 2. 设置条件
Schedule schedule = new Schedule();
schedule.setIsDeleted(0);
schedule.setStatus(1);
// 使用匹配器,模糊查询设置条件
ExampleMatcher matcher = ExampleMatcher.matching()
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)// 字符串包含
.withIgnoreCase(true);// 忽略大小写
// 创建Example对象,条件查询
Example example = Example.of(schedule,matcher);
// 3. 查询
Page all = scheduleRepository.findAll(example, pageable);
return all;
}
controller层
/**
* 删除排班信息
* @param request
* @return
*/
@PostMapping("/schedule/remove")
public Result scheduleRemove(HttpServletRequest request){
// 1. 请求发送过来中,含有一个map数据,获取请求中的map数据
Map parameterMap = request.getParameterMap();
// 2. 使用工具类将map数据中的值类型转成Object类型方便操作的map数据
Map resultMap = HttpRequestHelper.switchMap(parameterMap);
// 3. 根据医院编码查询科室对象,然后比较密钥是否正确
// 获取请求体中的医院编码、科室编码和签名密钥
String hoscode = (String) resultMap.get("hoscode");
String sign = (String) resultMap.get("sign");
// 根据医院编码查出科室对象的签名,并使用md5加密
String signKey = MD5.encrypt(hospitalSetService.getSignKey(hoscode));
if (!sign.equals(signKey)) {
// 不正确,抛出签名异常,
throw new YyghException(ResultCodeEnum.SIGN_ERROR);
}
// 4. 根据医院编码和排班编码删除科室
String hosScheduleId = (String) resultMap.get("hosScheduleId");
scheduleService.remove(hoscode,hosScheduleId);
return Result.ok();
}
service层
// 根据医院编码和排班编码删除科室
@Override
public void remove(String hoscode, String hosScheduleId) {
// 根据医院编码和排班编码查询排班对象
Schedule schedule = scheduleRepository.findScheduleByHoscodeAndHosScheduleId(hoscode,hosScheduleId);
// 判断科室对象是否存在
if (schedule != null) {
// 科室对象存在,根据id删除(如果不存在,则不用删除)
scheduleRepository.deleteById(schedule.getId());
}
}
1, 新建医院管理的controller,包含一个分页查询医院数据的接口,传入当前页、每页显示数和一个医院vo对象(用来封装用户的条件查询)。(查询Mongodb)
2. 在service层编写查询逻辑,构造Pageable对象用来封装分页数据,matcher对象封装我们自定义的查询规则,拷贝vo对象到一个新的hospital对象中,example对象封装matcher和hospital,相当于封装所有查询条件,最后构造page对象,传入参数example条件对象和Pageable分页对象。
3. 分页数据是查出来了,但是我们需要给分页数据中的每个医院对象设置医院等级等信息,而这个信息保存在字典数据中。
4. 这个时候就需要远程调用字典模块的接口,根据医院对象的value值和字典编码查询医院等级,这两个接口很简单,基于mp简单查询即可。
5. 然后我们需要一个封装一个远程调用模块,内置一个子模块用来专门处理发起字典数据的远程调用。
6. 最后我们在service层中需要根据医院对象的value值和字典编码查询医院等级,然后封装到医院对象中,返回新的分页对象。
7. 最后在数据字典中写一个根据dictcode查出省id,然后根据省id查询所有省的接口用于省市联动。
controller层
@RestController
@RequestMapping("/admin/hosp/department")
@Api(tags = "科室相关接口")
@CrossOrigin
public class DepartmentController {
@Autowired
private DepartmentService departmentService;
// 根据医院编号查询所有科室信息
@GetMapping("/getAllDepartment/{hoscode}")
@ApiOperation(value = "根据医院编号查询所有科室信息")
public Result getAllDepartment( @PathVariable String hoscode){
// 查询结果放在科室vo对象里,内涵下级结点字段
List departmentVoList = departmentService.getAll(hoscode);
return Result.ok(departmentVoList);
}
}
service层
// 根据医院编号查询所有科室信息
@Override
public List getAll(String hoscode) {
// 1. 封装返回的list集合
ArrayList list = new ArrayList<>();
// 2. 查询所有科室信息
// 设置查询条件对象
Department department = new Department();
department.setHoscode(hoscode);
// 封装查询案例
Example example = Example.of(department);
// 调用repository接口查询
List departmentList = departmentRepository.findAll(example);
// 3. 将所有科室按照bigname分组
Map> map = departmentList
.stream()
.collect(Collectors.groupingBy(Department::getBigname));
// 4. 遍历分组数据的每一个键值对,封装成科室vo对象
for (Map.Entry> entry : map.entrySet()) {
// 封装大科室(科室编码,科室名称)
DepartmentVo bigDepartmentVo = new DepartmentVo();
bigDepartmentVo.setDepcode(entry.getValue().get(0).getBigcode());
bigDepartmentVo.setDepname(entry.getKey());
// 遍历大科室下的小科室数据,然后封装成小科室(科室编码,科室名称)
// 把每个科室对象都转换成科室的vo对象,只有科室编码和科室名称两个属性
ArrayList smallList = new ArrayList<>();
for(Department smallDepartment:entry.getValue()){
DepartmentVo departmentVo = new DepartmentVo();
departmentVo.setDepcode(smallDepartment.getDepcode());
departmentVo.setDepname(smallDepartment.getDepname());
// 存入小科室集合
smallList.add(departmentVo);
}
// 将小科室集合封装到大科室中
bigDepartmentVo.setChildren(smallList);
// 将大科室存入集合
list.add(bigDepartmentVo);
}
// 4. 返回科室vo对象的集合
return list;
}