尚医通 (二十一)预约挂号功能

news2024/10/2 10:33:58

目录

  • 一、预约挂号详情
    • 1、需求
    • 2、预约挂号详情接口
    • 3、预约挂号详情前端
  • 二、预约确认
    • 1、需求
    • 2、预约确认接口
    • 3、预约确认前端

一、预约挂号详情

1、需求

在这里插入图片描述
接口分析
(1)根据预约周期,展示可预约日期数据,按分页展示
(2)选择日期展示当天可预约列表(该接口后台已经实现过)
页面展示分析
(1)分页展示可预约日期,根据有号、无号、约满等状态展示不同颜色,以示区分
(2)可预约最后一个日期为即将放号日期,根据放号时间页面展示倒计时

2、预约挂号详情接口

(1)在ScheduleService添加方法


     /**
     * 获取排班可预约日期数据
     * @param page
     * @param limit
     * @param hoscode
     * @param depcode
     */
    Map<String, Object> getSchedulePageByCondition(String hoscode, String depcode, Integer pageNum, Integer pageSize);

(2)在ScheduleServiceImpl实现方法

    public Map<String, Object> getSchedulePageByCondition(String hoscode, String depcode, Integer pageNum, Integer pageSize) {
        Hospital hospital = hospitalService.getHospitalByHoscode(hoscode);
        if(hospital == null){
            throw new YyghException(20001,"该医院信息不存在");
        }
        BookingRule bookingRule = hospital.getBookingRule();
        //获取可预约日期分页数据
        IPage<Date> page = this.getListDate(pageNum, pageSize, bookingRule);
        List<Date> records = page.getRecords();


        Criteria criteria=Criteria.where("hoscode").is(hoscode).and("depcode").is(depcode).and("workDate").in(records);


        Aggregation aggregation=Aggregation.newAggregation(
                Aggregation.match(criteria),
                Aggregation.group("workDate").first("workDate").as("workDate")
                        .count().as("docCount")
                        .sum("reservedNumber").as("reservedNumber")
                        .sum("availableNumber").as("availableNumber"),
                Aggregation.sort(Sort.Direction.ASC,"workDate")
        );
        AggregationResults<BookingScheduleRuleVo> aggregate = mongoTemplate.aggregate(aggregation, Schedule.class, BookingScheduleRuleVo.class);
        List<BookingScheduleRuleVo> mappedResults = aggregate.getMappedResults();

        Map<Date, BookingScheduleRuleVo> collect = mappedResults.stream().collect(Collectors.toMap(BookingScheduleRuleVo::getWorkDate, BookingScheduleRuleVo -> BookingScheduleRuleVo));
        int size = records.size();

        List<BookingScheduleRuleVo> bookingScheduleRuleVoList=new ArrayList<BookingScheduleRuleVo>();

        for(int i=0;i<size;i++){
            Date date = records.get(i);
            BookingScheduleRuleVo bookingScheduleRuleVo = collect.get(date);
            if(bookingScheduleRuleVo == null){
                bookingScheduleRuleVo=new BookingScheduleRuleVo();
                bookingScheduleRuleVo.setWorkDate(date);
                //bookingScheduleRuleVo.setWorkDateMd(date);
                bookingScheduleRuleVo.setDocCount(0);
                bookingScheduleRuleVo.setReservedNumber(0);
                bookingScheduleRuleVo.setAvailableNumber(-1);//当天所有医生的总的剩余可预约数
                //bookingScheduleRuleVo.setStatus(0);
            }


            bookingScheduleRuleVo.setWorkDateMd(date);
            bookingScheduleRuleVo.setDayOfWeek(this.getDayOfWeek(new DateTime(date)));
            bookingScheduleRuleVo.setStatus(0); //

            //第一页第一条做特殊判断处理
            if(i==0 && pageNum == 1){
                DateTime dateTime = this.getDateTime(new Date(), bookingRule.getStopTime());
                //如果医院规定的当前的挂号截止时间在此时此刻之前,说明:此时此刻已经过了当天的挂号截止时间了
                if(dateTime.isBeforeNow()){
                    bookingScheduleRuleVo.setStatus(-1);
                }
            }
            //最后一页的最后一条做特殊判断处理
            if(pageNum==page.getPages() && i== (size-1) ){
                bookingScheduleRuleVo.setStatus(1);
            }

            bookingScheduleRuleVoList.add(bookingScheduleRuleVo);
        }
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("total",page.getTotal());
        map.put("list",bookingScheduleRuleVoList);

        Map<String,Object> baseMap = new HashMap<String,Object>();
        //医院名称
        baseMap.put("hosname", hospitalService.getHospitalByHoscode(hoscode).getHosname());
        //科室
        Department department=departmentService.getDepartment(hoscode,depcode);
        //大科室名称
        baseMap.put("bigname", department.getBigname());
        //科室名称
        baseMap.put("depname", department.getDepname());
        //月
        baseMap.put("workDateString", new DateTime().toString("yyyy年MM月"));
        //放号时间
        baseMap.put("releaseTime", bookingRule.getReleaseTime());
        //停号时间
        baseMap.put("stopTime", bookingRule.getStopTime());

        map.put("baseMap",baseMap);

        return map;
    }

