1、医院列表
1.1、 医院列表api接口
1.1.1、添加controller方法
@RestController
@RequestMapping("/admin/hosp/hospital")
@CrossOrigin
public class HospitalController {
@Autowired
private HospitalService hospitalService;
//医院信息列表
@GetMapping("limit/{page}/{limit}")
public Result listHospital(@PathVariable Integer page,
@PathVariable Integer limit,
HospitalQueryVo hospitalQueryVo){
//调用业务层方法
Page<Hospital> pageModel = hospitalService.selectHospPage(page,limit,hospitalQueryVo);
return Result.ok(pageModel);
}
}
1.1.2、service层方法
接口:
//医院信息列表
Page<Hospital> selectHospPage(Integer page, Integer limit, HospitalQueryVo hospitalQueryVo);
实现类:
//医院信息列表(分页带模糊查询)
@Override
public Page<Hospital> selectHospPage(Integer page, Integer limit, HospitalQueryVo hospitalQueryVo) {
//创建pageable,用于设置分页信息
Pageable pageable = PageRequest.of(page,limit);
//设置条件匹配规则
ExampleMatcher matcher = ExampleMatcher.matching()
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)//改变默认字符串匹配为:模糊查询
.withIgnoreCase(true);//查询时忽略大小写
//将hospitalQueryVo对象转换成Hospital对象
Hospital hospital = new Hospital();
BeanUtils.copyProperties(hospitalQueryVo,hospital);
//创建Example对象,用于设置查询条件
Example<Hospital> example = Example.of(hospital,matcher);
Page<Hospital> all = hospitalRepository.findAll(example, pageable);
return all;
}
1.2、service-cmn模块提供接口
由于有关医院的信息查询的接口都在service_cmn微服务中,因此我们要在service-cmn模块中编写需要的接口,供service_hosp模块调用使用。
1.2.1、接口编写的背景
- 由于我们的医院等级、省市区地址都是取的数据字典value值,因此我们在列表显示医院等级与医院地址时要根据数据字典value值获取数据字典名称。
- 通过学习数据字典我们知道,根据上级编码与value值可以获取对应的数据字典名称,如果value值能够保持唯一(不一定唯一),我们也可以直接通过value值获取数据字典名称,目前省市区三级数据我们使用的是国家统计局的数据,数据编码我们就是数据字典的id与value,所以value能够唯一确定一条数据字典,如图:
1.2.2、编写接口
在service_cmn中编写接口,返回getName值,供service_hosp模块调用。
控制层:
//根据dictCode和value查询
@GetMapping("getName/{dictCode}/{value}")
public String getName(@PathVariable String dictCode,
@PathVariable String value){
String dictName = dictService.getName(dictCode,value);
return dictName;
}
//根据value查询
@GetMapping("getName/{value}")
public String getName(@PathVariable String value){
String dictName = dictService.getName("",value);
return dictName;
}
业务层接口:
//查询getName
String getName(String dictCode, String value);
业务层实现类:;
//查询getName
@Override
public String getName(String dictCode, String value) {
//如果dictCode为空,根据value查询
if(StringUtils.isEmpty(dictCode)){
QueryWrapper<Dict> wrapper = new QueryWrapper<>();
wrapper.eq("value",value);
Dict dict = baseMapper.selectOne(wrapper);
return dict.getName();
}else {//如果value为空,首先根据dictCode查询出Dict对象
Dict Dict = getDictByDictCode(dictCode);
Long parentId = Dict.getId();
//在根据查询出来的parent_id和value查询
Dict finalDict = baseMapper.selectOne(new QueryWrapper<Dict>()
.eq("parent_id", parentId)
.eq("value", value));
return finalDict.getName();
}
private Dict getDictByDictCode(String dictCode){
QueryWrapper<Dict> wrapper = new QueryWrapper<>();
wrapper.eq("dict_code", dictCode);
Dict codeDict = baseMapper.selectOne(wrapper);
return codeDict;
}
1.3、服务调用–案例
1.3.1、需求背景:在service_hosp中调用service_cmn中的接口
因为医院的所有信息都在mysql数据库中的yygh_cmn数据库的dict表中存放。该数据是service_cmn模块下的数据库。
医院平台端系统的数据在mongoDB中存放,在mongoDB中存放的医院部分信息都是编号,没有真实的名字。该数据是service_hosp模块中的数据:
因此要在service_hosp中调用service_cmn的接口,查询医院相关数据,并最终在浏览器上显示医院的真实名字,而不是显示其编号。
创建service_client模块,在该模块下在创建子模块做远程调用使用。
在service_client的pom.xml文件中引入依赖:
<dependencies>
<dependency>
<groupId>com.study</groupId>
<artifactId>common_util</artifactId>
</dependency>
<dependency>
<groupId>com.study</groupId>
<artifactId>model</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>provided </scope>
</dependency>
<!-- 服务调用feign -->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
</dependencies>
1.3.2、在service_client模块下创建模块service_client_cmn
把被调用的service_cmn的接口在service_client_cmn中做声明:
@FeignClient("service-cmn")
public interface DictFeignClient {
@GetMapping("/admin/cmn/dict/getName/{dictCode}/{value}")
public String getName(@PathVariable("dictCode") String dictCode,
@PathVariable("value") String value);
@GetMapping("/admin/cmn/dict/getName/{value}")
public String getName(@PathVariable("value") String value);
}
1.3.3、在service_hosp导入service_cmn_client模块坐标
因为服务调用的代码是在service_cmn_client中编写的,而最终是service_hosp调用service_cmn中的接口。所以要在service_hosp中引入service_cmn_client依赖。
1.3.4、在service_hosp的hospitalServiceImpl中注入DictFeignClient
1.3.5、在service_hosp的hospitalServiceImpl编写代码实现服务远程调用
主要是远程调用service_cmn中的接口,查询出来医院的等级信息。封装到hospital中供平台显示。
//医院信息列表(分页带模糊查询)
@Override
public Page<Hospital> selectHospPage(Integer page, Integer limit, HospitalQueryVo hospitalQueryVo) {
//创建pageable,用于设置分页信息
Pageable pageable = PageRequest.of(page,limit);
//设置条件匹配规则
ExampleMatcher matcher = ExampleMatcher.matching()
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)//改变默认字符串匹配为:模糊查询
.withIgnoreCase(true);//查询时忽略大小写
//将hospitalQueryVo对象转换成Hospital对象
Hospital hospital = new Hospital();
BeanUtils.copyProperties(hospitalQueryVo,hospital);
//创建Example对象,用于设置查询条件
Example<Hospital> example = Example.of(hospital,matcher);
//调用方法实现查询,返回查询到底所有的医院的信息(list集合)
Page<Hospital> pages = hospitalRepository.findAll(example, pageable);
//获取查询的list集合,遍历及进行医院等级的封装
pages.getContent().stream().forEach(item->{
this.getHospitalHosType(item);
});
return pages;
}
//远程调用服务,获取医院等级
private Hospital getHospitalHosType(Hospital hospital){
String hosTypeString = dictFeignClient.getName("HosType", hospital.getHostype());
//查询 省 市 区信息
String provinceString = dictFeignClient.getName(hospital.getProvinceCode());
String cityString = dictFeignClient.getName(hospital.getCityCode());
String districtString = dictFeignClient.getName(hospital.getDistrictCode());
//将查询出来的细腻些存放到hospital中
hospital.getParam().put("fullAddress",provinceString+cityString+districtString);
hospital.getParam().put("hosTypeString",hosTypeString);
return hospital;
}
1.4、 添加数据字典显示接口,查询出省份信息,一级省份下边的市
1.4.1、 编写controller
//根据dictCode获取其下级节点(例如根据省份的dictCode的值获取其下级节点(北京市,上海市))
@ApiModelProperty(value = "根据dictCode获取其下级节点")
@GetMapping("findByDictCode/{dictCode}")
public Result findByDictCode(@PathVariable String dictCode){
List<Dict> list = dictService.findByDictCode(dictCode);
return Result.ok(list);
}
1.4.2、业务层
接口:
//根据dictCode获取其下级节点(例如根据省份的dictCode的值获取其下级节点(北京市,上海市))
List<Dict> findByDictCode(String dictCode);
实现类:
//根据dictCode获取其下级节点(例如根据省份的dictCode的值获取其下级节点(北京市,上海市))
@Override
public List<Dict> findByDictCode(String dictCode) {
//根据传递过来的dictCode查询dict对象
Dict dict = this.getDictByDictCode(dictCode);
//获取该对象的id,调用方法已写好的方法,查询其下级节点
List<Dict> childData = findChildData(dict.getId());
return childData;
}
private Dict getDictByDictCode(String dictCode){
QueryWrapper<Dict> wrapper = new QueryWrapper<>();
wrapper.eq("dict_code", dictCode);
Dict codeDict = baseMapper.selectOne(wrapper);
return codeDict;
}
//根据数据id查询子数据列表
@Override
@Cacheable(value = "dict", keyGenerator = "keyGenerator")//作用是将该方法返回的值放到缓存中
public List<Dict> findChildData(Long id) {
QueryWrapper<Dict> query = new QueryWrapper<>();
query.eq("parent_id", id);
List<Dict> dictList = baseMapper.selectList(query);//查询父节点为id的所有子数据对象
//遍历集合中的每一个对象,并调用方法,判断该对象是否有子数据
for (Dict dict : dictList) {
Long dictId = dict.getId();
boolean flag = this.isChildren(dictId);//如果对象是否有子数据,返回true
dict.setHasChildren(flag);//将hasChildren属性设置为flag的值
}
return dictList;
}