后端-医院管理之医院列表实现

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值