内容介绍
| 1、医院列表功能(接口) 4、医院列表功能(前端) 5、更新医院上线状态功能 6、医院详情 7、GateWay网关 8、医院排班管理需求分析 9、查看医院所有科室接口、前端 | 
医院列表功能(接口)
| 
 (1)在service下添加依赖 
 (2)在hosp下添加依赖 <dependency>
    <groupId>com.atguigu</groupId>
    <artifactId>service_cmn_client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </dependency>(3)启动类添加注解 @EnableFeignClients(basePackages = "com.atguigu")
 (5)实现跨模块翻译 @Autowired
  private DictFeignClient dictFeignClient;//带条件带分页查询医院列表
  @Override
  public Page<Hospital> selectPage(Integer page, Integer limit,
                                 HospitalQueryVo hospitalQueryVo) {
    //1创建分页对象
    //1.1创建排序对象
    Sort sort = Sort.by(Sort.Direction.ASC,"hoscode");
    //1.2创建分页对象
    Pageable pageable = PageRequest.of((page-1),limit,sort);
    //2创建条件模板
    //2.1封装查询条件
    Hospital hospital = new Hospital();
    BeanUtils.copyProperties(hospitalQueryVo,hospital);
    //2.2模板构造器
    ExampleMatcher matcher = ExampleMatcher.matching()
            .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)
            .withIgnoreCase(true);
    //2.3创建模板
    Example<Hospital> example = Example.of(hospital,matcher);
    //3实现带条件带分页查询
    Page<Hospital> pageModel = hospitalRepository.findAll(example, pageable);
  
    //4 遍历集合翻译字段
    pageModel.getContent().forEach(item->{
        this.packHospital(item);
    });
  
    return pageModel;
  }
  
  //翻译医院信息
  private Hospital packHospital(Hospital hospital) {
    //1翻译医院等级
    String hostypeString = dictFeignClient.getName(DictEnum.HOSTYPE.getDictCode(), hospital.getHostype());
    //2翻译地址信息
    String provinceString = dictFeignClient.getName(hospital.getProvinceCode());
    String cityString = dictFeignClient.getName(hospital.getCityCode());
    String districtString = dictFeignClient.getName(hospital.getDistrictCode());
    //3封装数据返回
    hospital.getParam().put("hostypeString", hostypeString);
    hospital.getParam().put("fullAddress", provinceString + cityString + districtString + hospital.getAddress());
    return hospital;
  }(6)测试 
 4、创建cmn接口 (1)分析接口 *参数:dictCode *返回值:R(List<Dict>) (2)实现controller @ApiOperation(value = "根据dictCode获取下级节点")
  @GetMapping(value = "/findByDictCode/{dictCode}")
  public R findByDictCode(
        @PathVariable String dictCode) {
    List<Dict> list = dictService.findByDictCode(dictCode);
    return R.ok().data("list",list);
  }(3)实现service //根据dictCode获取下级节点
  @Override
  public List<Dict> findByDictCode(String dictCode) {
    //1 根据dictCode查询字典信息
    Dict parentDict = this.getByDictCode(dictCode);
    //2  根据父id查询子数据
    LambdaQueryWrapper<Dict> wrapper = new LambdaQueryWrapper<>();
    wrapper.eq(Dict::getParentId,parentDict.getId());
    List<Dict> list = baseMapper.selectList(wrapper);
    return list;
  }(4)测试 
 | 
医院列表功能(前端)
| 1、添加路由 2、添加页面保存路由 
 3、添加api接口方法 6、测试 
 | 
更新医院上线状态功能
| 1、分析需求 医院排班管理需求分析
 查看医院所有科室接口、前端
 2、实现接口 (1)分析接口 *参数:id、status *返回值:R.ok() (2)实现controller 3、对接前端 (1)确认入口 
 (2)添加api (3)确认页面 
 (4)实现js (5)测试 
 | 
医院详情查询实现
| 1、实现接口 (1)分析接口 *参数:id *返回值:R(map(医院基本信息、预约规则)) (2)实现controller @ApiOperation(value = "获取医院详情")
  @GetMapping("show/{id}")
  public R show(
        @PathVariable String id) {
    Map<String,Object> map = hospitalService.show(id);
    return R.ok().data(map);
  }(3)实现service //获取医院详情
  @Override
  public Map<String, Object> show(String id) {
    Hospital hospital = this.packHospital(hospitalRepository.findById(id).get()) ;
    BookingRule bookingRule = hospital.getBookingRule();
    hospital.setBookingRule(null);
    Map<String, Object> result = new HashMap<>();
    result.put("hospital",hospital);
    result.put("bookingRule",bookingRule);
    return result;
  }(4)测试 
 2、对接前端 (1)确认入口 
 (3)创建页面,保存路由 
 (7)添加css 第一、将show.css文件复制到src/styles目录 
 第二、在src/main.js文件添加引用 import '@/styles/show.css' 
 
 | 
