Day108.尚医通:医院模拟系统接口对接 - 医院|科室|排班 增删改分页条件查询

目录

一、部署医院模拟系统

二、开发平台接口 - 上传(保存)医院信息接口

3、实现医院上传功能

4、实现签名校验

三、查询医院

四、搭建科室接口 上传科室

五、查询科室  ★★

六、删除科室

七、上传排班和查询排班接口

八、排班条件分页查询、排班删除 作业

SpringCloud 相关概念回顾


一、部署医院模拟系统

1、需求分析

  1. 医院体系上传医院、科室、排班到尚医通
  2. 调用接口进行签名校验

1. 确认工程

2.在父工程下创建 hospital-manage 模块

3. 替换pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
    </parent>

    <groupId>com.atguigu</groupId>
    <artifactId>hospital-manage</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <dependencies>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>

        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.29</version>
        </dependency>

        <!--swagger-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.7.0</version>
        </dependency>

        <!--开发者工具-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- 日期工具栏依赖 -->
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
        </dependency>

        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.13</version>
        </dependency>

        <!--        &lt;!&ndash; redis &ndash;&gt;-->
        <!--        <dependency>-->
        <!--            <groupId>org.springframework.boot</groupId>-->
        <!--            <artifactId>spring-boot-starter-data-redis</artifactId>-->
        <!--        </dependency>-->

        <!--        &lt;!&ndash; spring2.X集成redis所需common-pool2&ndash;&gt;-->
        <!--        <dependency>-->
        <!--            <groupId>org.apache.commons</groupId>-->
        <!--            <artifactId>commons-pool2</artifactId>-->
        <!--            <version>2.6.0</version>-->
        <!--        </dependency>-->

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <finalName>hospital-manage2020/6/16</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

4. 删除原有目录,进行复制

5. 修改配置文件,Mysql、Redis等信息

二、开发平台接口 - 上传(保存)医院信息接口

1、查看解读API文档

确认请求地址、参数、返回值

2、准备工作

(1). 引入工具类 

(2). 添加返回对象

3、 接口开发

(1). 确认MongoDB依赖、配置、实体

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
    </dependencies>
#mongo 配置
spring.data.mongodb.uri=mongodb://192.168.86.86:27017/test

(2). 创建接口 repository

//实体类,主键类型
@Repository
public interface HospitalRepository extends MongoRepository<Hospital,String> {
}

(3). 创建 service

public interface HospitalService {
}

@Service
public class HospitalServiceImpl implements HospitalService {
    @Autowired
    private HospitalRepository hospitalRepository;
}

(4). 创建 controller

//工具自带跨域解决
@Api(tags = "医院管理API接口")
@RestController
@RequestMapping("/api/hosp")  //请求地址参考文档
public class ApiController {

    @Autowired
    private HospitalService hospitalService;

}

3、实现医院上传功能

(1). 实现 controller

    @ApiOperation(value = "上传医院")
    @PostMapping("saveHospital")
    public Result saveHospital(HttpServletRequest request){
        //1.获取参数,转换类型
        Map<String, String[]> parameterMap = request.getParameterMap();
        Map<String, Object> paramMap = HttpRequestHelper.switchMap(parameterMap);
        //2. TODO 校验签名

        //3. 调用接口,数据入库
        hospitalService.saveHospital(paramMap);
        return Result.ok();
    }

(2). 实现 service

    //上传医院
    @Override
    public void saveHospital(Map<String, Object> parameterMap) {
        //1.转化参数类型paramMap => Hospital
        //String paramJsonString = JSONObject.toJSONString(parameterMap);
        //Hospital hospital = JSONObject.parseObject(paramJsonString, Hospital.class);
        String paramJsonString = JSONObject.toJSONString(parameterMap);
        Hospital hospital = JSONObject.parseObject(paramJsonString,Hospital.class);

        //2.根据hoscode查询医院信息
        Hospital targetHospital = hospitalRepository.getByHoscode(hospital.getHoscode());

        //3.存在医院信息进行更新
        if(targetHospital!=null){
            hospital.setId(targetHospital.getId());
            hospital.setCreateTime(targetHospital.getCreateTime());
            hospital.setUpdateTime(new Date());
            hospital.setStatus(targetHospital.getStatus());
            hospital.setIsDeleted(0);

            hospitalRepository.save(hospital);
        }else {
            //4.没有医院信息新增
            hospital.setCreateTime(new Date());
            hospital.setUpdateTime(new Date());
            hospital.setStatus(0);
            hospital.setIsDeleted(0);

            hospitalRepository.save(hospital);
        }
    }

(3). 测试

启动医院模拟系统9998、尚医通8201

确认测试数据

4、实现签名校验