(3)添加获取可预约日期分页数据方法

    private IPage getListDate(Integer pageNum, Integer pageSize, BookingRule bookingRule) {
        Integer cycle = bookingRule.getCycle();
        //此时此刻是否已经超过了医院规定的当天的挂号起始时间,如果此时此刻已经超过了:cycle+1
        String releaseTime = bookingRule.getReleaseTime();
        //今天医院规定的挂号的起始时间:2022-06-07 08:30
        DateTime dateTime = this.getDateTime(new Date(), releaseTime);
        if(dateTime.isBeforeNow()){
            cycle=cycle+1;
        }

        //预约周期内所有的时间列表(10天|11天)
        List<Date> list = new ArrayList<Date>();

        for(int i=0;i<cycle;i++){
            list.add(new DateTime( new DateTime().plusDays(i).toString("yyyy-MM-dd")).toDate());
        }

        int start = (pageNum-1)*pageSize;
        int end = start+pageSize;
        if(end>list.size()){
            end=list.size();
        }

        List<Date> currentPageDateList=new ArrayList<Date>();

        for(int j=start;j<end;j++){
            Date date = list.get(j);
            currentPageDateList.add(date);
        }

        com.baomidou.mybatisplus.extension.plugins.pagination.Page<Date> page = new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(pageNum, pageSize, list.size());
        page.setRecords(currentPageDateList);
        return page;
    }

(4)将Date日期(yyyy-MM-dd HH:mm)转换为DateTime

    /**
     * 将Date日期(yyyy-MM-dd HH:mm)转换为DateTime
     */
    private DateTime getDateTime(Date date, String timeString) {
        String dateTimeString = new DateTime(date).toString("yyyy-MM-dd") + " "+ timeString;
        DateTime dateTime = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm").parseDateTime(dateTimeString);
        return dateTime;
    }

(5)在DepartmentService类添加方法和实现

    /**
    * 根据医院编号 和 科室编号获取科室数据
    */
    Department getDepartment(String hoscode, String depcode);

    //实现方法:根据医院编号 和 科室编号获取科室数据
    @Override
    public Department getDepartment(String hoscode, String depcode) {
        return departmentRepository.getDepartmentByHoscodeAndDepcode(hoscode,depcode);
    }

(6)在HospitalApiController添加方法

@RestController
@RequestMapping("/user/hosp/schedule")
public class UserScheduleController {

    @Autowired
    private ScheduleService scheduleService;

    @GetMapping("/{hoscode}/{depcode}/{pageNum}/{pageSize}")
    public R getSchedulePage(@PathVariable String hoscode,
                             @PathVariable String depcode,
                             @PathVariable Integer pageNum,
                             @PathVariable Integer pageSize){

        Map<String,Object> map=scheduleService.getSchedulePageByCondition(hoscode,depcode,pageNum,pageSize);
        return R.ok().data(map);
    }

    @GetMapping("/{hoscode}/{depcode}/{workdate}")
    public R getScheduleDetail(@PathVariable String hoscode,
                               @PathVariable String depcode,
                               @PathVariable String workdate){

        List<Schedule> details = scheduleService.detail(hoscode, depcode, workdate);
        return R.ok().data("details",details);
    }
}

3、预约挂号详情前端

(1)在/api/schedule.js添加方法

import request from '@/utils/request'

const api_name = `/user/hosp/schedule`

export default {
    getSchedulePage(hoscode,depcode,pageNum,pageSize) {
        return request({
            url: `${api_name}/${hoscode}/${depcode}/${pageNum}/${pageSize}`,
            method: `get`
        })
    },
    getScheduleDetail(hoscode,depcode,workdate) {
        return request({
            url: `${api_name}/${hoscode}/${depcode}/${workdate}`,
            method: `get`
        })
    },
}

(2)页面显示
创建/pages/hospital/schedule.vue组件

