schedule.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. <template>
  2. <!-- header -->
  3. <div class="nav-container page-component">
  4. <!--左侧导航 #start -->
  5. <div class="nav left-nav">
  6. <div class="nav-item selected">
  7. <span class="v-link selected dark" :onclick="'javascript:window.location=\'/hospital/'+hoscode+'\''">预约挂号 </span>
  8. </div>
  9. <div class="nav-item ">
  10. <span class="v-link clickable dark" :onclick="'javascript:window.location=\'/hospital/detail/'+hoscode+'\''"> 医院详情 </span>
  11. </div>
  12. <div class="nav-item">
  13. <span class="v-link clickable dark" :onclick="'javascript:window.location=\'/hospital/notice/'+hoscode+'\''"> 预约须知 </span>
  14. </div>
  15. <div class="nav-item "><span
  16. class="v-link clickable dark"> 停诊信息 </span>
  17. </div>
  18. <div class="nav-item "><span
  19. class="v-link clickable dark"> 查询/取消 </span>
  20. </div>
  21. </div>
  22. <!-- 左侧导航 #end -->
  23. <!-- 右侧内容 #start -->
  24. <div class="page-container">
  25. <div class="hospital-source-list">
  26. <div class="header-wrapper" style="justify-content:normal">
  27. <span class="v-link clickable" @click="show()">{{ baseMap.hosname}}</span>
  28. <div class="split"></div>
  29. <div>{{ baseMap.bigname }}</div>
  30. </div>
  31. <div class="title mt20"> {{ baseMap.depname }}</div>
  32. <!-- 号源列表 #start -->
  33. <div class="mt60">
  34. <div class="title-wrapper">{{ baseMap.workDateString }}</div>
  35. <div class="calendar-list-wrapper">
  36. <!-- item.depNumber == -1 ? 'gray space' : item.depNumber == 0 ? 'gray' : 'small small-space'-->
  37. <!-- selected , index == activeIndex ? 'selected' : ''-->
  38. <div :class="'calendar-item '+item.curClass" style="width: 124px;"
  39. v-for="(item, index) in bookingScheduleList" :key="item.id"
  40. @click="selectDate(item, index)">
  41. <div class="date-wrapper"><span>{{ item.workDate }}</span><span class="week">{{ item.dayOfWeek }}</span></div>
  42. <div class="status-wrapper" v-if="item.status == 0">{{ item.availableNumber == -1 ? '无号' : item.availableNumber == 0 ? '约满' : '有号' }}</div>
  43. <div class="status-wrapper" v-if="item.status == 1">即将放号</div>
  44. <div class="status-wrapper" v-if="item.status == -1">停止挂号</div>
  45. </div>
  46. </div>
  47. <!-- 分页 -->
  48. <el-pagination
  49. class="pagination"
  50. layout="prev, pager, next"
  51. :current-page="page"
  52. :total="total"
  53. :page-size="limit"
  54. @current-change="getPage">
  55. </el-pagination>
  56. </div>
  57. <!-- 即将放号 #start-->
  58. <div class="countdown-wrapper mt60" v-if="!tabShow">
  59. <div class="countdonw-title"> {{ time }}<span class="v-link selected">{{ baseMap.releaseTime }} </span>放号</div>
  60. <div class="countdown-text"> 倒 计 时
  61. <div>
  62. <span class="number">{{ timeString }}</span>
  63. </div>
  64. </div>
  65. </div>
  66. <!-- 即将放号 #end-->
  67. <!-- 号源列表 #end -->
  68. <!-- 上午号源 #start -->
  69. <div class="mt60" v-if="tabShow">
  70. <div class="">
  71. <div class="list-title">
  72. <div class="block"></div>
  73. 上午号源
  74. </div>
  75. <div v-for="item in scheduleList" :key="item.id" v-if="item.workTime == 0">
  76. <div class="list-item">
  77. <div class="item-wrapper">
  78. <div class="title-wrapper">
  79. <div class="title">{{ item.title }}</div>
  80. <div class="split"></div>
  81. <div class="name"> {{ item.docname }}</div>
  82. </div>
  83. <div class="special-wrapper">{{ item.skill }}</div>
  84. </div>
  85. <div class="right-wrapper">
  86. <div class="fee"> ¥{{ item.amount }}
  87. </div>
  88. <div class="button-wrapper">
  89. <div class="v-button" @click="booking(item.id, item.availableNumber)" :style="item.availableNumber == 0 || pageFirstStatus == -1 ? 'background-color: #7f828b;' : ''">
  90. <span>剩余<span class="number">{{ item.availableNumber }}</span></span></div>
  91. </div>
  92. </div>
  93. </div>
  94. </div>
  95. </div>
  96. </div>
  97. <!-- 上午号源 #end -->
  98. <!-- 下午号源 #start -->
  99. <div class="mt60" v-if="tabShow">
  100. <div class="">
  101. <div class="list-title">
  102. <div class="block"></div>
  103. 下午号源
  104. </div>
  105. <div v-for="item in scheduleList" :key="item.id" v-if="item.workTime == 1">
  106. <div class="list-item">
  107. <div class="item-wrapper">
  108. <div class="title-wrapper">
  109. <div class="title">{{ item.title }}</div>
  110. <div class="split"></div>
  111. <div class="name"> {{ item.docname }}</div>
  112. </div>
  113. <div class="special-wrapper">{{ item.skill }}</div>
  114. </div>
  115. <div class="right-wrapper">
  116. <div class="fee"> ¥{{ item.amount }}
  117. </div>
  118. <div class="button-wrapper">
  119. <div class="v-button" @click="booking(item.id, item.availableNumber)" :style="item.availableNumber == 0 || pageFirstStatus == -1 ? 'background-color: #7f828b;' : ''">
  120. <span>剩余<span class="number">{{ item.availableNumber }}</span></span></div>
  121. </div>
  122. </div>
  123. </div>
  124. </div>
  125. </div>
  126. </div>
  127. <!-- 下午号源 #end -->
  128. </div>
  129. </div>
  130. <!-- 右侧内容 #end -->
  131. </div>
  132. <!-- footer -->
  133. </template>
  134. <script>
  135. import '~/assets/css/hospital_personal.css'
  136. import '~/assets/css/hospital.css'
  137. import hospitalApi from '@/api/hosp/hospital'
  138. export default {
  139. data() {
  140. return {
  141. hoscode: null,
  142. depcode: null,
  143. workDate: null,
  144. bookingScheduleList: [],
  145. scheduleList : [],
  146. baseMap : {},
  147. nextWorkDate: null, // 下一页第一个日期
  148. preWorkDate: null, // 上一页第一个日期
  149. tabShow: true, //挂号列表与即将挂号切换
  150. activeIndex: 0,
  151. page: 1, // 当前页
  152. limit: 7, // 每页个数
  153. total: 1, // 总页码
  154. timeString: null,
  155. time: '今天',
  156. timer: null,
  157. pageFirstStatus: 0 // 第一页第一条数据状态
  158. }
  159. },
  160. created() {
  161. this.hoscode = this.$route.query.hoscode
  162. this.depcode = this.$route.query.depcode
  163. this.workDate = this.getCurDate()
  164. this.getBookingScheduleRule()
  165. },
  166. methods: {
  167. getPage(page = 1) {
  168. this.page = page
  169. this.workDate = null
  170. this.activeIndex = 0
  171. this.getBookingScheduleRule()
  172. },
  173. getBookingScheduleRule() {
  174. hospitalApi.getBookingScheduleRule(this.page, this.limit, this.hoscode, this.depcode).then(response => {
  175. this.bookingScheduleList = response.data.bookingScheduleList
  176. this.total = response.data.total
  177. this.baseMap = response.data.baseMap
  178. this.dealClass()
  179. // 分页后workDate=null,默认选中第一个
  180. if (this.workDate == null) {
  181. this.workDate = this.bookingScheduleList[0].workDate
  182. }
  183. //判断当天是否停止预约 status == -1 停止预约
  184. if(this.workDate == this.getCurDate()) {
  185. this.pageFirstStatus = this.bookingScheduleList[0].status
  186. } else {
  187. this.pageFirstStatus = 0
  188. }
  189. this.findScheduleList()
  190. })
  191. },
  192. findScheduleList() {
  193. hospitalApi.findScheduleList(this.hoscode, this.depcode, this.workDate).then(response => {
  194. this.scheduleList = response.data
  195. })
  196. },
  197. selectDate(item, index) {
  198. this.workDate = item.workDate
  199. this.activeIndex = index
  200. //清理定时
  201. if(this.timer != null) clearInterval(this.timer)
  202. // 是否即将放号
  203. if(item.status == 1) {
  204. this.tabShow = false
  205. // 放号时间
  206. let releaseTime = new Date(this.getCurDate() + ' ' + this.baseMap.releaseTime).getTime()
  207. let nowTime = new Date().getTime();
  208. this.countDown(releaseTime, nowTime)
  209. this.dealClass();
  210. } else {
  211. this.tabShow = true
  212. this.getBookingScheduleRule()
  213. }
  214. },
  215. dealClass() {
  216. //处理样式
  217. for (let i = 0; i < this.bookingScheduleList.length; i++) {
  218. // depNumber -1:无号 0:约满 >0:有号
  219. let curClass = this.bookingScheduleList[i].availableNumber == -1 ? 'gray space' : this.bookingScheduleList[i].availableNumber == 0 ? 'gray' : 'small small-space'
  220. curClass += i == this.activeIndex ? ' selected' : ''
  221. this.bookingScheduleList[i].curClass = curClass
  222. }
  223. },
  224. getCurDate() {
  225. let datetime = new Date()
  226. let year = datetime.getFullYear()
  227. let month = datetime.getMonth() + 1 < 10 ? '0' + (datetime.getMonth() + 1) : datetime.getMonth() + 1
  228. let date = datetime.getDate() < 10 ? '0' + datetime.getDate() : datetime.getDate()
  229. return year + '-' + month + '-' + date
  230. },
  231. countDown(releaseTime, nowTime) {
  232. //计算倒计时时长
  233. let secondes = 0;
  234. if(releaseTime > nowTime) {
  235. this.time = '今天'
  236. //当前时间到放号时间的时长
  237. secondes = Math.floor((releaseTime - nowTime) / 1000);
  238. } else {
  239. this.time = '明天'
  240. //计算明天放号时间
  241. let releaseDate = new Date(releaseTime)
  242. releaseTime = new Date(releaseDate.setDate(releaseDate.getDate() + 1)).getTime()
  243. //当前时间到明天放号时间的时长
  244. secondes = Math.floor((releaseTime - nowTime) / 1000);
  245. }
  246. //定时任务
  247. this.timer = setInterval(() => {
  248. secondes = secondes - 1
  249. if(secondes <= 0) {
  250. clearInterval(timer);
  251. this.init()
  252. }
  253. this.timeString = this.convertTimeString(secondes)
  254. }, 1000);
  255. // 通过$once来监听定时器,在beforeDestroy钩子可以被清除。
  256. this.$once('hook:beforeDestroy', () => {
  257. clearInterval(timer);
  258. })
  259. },
  260. convertTimeString(allseconds) {
  261. if(allseconds <= 0) return '00:00:00'
  262. // 计算天数
  263. let days = Math.floor(allseconds / (60 * 60 * 24));
  264. // 小时
  265. let hours = Math.floor((allseconds - (days * 60 * 60 * 24)) / (60 * 60));
  266. // 分钟
  267. let minutes = Math.floor((allseconds - (days * 60 * 60 * 24) - (hours * 60 * 60)) / 60);
  268. // 秒
  269. let seconds = allseconds - (days * 60 * 60 * 24) - (hours * 60 * 60) - (minutes * 60);
  270. //拼接时间
  271. let timString = "";
  272. if (days > 0) {
  273. timString = days + "天:";
  274. }
  275. return timString += hours + " 时 " + minutes + " 分 " + seconds + " 秒 ";
  276. },
  277. show() {
  278. window.location.href = '/hospital/' + this.hoscode
  279. },
  280. booking(scheduleId, availableNumber) {
  281. debugger
  282. if(availableNumber == 0 || this.pageFirstStatus == -1) {
  283. this.$message.error('不能预约')
  284. } else {
  285. window.location.href = '/hospital/booking?scheduleId=' + scheduleId
  286. }
  287. }
  288. }
  289. }
  290. </script>