1. 确认签名 (尚医通、医院方),要求签名一致

 

 2. 修改医院系统签名加密方式,MD5

3. 实现医院签名接口方法

public interface HospitalSetService extends IService<HospitalSet> {
    //获取签名key
    String getSignKey(String hoscode);
}

@Service
public class HospitalSetServiceImpl extends ServiceImpl<HospitalSetMapper,HospitalSet> implements HospitalSetService {

    //获取签名key
    @Override
    public String getSignKey(String hoscode) {
        QueryWrapper<HospitalSet> wrapper = new QueryWrapper<>();
        wrapper.eq("hoscode",hoscode);
        HospitalSet hospitalSet = baseMapper.selectOne(wrapper);
        if(hospitalSet==null){
            throw new YyghException(20001,"医院设置信息有误");
        }
        return hospitalSet.getSignKey();
    }
}

4. 改造接口

    @ApiOperation(value = "上传医院")
    @PostMapping("saveHospital")
    public Result saveHospital(HttpServletRequest request){
        //1.获取参数,转换类型
        Map<String, String[]> parameterMap = request.getParameterMap();
        Map<String, Object> paramMap = HttpRequestHelper.switchMap(parameterMap);

        //2. 校验签名
        //2.1 从paramMap 获取医院签名、尚易通签名
        String sign = (String) paramMap.get("sign");
        //2.2 调用接口,获取尚医通签名
        String hoscode = (String) paramMap.get("hoscode");
        String targetSign = hospitalSetService.getSignKey(hoscode);
        //2.3 签名md5加密
        String targetSignMd5 = MD5.encrypt(targetSign);
        //2.4 校验签名
        if(!targetSignMd5.equals(sign)){
            throw new YyghException(20001,"校验签名失败");
        }

        //传输过程中“+”转换为了“ ”,因此我们要转换回来
        String logoData = (String)paramMap.get("logoData");
        logoData = logoData.replaceAll(" ","+");
        paramMap.put("logoData",logoData);

        //3. 调用接口,数据入库
        hospitalService.saveHospital(paramMap);
        return Result.ok();
    }

三、查询医院

1、查看解读API文档

确认请求地址、参数、返回值

2、实现controller

    @ApiOperation(value = "查询医院")
    @PostMapping("hospital/show")
    public Result getHospital(HttpServletRequest request){
        //1.获取参数,转换类型
        Map<String, String[]> parameterMap = request.getParameterMap();
        Map<String, Object> paramMap = HttpRequestHelper.switchMap(parameterMap);

        //2.签名校验 (暂略 注意医院md5)
        String sign = (String) paramMap.get("sign");
        String hoscode = (String) paramMap.get("hoscode");

        //3.获取参数,校验
        if(hoscode==null){
            throw new YyghException(20001,"医院编码有误");
        }
        //4.调用接口获取数据
        Hospital hospital = hospitalService.getHospital(hoscode);
        
        return Result.ok(hospital);
    }

3、service 层

    //查询医院
    @Override
    public Hospital getHospital(String hoscode) {
        hospitalRepository.getByHoscode(hoscode);
        return null;
    }

四、搭建科室接口 上传科室

1、查看解读API文档

确认请求地址、参数、返回值

2、准备工作

(1). 确认实体

(2). 创建接口、类

3、接口实现

1. controller

    @ApiOperation(value = "上传科室")
    @PostMapping("saveDepartment")
    public Result saveDepartment(HttpServletRequest request) {
        //1.获取参数,转换类型
        Map<String, String[]> parameterMap = request.getParameterMap();
        Map<String, Object> paramMap = HttpRequestHelper.switchMap(parameterMap);
        //2.签名校验 省略

        //3.调用接口数据入库
        departmentService.saveDepartment(paramMap);
        return Result.ok();
    }

2.service

    //上传科室
    @Override
    public void saveDepartment(Map<String, Object> paramMap) {
        //1.转换参数类型
        String paramJsonString = JSONObject.toJSONString(paramMap);
        Department department = JSONObject.parseObject(paramJsonString, Department.class);

        //2.查询科室信息 (hoscode、depcode)
        Department targetDepartment = departmentRepository.
                getByHoscodeAndDepcode(department.getHoscode(),department.getDepcode());
        if(targetDepartment!=null){
            //3.存在数据进行更新
            department.setId(targetDepartment.getId());
            department.setCreateTime(targetDepartment.getCreateTime());
            department.setUpdateTime(new Date());
            department.setIsDeleted(0);

            departmentRepository.save(department);
        }else {
            //4.不存在新增
            department.setCreateTime(new Date());
            department.setUpdateTime(new Date());
            department.setIsDeleted(0);
            departmentRepository.save(department);
        }
    }