<template>
    <!-- header -->
    <div class="nav-container page-component">
      <!--左侧导航 #start -->
      <div class="nav left-nav">
        <div class="nav-item selected">
          <span class="v-link selected dark" :onclick="'javascript:window.location=\'/hosp/'+hoscode+'\''">预约挂号 </span>
        </div>
        <div class="nav-item ">
          <span class="v-link clickable dark" :onclick="'javascript:window.location=\'/hosp/detail/'+hoscode+'\''"> 医院详情 </span>
        </div>
        <div class="nav-item">
          <span class="v-link clickable dark" :onclick="'javascript:window.location=\'/hosp/notice/'+hoscode+'\''"> 预约须知 </span>
        </div>
        <div class="nav-item "><span
          class="v-link clickable dark"> 停诊信息 </span>
        </div>
        <div class="nav-item "><span
          class="v-link clickable dark"> 查询/取消 </span>
        </div>
      </div>
      <!-- 左侧导航 #end -->
      <!-- 右侧内容 #start -->
      <div class="page-container">
        <div class="hospital-source-list">
          <div class="header-wrapper" style="justify-content:normal">
            <span class="v-link clickable" @click="show()">{{ baseMap.hosname}}</span>
            <div class="split"></div>
            <div>{{ baseMap.bigname }}</div>
          </div>
          <div class="title mt20"> {{ baseMap.depname }}</div>
          <!-- 号源列表 #start -->
          <div class="mt60">
            <div class="title-wrapper">{{ baseMap.workDateString }}</div>
            <div class="calendar-list-wrapper">
              <!-- item.depNumber == -1 ? 'gray space' : item.depNumber == 0 ? 'gray' : 'small small-space'-->
              <!-- selected , index == activeIndex ? 'selected' : ''-->
              <div :class="'calendar-item '+item.curClass" style="width: 124px;"
                   v-for="(item, index) in bookingScheduleList" :key="item.id"
                   @click="selectDate(item, index)">
                <div class="date-wrapper"><span>{{ item.workDate }}</span><span class="week">{{ item.dayOfWeek }}</span></div>
                <div class="status-wrapper" v-if="item.status == 0">{{ item.availableNumber == -1 ? '无号' : item.availableNumber == 0 ? '约满' : '有号' }}</div>
                <div class="status-wrapper" v-if="item.status == 1">即将放号</div>
                <div class="status-wrapper" v-if="item.status == -1">停止挂号</div>
              </div>
            </div>
            <!-- 分页 -->
            <el-pagination
               class="pagination"
               layout="prev, pager, next"
               :current-page="page"
               :total="total"
               :page-size="limit"
               @current-change="getPage">
            </el-pagination>
          </div>
          <!-- 即将放号 #start-->
          <div class="countdown-wrapper mt60" v-if="!tabShow">
            <div class="countdonw-title"> {{ time }}<span class="v-link selected">{{ baseMap.releaseTime }} </span>放号</div>
            <div class="countdown-text"> 倒 计 时
              <div>
                <span class="number">{{ timeString }}</span>
              </div>
            </div>
          </div>
          <!-- 即将放号 #end-->
          <!-- 号源列表 #end -->
          <!-- 上午号源 #start -->
          <div class="mt60" v-if="tabShow">
            <div class="">
              <div class="list-title">
                <div class="block"></div>
                上午号源
              </div>
              <div v-for="item in scheduleList" :key="item.id" >
                <div class="list-item" v-if="item.workTime == 0">
                  <div class="item-wrapper">
                    <div class="title-wrapper">
                      <div class="title">{{ item.title }}</div>
                      <div class="split"></div>
                      <div class="name"> {{ item.docname }}</div>
                    </div>
                    <div class="special-wrapper">{{ item.skill }}</div>
                  </div>
                  <div class="right-wrapper">
                    <div class="fee">{{ item.amount }}
                    </div>
                    <div class="button-wrapper">
                      <div class="v-button" @click="booking(item.id, item.availableNumber)" :style="item.availableNumber == 0 || pageFirstStatus == -1 ? 'background-color: #7f828b;' : ''">
                        <span>剩余<span class="number">{{ item.availableNumber }}</span></span></div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
          <!-- 上午号源 #end -->
          <!-- 下午号源 #start -->
          <div class="mt60" v-if="tabShow">
            <div class="">
              <div class="list-title">
                <div class="block"></div>
                下午号源
              </div>
              <div v-for="item in scheduleList" :key="item.id">
                <div class="list-item" v-if="item.workTime == 1">
                  <div class="item-wrapper">
                    <div class="title-wrapper">
                      <div class="title">{{ item.title }}</div>
                      <div class="split"></div>
                      <div class="name"> {{ item.docname }}</div>
                    </div>
                    <div class="special-wrapper">{{ item.skill }}</div>
                  </div>
                  <div class="right-wrapper">
                    <div class="fee">{{ item.amount }}
                    </div>
                    <div class="button-wrapper">
                      <div class="v-button" @click="booking(item.id, item.availableNumber)" :style="item.availableNumber == 0 || pageFirstStatus == -1 ? 'background-color: #7f828b;' : ''">
                        <span>剩余<span class="number">{{ item.availableNumber }}</span></span></div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
          <!-- 下午号源 #end -->
        </div>
      </div>
      <!-- 右侧内容 #end -->
    </div>
    <!-- footer -->
  </template>
  <script>
  import '~/assets/css/hospital_personal.css'
  import '~/assets/css/hospital.css'
  
  import scheduleApi from '@/api/schedule'
  export default {
    data() {
      return {
        hoscode: null,
        depcode: null,
        workDate: null,
        bookingScheduleList: [],
        scheduleList : [],
        baseMap : {},
        nextWorkDate: null, // 下一页第一个日期
        preWorkDate: null, // 上一页第一个日期
        tabShow: true, //挂号列表与即将挂号切换
        activeIndex: 0,
  
        page: 1, // 当前页
        limit: 7, // 每页个数
        total: 1, // 总页码
  
        timeString: null,
        time: '今天',
        timer: null,
  
        pageFirstStatus: 0 // 第一页第一条数据状态
      }
    },
  
    created() {
      this.hoscode = this.$route.query.hoscode
      this.depcode = this.$route.query.depcode
      this.workDate = this.getCurDate()
      this.getBookingScheduleRule()
    },
  
    methods: {
      getPage(page = 1) {
        this.page = page
        this.workDate = null
        this.activeIndex = 0
  
        this.getBookingScheduleRule()
      },
  
      getBookingScheduleRule() {
        scheduleApi.getSchedulePage( this.hoscode, this.depcode,this.page, this.limit).then(response => {
          this.bookingScheduleList = response.data.list
          this.total = response.data.total
          this.baseMap = response.data.baseMap
          console.log(this.total)
  
          this.dealClass()
  
          // 分页后workDate=null,默认选中第一个
          if (this.workDate == null) {
            this.workDate = this.bookingScheduleList[0].workDate
          }
          //判断当天是否停止预约 status == -1 停止预约
          if(this.workDate == this.getCurDate()) {
            this.pageFirstStatus = this.bookingScheduleList[0].status
          } else {
            this.pageFirstStatus = 0
          }
          this.findScheduleList()
        })
      },
  
      findScheduleList() {
        scheduleApi.getScheduleDetail(this.hoscode, this.depcode, this.workDate).then(response => {
          this.scheduleList = response.data.details
        })
      },
  
      selectDate(item, index) {
        this.workDate = item.workDate
        this.activeIndex = index
  
        //清理定时
        if(this.timer != null) clearInterval(this.timer)
  
        // 是否即将放号
        if(item.status == 1) {
          this.tabShow = false
          // 放号时间
          let releaseTime = new Date(this.getCurDate() + ' ' + this.baseMap.releaseTime).getTime()
          let nowTime = new Date().getTime();
          this.countDown(releaseTime, nowTime)
  
          this.dealClass();
        } else {
          this.tabShow = true
  
          this.getBookingScheduleRule()
        }
      },
  
      dealClass() {
        //处理样式
        for (let i = 0; i < this.bookingScheduleList.length; i++) {
          // depNumber -1:无号 0:约满 >0:有号
          let curClass = this.bookingScheduleList[i].availableNumber == -1 ? 'gray space' : this.bookingScheduleList[i].availableNumber == 0 ? 'gray' : 'small small-space'
          curClass += i == this.activeIndex ? ' selected' : ''
          this.bookingScheduleList[i].curClass = curClass
        }
      },
  
      getCurDate() {
        let datetime = new Date()
        let year = datetime.getFullYear()
        let month = datetime.getMonth() + 1 < 10 ? '0' + (datetime.getMonth() + 1) : datetime.getMonth() + 1
        let date = datetime.getDate() < 10 ? '0' + datetime.getDate() : datetime.getDate()
        return year + '-' + month + '-' + date
      },
  
      countDown(releaseTime, nowTime) {
        //计算倒计时时长
        let secondes = 0;
        if(releaseTime > nowTime) {
          this.time = '今天'
          //当前时间到放号时间的时长
          secondes = Math.floor((releaseTime - nowTime) / 1000);
        } else {
          this.time = '明天'
          //计算明天放号时间
          let releaseDate = new Date(releaseTime)
          releaseTime = new Date(releaseDate.setDate(releaseDate.getDate() + 1)).getTime()
          //当前时间到明天放号时间的时长
          secondes = Math.floor((releaseTime - nowTime) / 1000);
        }
  
        //定时任务
        this.timer = setInterval(() => {
          secondes = secondes - 1
          if(secondes <= 0) {
            clearInterval(timer);
            this.init()
          }
          this.timeString = this.convertTimeString(secondes)
        }, 1000);
        // 通过$once来监听定时器,在beforeDestroy钩子可以被清除。
        this.$once('hook:beforeDestroy', () => {
          clearInterval(timer);
        })
      },
  
      convertTimeString(allseconds) {
        if(allseconds <= 0) return '00:00:00'
        // 计算天数
        let days = Math.floor(allseconds / (60 * 60 * 24));
        // 小时
        let hours = Math.floor((allseconds - (days * 60 * 60 * 24)) / (60 * 60));
        // 分钟
        let minutes = Math.floor((allseconds - (days * 60 * 60 * 24) - (hours * 60 * 60)) / 60);
        // 秒
        let seconds = allseconds - (days * 60 * 60 * 24) - (hours * 60 * 60) - (minutes * 60);
  
        //拼接时间
        let timString = "";
        if (days > 0) {
          timString = days + "天:";
        }
        return timString += hours + " 时 " + minutes + " 分 " + seconds + " 秒 ";
      },
  
      show() {
        window.location.href = '/hospital/' + this.hoscode
      },
  
      booking(scheduleId, availableNumber) {
        if(availableNumber == 0 || this.pageFirstStatus == -1) {
          this.$message.error('不能预约')
        } else {
          window.location.href = '/hospital/booking?scheduleId=' + scheduleId
        }
      }
    }
  }
  </script>