Spring Cloud GateWay网关搭建
| 1、是什么 
 2 Spring Cloud Gateway (1)架构图 
 (2)核心概念 路由。路由是网关最基础的部分,路由信息有一个ID、一个目的URL、一组断言和一组Filter组成。如果断言路由为真,则说明请求的URL和配置匹配 断言。Java8中的断言函数。Spring Cloud Gateway中的断言函数输入类型是Spring5.0框架中的ServerWebExchange。Spring Cloud Gateway中的断言函数允许开发者去定义匹配来自于http request中的任何信息,比如请求头和参数等。 过滤器。一个标准的Spring webFilter。Spring cloud gateway中的filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理 3、创建service_gateway模块(网关服务) (1)创建模块 
 (2)导入依赖 <dependencies>
    <dependency>
        <groupId>com.atguigu</groupId>
        <artifactId>common_utils</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
  
    <!-- 服务注册 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
  </dependencies>(3)编写application.properties配置文件 # 服务端口
  server.port=8200
  # 服务名
  spring.application.name=service-gateway
  
  # nacos服务地址
  spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
  
  #使用服务发现路由
  spring.cloud.gateway.discovery.locator.enabled=true
  
  #设置路由id
  spring.cloud.gateway.routes[0].id=service-hosp
  #设置路由的uri
  spring.cloud.gateway.routes[0].uri=lb://service-hosp
  #设置路由断言,代理servicerId为auth-service的/auth/路径
  spring.cloud.gateway.routes[0].predicates= Path=/*/hosp/**
  
  #设置路由id
  spring.cloud.gateway.routes[1].id=service-cmn
  #设置路由的uri
  spring.cloud.gateway.routes[1].uri=lb://service-cmn
  #设置路由断言,代理servicerId为auth-service的/auth/路径
  spring.cloud.gateway.routes[1].predicates= Path=/*/cmn/**(4)添加主目录、启动类 
 @SpringBootApplication
  public class ApiGatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(ApiGatewayApplication.class, args);
    }
  }(5)启动模块测试 
 (6)改造前端配置 
 重启生效 4、扩展功能 实现跨域功能 (1)添加配置类 @Configuration
  public class CorsConfig {
  
    @Bean
    public CorsWebFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedMethod("*");
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
  
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**", config);
  
        return new CorsWebFilter(source);
    }
  
  }(2)测试 
 
 
 | 
医院排班管理需求分析
| 1、分析需求 
 
 (3)根据医院、科室、排班日期查询排班集合 2、实现方案 (1)使用el-tree展现树形科室信息 (2)根据hoscode、depcode筛选数据,根据排班日期进行带分页带排序的聚合查询。使用工具推算周几 (3)根据医院、科室、排班日期查询排班集合 3、实现步骤 虽然是一个页面展示所有内容,但是页面相对复杂,我们分步骤实现 第一,先实现左侧科室树形展示; 第二,其次排班日期分页展示 第三,最后根据排班日期获取排班详情数据 | 
查看医院所有科室接口、前端
| 1、分析需求 
 2、实现接口 (1)分析接口 *参数:hoscode *返回值:R(树形结构展示科室集合List<DepartmentVo>) 
 (2)创建controller (3)如果是mysql如何实现 #查询大科室集合 SELECT d.bigcode ,d.bigname,COUNT(d.id) FROM Department d GROUP BY d.bigcode ,d.bigname; #遍历大科室集合,根据bigcode查询小科室集合 SELECT * FROM Department d WHERE d.bigcode = '大科室编码'; (4)梳理实现步骤 (6)测试 
 3、对接前端 (1)确认入口 
 (3)创建页面 
 (7)测试 
 | 
排班日期统计列表
| 1确认需求 
 (1)根据医院、科室、日期带分页聚合查询 (2)根据排班日期推算周几 2、实现接口 (1)分析接口 *参数:page、limit、hoscode、depcode *返回值:R(Map(total、List<BookingScheduleRuleVo>。。。)) (2)创建controller @Api(tags = "排班管理")
  @RestController
@RequestMapping("/admin/hosp/schedule")
  public class ScheduleController {
    @Autowired
    private ScheduleService scheduleService;
    
    //根据医院编号 和 科室编号 ,查询排班规则数据
    @ApiOperation(value ="查询排班规则统计数据")
    @GetMapping("getScheduleRule/{page}/{limit}/{hoscode}/{depcode}")
    public R getScheduleRule(@PathVariable long page,
                             @PathVariable long limit,
                             @PathVariable String hoscode,
                             @PathVariable String depcode) {
        Map<String,Object> map = scheduleService.getScheduleRule(page,limit,hoscode,depcode);
        return R.ok().data(map);
    }
  }(3)如果是mysql如何实现 #根据医院编号 和 科室编号 ,查询排班规则统计数据,带分页带排序 SELECT s.workDate,COUNT(id) AS docCount, SUM(s.reservedNumber) AS reservedNumber, SUM(s.availableNumber) AS availableNumber FROM SCHEDULE s WHERE s.hoscode = '医院编号' AND s.depcode = '科室编号' GROUP BY s.workDate ORDER BY s.workDate LIMIT XXXX; 
 | 



















