3. 测试

 

五、查询科室  ★★

1、查看解读API文档

确认请求地址、参数、返回值

2、准备工作

(1). 确认查询条件封装对象

(2). 确认page对象

MongoDB,spring 框架的page data,不能用苞米豆 

 

3、接口实现

1. controller

    @ApiOperation(value = "带条件带分页查询科室")
    @PostMapping("department/list")
    public Result getDepartment(HttpServletRequest request) {
        //1.获取参数,转换类型
        Map<String, String[]> parameterMap = request.getParameterMap();
        Map<String, Object> paramMap = HttpRequestHelper.switchMap(parameterMap);
        //2.获取参数
        String sign = (String) paramMap.get("sign");
        String hoscode = (String) paramMap.get("hoscode");

        //3.签名校验 省略

        //4.封装参数 (判断是否为空)
        int page = StringUtils.isEmpty(paramMap.get("page")) ? 1 :
                Integer.parseInt((String) paramMap.get("page"));

        int limit = StringUtils.isEmpty(paramMap.get("limit")) ? 10 :
                Integer.parseInt((String) paramMap.get("limit"));

        DepartmentQueryVo departmentQueryVo = new DepartmentQueryVo();
        departmentQueryVo.setHoscode(hoscode);

        //5.调用接口分页条件查询科室
        Page pageModel = departmentService.selectPage(page,limit,departmentQueryVo);
        
        return Result.ok(pageModel);
    }

2. service

    //分页条件查询科室
    @Override
    public Page selectPage(int page, int limit, DepartmentQueryVo departmentQueryVo) {
        //(1).创建分页查询对象
        //1.1创建排序对象
        Sort sort = Sort.by(Sort.Direction.DESC, "createTime");
        //1.2分页对象 (第一页从0开始)
        Pageable pageable = PageRequest.of(page-1,limit,sort);

        //(2).创建条件查询模板
        //2.1设置筛选条件
        Department department = new Department();
        BeanUtils.copyProperties(departmentQueryVo,department);
        //2.2设置模板构造器 (模糊查询)
        ExampleMatcher matcher = ExampleMatcher.matching()
                .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)
                .withIgnoreCase(true); //不区分大小写
        //2.3创建条件查询模板
        Example<Department> example = Example.of(department,matcher);

        //(3).分页条件查询
        Page<Department> pageModel = departmentRepository.findAll(example, pageable);

        return pageModel;
    }

3. 测试

 国际医疗 贵 不走医保

六、删除科室

1、查看解读API文档

确认请求地址、参数、返回值

2、接口实现

1. controller

    @ApiOperation(value = "删除科室")
    @PostMapping("department/remove")
    public Result removeDepartment(HttpServletRequest request) {
        //1.获取参数,转换类型
        Map<String, String[]> parameterMap = request.getParameterMap();
        Map<String, Object> paramMap = HttpRequestHelper.switchMap(parameterMap);
        //2.获取参数
        String sign = (String) paramMap.get("sign");
        String hoscode = (String) paramMap.get("hoscode");
        String depcode = (String) paramMap.get("depcode");
        //3.签名校验 省略
        
        //4.调用接口删除
        departmentService.removeDepartment(hoscode,depcode);
        return Result.ok();
    }

2. service

    //删除科室
    @Override
    public void removeDepartment(String hoscode, String depcode) {
        //1.根据医院、科室编码查询科室信息
        Department department = departmentRepository.getByHoscodeAndDepcode(hoscode, depcode);
        //2.判断科室信息
        if(department==null){
            throw new YyghException(20001,"科室编码有误");
        }
        //3.根据主键ID删除
        departmentRepository.deleteById(department.getId());
    }

3. 测试

七、上传排班和查询排班接口

1、查看解读API文档

确认请求地址、参数、返回值

2、准备工作

(1). 确认实体

(2). 创建接口、类

3、实现接口

1. controller

    @ApiOperation(value = "上传排班")
    @PostMapping("saveSchedule")
    public Result saveSchedule(HttpServletRequest request) {
        //1.获取参数,转换类型
        Map<String, String[]> parameterMap = request.getParameterMap();
        Map<String, Object> paramMap = HttpRequestHelper.switchMap(parameterMap);
        //2.签名校验 省略
        scheduleService.saveSchedule(paramMap);

        return Result.ok();
    }

2. service