这里还有个问题都是无号,我们需要重新导入数据到mongodb,使得日期跟今天对应上
在这里插入图片描述
改成自己当前的月份
在这里插入图片描述
登陆第三方管理医院系统
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、预约确认

1、需求

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、预约确认接口

(1)在ScheduleService添加方法和实现

     /**
     * 根据id获取排班
     * @param id
     */
    Schedule getScheduleList(String id);

    //实现方法:根据id获取排班
    @Override
    public Schedule getScheduleList(String id) {
        Schedule schedule = scheduleRepository.findById(id).get();
        this.packageSchedule(schedule);
        return schedule;
    }

(2)在HospitalApiController添加方法

    @ApiOperation(value = "获取排班详情")
    @GetMapping("getSchedule/{id}")
    public R getScheduleList(
            @PathVariable String id) {
        Schedule schedule = scheduleService.getScheduleList(id);
        return R.ok().data("schedule",schedule);
    }

3、预约确认前端

(1)在/api/schedule.js添加方法

    getSchedule(id) {
        return request({
            url: `${api_name}/getSchedule/${id}`,
            method: 'get'
        })
    }

(2)页面显示
创建/pages/hospital/booking.vue组件

<template>
    <!-- header -->
    <div class="nav-container page-component">
      <!--左侧导航 #start -->
      <div class="nav left-nav">
        <div class="nav-item selected">
          <span class="v-link selected dark" :onclick="'javascript:window.location=\'/hospital/'+schedule.hoscode+'\''">预约挂号 </span>
        </div>
        <div class="nav-item ">
          <span class="v-link clickable dark" :onclick="'javascript:window.location=\'/hospital/detail/'+schedule.hoscode+'\''"> 医院详情 </span>
        </div>
        <div class="nav-item">
          <span class="v-link clickable dark" :onclick="'javascript:window.location=\'/hospital/notice/'+schedule.hoscode+'\''"> 预约须知 </span>
        </div>
        <div class="nav-item "><span
          class="v-link clickable dark"> 停诊信息 </span>
        </div>
        <div class="nav-item "><span
          class="v-link clickable dark"> 查询/取消 </span>
        </div>
      </div>
      <!-- 左侧导航 #end -->
  
      <!-- 右侧内容 #start -->
      <div class="page-container">
        <div class="hospital-order">
          <div class="header-wrapper">
            <div class="title mt20"> 确认挂号信息</div>
            <div>
              <div class="sub-title">
                <div class="block"></div>
                选择就诊人:
              </div>
              <div class="patient-wrapper">
                <div >
                  <div class="v-card clickable item ">
                    <div class="inline" v-for="(item,index) in patientList" :key="item.id"
                         @click="selectPatient(index)" style="margin-right: 10px;">
                      <!-- 选中 selected  未选中去掉selected-->
                      <div :class="activeIndex == index ? 'item-wrapper selected' : 'item-wrapper'">
                        <div>
                          <div class="item-title">{{ item.name }}</div>
                          <div>{{ item.param.certificatesTypeString }}</div>
                          <div>{{ item.certificatesNo }}</div>
                        </div>
                        <img src="//img.114yygh.com/static/web/checked.png" class="checked">
                      </div>
                    </div>
                  </div>
                </div>
                <div class="item space add-patient v-card clickable">
                  <div class="">
                    <div class="item-add-wrapper" @click="addPatient()"> +
                      添加就诊人
                    </div>
                  </div>
                </div>
                <div class="el-loading-mask" style="display: none;">
                  <div class="el-loading-spinner">
                    <svg viewBox="25 25 50 50" class="circular">
                      <circle cx="50" cy="50" r="20" fill="none" class="path"></circle>
                    </svg>
                  </div>
                </div>
              </div>
              <!-- 就诊人,选中显示 -->
              <div class="sub-title" v-if="patientList.length > 0">
                <div class="block"></div>
                选择就诊卡: <span class="card-tips"><span
                class="iconfont"></span> 如您持社保卡就诊,请务必选择医保预约挂号,以保证正常医保报销</span>
              </div>
  
              <el-card class="patient-card" shadow="always" v-if="patientList.length > 0">
                <div slot="header" class="clearfix">
                  <div><span class="name"> {{ patient.name }} {{ patient.certificatesNo }} 居民身份证</span></div>
                </div>
                <div class="card SELF_PAY_CARD">
                  <div class="info"><span class="type">{{ patient.isInsure == 0 ? '自费' : '医保'}}</span><span class="card-no">{{ patient.certificatesNo }}</span><span
                    class="card-view">居民身份证</span></div>
                  <span class="operate"></span></div>
                <div class="card">
                  <div class="text bind-card"></div>
                </div>
              </el-card>
  
              <div class="sub-title">
                <div class="block"></div>
                挂号信息
              </div>
              <div class="content-wrapper">
                <el-form ref="form">
                  <el-form-item label="就诊日期:">
                    <div class="content"><span>{{ schedule.workDate }} {{ schedule.param.dayOfWeek }} {{ schedule.workTime == 0 ? '上午' : '下午' }}</span></div>
                  </el-form-item>
                  <el-form-item label="就诊医院:">
                    <div class="content"><span>{{ schedule.param.hosname }} </span></div>
                  </el-form-item>
                  <el-form-item label="就诊科室:">
                    <div class="content"><span>{{ schedule.param.depname }} </span></div>
                  </el-form-item>
                  <el-form-item label="医生姓名:">
                    <div class="content"><span>{{ schedule.docname }} </span></div>
                  </el-form-item>
                  <el-form-item label="医生职称:">
                    <div class="content"><span>{{ schedule.title }} </span></div>
                  </el-form-item>
                  <el-form-item label="医生专长:">
                    <div class="content"><span>{{ schedule.skill }}</span></div>
                  </el-form-item>
                  <el-form-item label="医事服务费:">
                    <div class="content">
                      <div class="fee">{{ schedule.amount }}</div>
                    </div>
                  </el-form-item>
                </el-form>
              </div>
  
              <!-- 用户信息 #start-->
              <div>
                <div class="sub-title">
                  <div class="block"></div>
                  用户信息
                </div>
                <div class="content-wrapper">
                  <el-form ref="form" :model="form">
                    <el-form-item class="form-item" label="就诊人手机号:">
                      {{ patient.phone }}
                    </el-form-item>
                  </el-form>
                </div>
              </div>
              <!-- 用户信息 #end -->
              <div class="bottom-wrapper">
                <div class="button-wrapper">
                  <div class="v-button" @click="submitOrder()">{{ submitBnt }}</div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
      <!-- 右侧内容 #end -->
    </div>
    <!-- footer -->
  </template>
  
  <script>
  import '~/assets/css/hospital_personal.css'
  import '~/assets/css/hospital.css'
  
  import scheduleApi from '@/api/schedule'
  import patientApi from '@/api/patient'
  
  export default {
  
    data() {
      return {
        scheduleId: null,
        schedule: {
          param: {}
        },
        patientList: [],
        patient: {},
  
        activeIndex: 0,
        submitBnt: '确认挂号'
      }
    },
  
    created() {
      this.scheduleId = this.$route.query.scheduleId
  
      this.init()
    },
  
    methods: {
      init() {
        this.getSchedule()
  
        this.findPatientList()
      },
  
      getSchedule() {
        scheduleApi.getSchedule(this.scheduleId).then(response => {
          this.schedule = response.data.schedule
        })
      },
  
      findPatientList() {
        patientApi.findList().then(response => {
          this.patientList = response.data.list
          if(this.patientList.length > 0) {
            this.patient = this.patientList[0]
          }
        })
      },
  
      selectPatient(index) {
        this.activeIndex = index;
        this.patient = this.patientList[index]
      },
  
      submitOrder() {
        
      },
  
      addPatient() {
        window.location.href = '/patient/add'
      }
    }
  }
  </script>
  <style>
    .hospital-order .header-wrapper {
      display: -webkit-box;
      display: -ms-flexbox;
      display: block !important;
      -webkit-box-align: center;
      -ms-flex-align: center;
      align-items: center;
    }
    .hospital-order .sub-title {
      letter-spacing: 1px;
      color: #999;
      margin-top: 60px;
      display: -webkit-box;
      display: -ms-flexbox;
      display: flex;
      -webkit-box-align: center;
      -ms-flex-align: center;
      align-items: center;
    }
    .hospital-order .content-wrapper .content {
      color: #333;
    }
    .el-form-item {
      margin-bottom: 5px;
    }
    .hospital-order .content-wrapper {
      margin-left: 140px;
      margin-top: 20px;
    }
  </style>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/369867.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA设计模式之工厂模式讲解