//上传排班
    @Override
    public void saveSchedule(Map<String, Object> paramMap) {
        //1.转换参数类型
        String paramJsonString = JSONObject.toJSONString(paramMap);
        Schedule schedule = JSONObject.parseObject(paramJsonString, Schedule.class);

        //2.查询排班信息 (hoscode、hosScheduleId (医院的排班主键))
        Schedule targetSchedule = scheduleRepository.
                getByHoscodeAndHosScheduleId(schedule.getHoscode(),schedule.getHosScheduleId());
        if(targetSchedule!=null){
            //3.存在数据进行更新
            schedule.setId(targetSchedule.getId());
            schedule.setCreateTime(targetSchedule.getCreateTime());
            schedule.setUpdateTime(new Date());
            schedule.setIsDeleted(0);

            scheduleRepository.save(schedule);
        }else {
            //4.不存在新增
            schedule.setCreateTime(new Date());
            schedule.setUpdateTime(new Date());
            schedule.setIsDeleted(0);
            scheduleRepository.save(schedule);
        }

3. 测试

八、排班条件分页查询、排班删除 作业

    @ApiOperation(value = "分页条件查询排班")
    @PostMapping("schedule/list")
    public Result getSchedule(HttpServletRequest request) {
        //1.获取参数,转换类型
        Map<String, String[]> parameterMap = request.getParameterMap();
        Map<String, Object> paramMap = HttpRequestHelper.switchMap(parameterMap);
        //2.获取参数
        String sign = (String) paramMap.get("sign");
        String hoscode = (String) paramMap.get("hoscode");

        //3.签名校验 省略

        //4.封装参数 (判断是否为空)
        int page = StringUtils.isEmpty(parameterMap.get("page")) ? 1:
                Integer.parseInt((String) paramMap.get("page"));
        int limit = StringUtils.isEmpty(parameterMap.get("limit")) ? 1:
                Integer.parseInt((String) paramMap.get("limit"));

        ScheduleQueryVo scheduleQueryVo = new ScheduleQueryVo();
        scheduleQueryVo.setHoscode(hoscode);

        //5.调用接口分页条件查询科室
        Page pageModel = scheduleService.selectPage(page,limit,scheduleQueryVo);


        return Result.ok(pageModel);
    }

    @ApiOperation(value = "删除排班")
    @PostMapping("schedule/remove")
    public Result removeSchedule(HttpServletRequest request) {
        //1.获取参数,转换类型
        Map<String, String[]> parameterMap = request.getParameterMap();
        Map<String, Object> paramMap = HttpRequestHelper.switchMap(parameterMap);
        //2.获取参数
        String sign = (String) paramMap.get("sign");
        String hoscode = (String) paramMap.get("hoscode");
        String hosScheduleId = (String) paramMap.get("hosScheduleId");

        //签名校验 省略

        //3.删除
        scheduleService.removeSchedule(hoscode,hosScheduleId);
        return Result.ok();
    }
    //分页条件查询排班信息
    @Override
    public Page selectPage(int page, int limit, ScheduleQueryVo scheduleQueryVo) {
        //1.分页查询对象
        Sort sort = Sort.by(Sort.Direction.DESC, "createTime");
        Pageable pageable = PageRequest.of(page-1,limit,sort);

        //2.模板类
        Schedule schedule = new Schedule();
        BeanUtils.copyProperties(scheduleQueryVo,schedule);

        ExampleMatcher matcher = ExampleMatcher.matching()
                .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)
                .withIgnoreCase(true);

        Example example = Example.of(schedule,matcher);

        //3.分页查询
        Page<Schedule> pageModel = scheduleRepository.findAll(example, pageable);

        return pageModel;
    }
    //删除排班信息
    @Override
    public void removeSchedule(String hoscode, String hosScheduleId) {
        //1.查询科室信息
        Schedule schedule = scheduleRepository.getByHoscodeAndHosScheduleId(hoscode, hosScheduleId);
        //2.判断是存在
        if(schedule==null){
            throw new YyghException(20001,"排班信息有误");
        }
        //3.根据id删除
        scheduleRepository.deleteById(schedule.getId());
    }

SpringCloud 相关概念回顾

1、微服务

架构风格,服务分布式部署

优势:扩展性强(可针对具体服务进行扩展),高可用,维护成本低

本质:有效的拆分应用,敏捷的开发和部署

微服务开发框架:SpringCloud、Dubbo

2、SpringCloud  微服务系统架构的一站式解决方案

3、SpringBoot   约定大于配置,习惯优于配置。对Spring框架进行了进一步的封装,新一代JavaEE的开发标准。

SpringCloud 基于 SpringBoot

4、Spring Cloud相关基础服务组件

服务发现——Netflix Eureka  (Nacos)

服务调用——Netflix Feign 

熔断器——Netflix Hystrix 

服务网关——Spring Cloud  GateWay 

分布式配置——Spring Cloud Config  (Nacos)

消息总线 —— Spring Cloud Bus (Nacos)

5、Spring Cloud的版本

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值