目录 前言 开始表演 前言 Java中使用工厂模式的主要原因是为了实现代码的灵活性和可维护性。工厂模式是一种创建型设计模式&#xff0c;它提供了一种将对象的创建和使用进行分离的方式。具体来说&#xff0c;工厂模式可以将对象的创建过程封装在一个独立的工厂类中&#xff…

自动微分记录

计算图(数据流图):AI系统化问题 - 计算图的提出 计算图和自动微分 单算子切分、图的切分和调度 前端->统一表示->优化层->运行时态->底层库 语言 计算网络模型中间表示 计算图 自动微分 计算图优化 内存管理、计算图调度和执行 内核代码优化与编译 多硬件支持…

ip-guard如何在控制台上判断策略是否下发成功?

方法1.看控制台策略设置是否带*号,一般带*,然后刷新控制台依旧带*,说明策略没下发。可以点击刷新按钮进行刷新。 方法2.运行cmd,将控制台程序拖入命令行中,加参数-ad,回车运行。 然后,选中指定客户端,在维护-命令行,输入policy,

骨传导耳机是怎么发声的,骨传导耳机值得入手嘛

现在市面上除了我们平时比较常见的有线耳机、头戴耳机、真无线耳机&#xff0c;近两年还涌现出了一种有着黑科技之称的特别耳机——骨传导耳机&#xff0c;并且因其在运动场景下的优势过于明显而得到了众多运动爱好者的大力追捧。那么今天我们就来聊聊这款所谓的黑科技骨传导耳…

webform如何升级mvc

1.创建项目 给项目起名字然后指定存储位置 选择asp.net 空项目 2.新建model namespace WebFormToMvc {/// <summary>/// 用户模型/// </summary>public class UserModel{/// <summary>/// id/// </summary>public int Id { get; set; }/// <sum…

解决Chrome浏览器内置翻译无法使用的问题

hosts文件 hosts是一个没有扩展名的系统文件&#xff0c;可以用记事本等工具打开&#xff0c;主要作用是定义IP地址和主机名的映射关系&#xff0c;是一个映射IP地址和主机名的规定。当用户在浏览器中输入一个需要登录的网址时&#xff0c;系统会首先自动从hosts文件中寻找对应…

上海亚商投顾:沪指收跌0.62% 东数西算板块逆势领涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪三大指数今日震荡调整&#xff0c;盘中集体跌超1%&#xff0c;随后沪指跌幅有所收窄。东数西算概念午后走强&#xf…

【FLASH存储器系列二十一】如何评估固态硬盘的性能?

我们以三星消费级SSD 990 PRO为例进行介绍&#xff0c;下图为其产品配置&#xff1a; 简单说明一下产品配置&#xff1a;990 pro容量有1T和2T两种规格&#xff0c;固态硬盘容量计算一般是1T1000GB1000000MB&#xff0c;与操作系统容量计算1T1024GB不一样&#xff0c;使用M.2外形…

Editor工具开发基础三:自定义组件菜单拓展 CustomEditor

一.创建脚本路径 创建脚本路径不再限制 一般写在自定义组件类的下边二.特性CustomEditor 定义主设计图面由自定义代码实现数组的编辑器。两个构造函数1.public CustomEditor(Type inspectedType);2.public CustomEditor(Type inspectedType, bool editorForChildClasses);参数意…

[架构之路-118]-《软考-系统架构设计师》-软架构设计-11-可靠性相关设计

第11节 可靠性相关设计11.1 可靠性基本概念可靠性工程是研究产品生命周期中故障的发生、发展规律&#xff0c;达到预防故障&#xff0c;消灭故障&#xff0c;提高产品可用性的工程技术。信息系统的可靠性是指系统在满足一定条件的应用环境中能够正常工作的能力&#xff0c;可以…

如何理解「数据驱动业务」?

“数据驱动”描述了一种业务状态&#xff0c;在这种状态中&#xff0c;数据被用于实时有效地推动决策和其他相关活动。对于企业来说&#xff0c;达到数据驱动的状态就像是开车和骑马旅行的区别。数据驱动的业务能够更快、更高效地达到目标。 数据驱动特征包括质量良好的数据整…

高品质运动耳机哪款更好用、运动耳机最好的牌子推荐

在运动的时候大家都会选择戴上耳机&#xff0c;用音乐来”调味“&#xff0c;让跑步的过程不那么枯燥乏味。说到运动耳机&#xff0c;除了老生常谈的音质以外&#xff0c;耳机的材质、耳机的工艺&#xff0c;耳机的佩戴稳固性等&#xff0c;也都在影响着用户的体验&#xff0c;…

181、【动态规划】leetcode ——72. 编辑距离(C++版本)

题目描述 原题链接&#xff1a;72. 编辑距离 解题思路 动态规划五步曲&#xff1a; &#xff08;1&#xff09;dp[i][j]含义&#xff1a; 以word1[i - 1]和word2[j - 1]结尾子串&#xff0c;经过最少次增删改后&#xff0c;可让word1变为word2的步数。dp中的i对应word1中的i…

命令执行漏洞多种写入webshell方式总结

命令行写shell注意事项&#xff1a;1.注意单引号和双引号的区别&#xff1a;单引号用单引号 ’ 括起来的字符会保留引号内每个字符的字面值简而言之&#xff0c;shell 将逐字解释单引号内的封闭文本&#xff0c;并且不会插入任何内容&#xff0c;包括变量、反引号、某些 \ 转义…

内存管理框架---Slab(二)

站在Arnold Lu南京大佬的肩膀&#xff0c;俯瞰内存管理之slab 文章目录slab层的由来slab/slub/slobslab层的设计思想slab相关数据结构创建slab描述符分配slab对象释放slab对象销毁缓存在内核栈上的静态分配高端内存的映射永久映射临时映射每个CPU的分配新的每个CPU接口编译时的…

自动驾驶仿真测试介绍

作者 | 楼泽如 上海控安可信软件创新研究院研发工程师 来源 | 鉴源实验室 01 引 言 自动驾驶汽车的兴起&#xff0c;正在重新定义汽车行业。随着自动驾驶技术的发展&#xff0c;自动驾驶汽车将会大大提升交通安全、减少事故发生、减少交通拥堵、提高公路容量等等&#xff0…

我这样实现Promise

一、剖析Promise的基础框架 要实现Promise原理&#xff0c;肯定得先明白其原理。Promsie的基础框架如下&#xff1a; // 挂在原型上的方法&#xff0c;实例对象可以访问并且使用 MyPromise.prototype.then function(onResolved, onRejected) {//.then接收两个函数类型的形参…

Elasticsearch7.8.0版本进阶——文档分析 分析器

目录一、文档分析过程二、分析器三、内置分析器3.1、标准分析器3.2、简单分析器3.3、空格分析器3.4、语言分析器四、分析器使用场景五、分析器的测试示例一、文档分析过程 将一块文本分成适合于倒排索引的独立的词条。将这些词条统一化为标准格式以提高它们的“可搜索性”&…

RFID在产线上的作用

RFID在产线上的作用RFID技术应用于产线监控&#xff0c;可以实现产线的自动控制和检测。RFID读写器每识别一个产品标签&#xff0c;就可以将数据传输到电脑程序中&#xff0c;记录每1件产品的原料和来源、生产线位置、生产过程和库存状况等信息&#xff0c;为企业更好地管理生产…

实现基于国密SM3的密钥派生(KDF)功能

实现基于国密SM3的密钥派生&#xff08;KDF&#xff09;前言KDF 标准基于SM3的kdf实现前言 密钥派生函数&#xff08;KDF&#xff09;&#xff1a;密钥派生函数是指从一个共享的秘密比特串中派生密钥数据&#xff0c;在密钥协商过程中&#xff0c;密钥派生函数作用在密钥交换所…