血透系统pad前端

WaitingArea.vue 22KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733
  1. <template>
  2. <div>
  3. <div v-loading="loading">
  4. <div class="screening">
  5. <!--<div @click="reloads()">刷新</div>-->
  6. <ul>
  7. <li
  8. v-for="(item, i) in menuList"
  9. :class="select_index == i ? 'active' : ''"
  10. @click="menuTabClick(i)"
  11. :key="i"
  12. >
  13. {{ item.label + (item.count > 0 ? "(" + item.count + ")" : "") }}
  14. </li>
  15. <el-popover
  16. v-model="zone_options_visible"
  17. placement="bottom"
  18. trigger="click"
  19. >
  20. <li slot="reference">
  21. {{ zone_options[zone_selected].text }}
  22. <span class="iconfont">&#xe74a;</span>
  23. </li>
  24. <div class="popover-demo-content">
  25. <ul>
  26. <li
  27. v-for="(option, index) in zone_options"
  28. :key="index"
  29. @click="handleZoneChange(index, option)"
  30. :class="zone_selected == index ? 'tick' : ''"
  31. >
  32. {{ option.text }}
  33. </li>
  34. </ul>
  35. </div>
  36. </el-popover>
  37. <el-popover
  38. v-model="time_options_visible"
  39. placement="bottom"
  40. trigger="click"
  41. >
  42. <li slot="reference">
  43. {{ time_options[time_selected].text }}
  44. <span class="iconfont">&#xe74a;</span>
  45. </li>
  46. <div class="popover-demo-content">
  47. <ul>
  48. <li
  49. v-for="(option, index) in time_options"
  50. :key="index"
  51. @click="handleTimeChange(index)"
  52. :class="time_selected == index ? 'tick' : ''"
  53. >
  54. {{ option.text }}
  55. </li>
  56. </ul>
  57. </div>
  58. </el-popover>
  59. </ul>
  60. </div>
  61. <div class="stateBox">
  62. <!-- <patient-box class="clearfix" :patients="filtedScheduals "></patient-box> -->
  63. <div v-for="(item, index) in filtedScheduals" :key="index">
  64. <h2 class="title">{{ item.zone_name }}</h2>
  65. <patient-box
  66. class="clearfix"
  67. :patients="item.scheduals"
  68. ></patient-box>
  69. </div>
  70. <div class="NoData" v-if="filtedScheduals.length == 0 && networkStates">
  71. <img
  72. style="margin-top: 50px; margin-bottom: 50px"
  73. src="@/assets/login/data.jpg"
  74. alt
  75. />
  76. </div>
  77. <div
  78. class="NoData"
  79. v-if="!networkStates"
  80. style="display: block;text-align: center;"
  81. >
  82. <!--<img style="margin-top: 50px; margin-bottom: 50px" src="@/assets/login/no_network.jpg" alt="">-->
  83. <p style="margin-top: 100px;font-size: 18px">
  84. 网络异常,请点击重新加载
  85. </p>
  86. <van-button
  87. slot="button"
  88. size="normal"
  89. type="info"
  90. style="display:block;margin:0 auto"
  91. @click="reloads()"
  92. >重新加载</van-button
  93. >
  94. </div>
  95. </div>
  96. </div>
  97. </div>
  98. </template>
  99. <script>
  100. import PatientBox from './PatientBox'
  101. import { getWaitingScheduals } from '@/api/dialysis'
  102. import { parseTime } from '@/utils'
  103. import { Popover } from 'vux'
  104. import { Toast } from 'vant'
  105. import {
  106. getSelectedAreaDataConfigList,
  107. getSelectedTimesDataConfigList,
  108. setSelectedAreaDataConfigList,
  109. setSelectedTimesDataConfigList,
  110. setWaitTypeSelectedConfig,
  111. getWaitTypeSelectedConfig
  112. } from '@/utils/data_config'
  113. export default {
  114. name: 'WaitingArea',
  115. components: {
  116. PatientBox,
  117. Popover
  118. },
  119. inject: ['reload'],
  120. data () {
  121. return {
  122. loading: false,
  123. menuList: [
  124. { value: '1', label: '全部', count: 0 },
  125. { value: '3', label: '待开处方', count: 0 },
  126. { value: '2', label: '待称重', count: 0 }
  127. ],
  128. select_index: 0,
  129. zone_selected: 0,
  130. time_selected: 0,
  131. cur_zone_selected: 0,
  132. networkStates: true,
  133. scheduals: [],
  134. zone_options: [{ value: 0, text: '全部分区' }],
  135. zone_scheduals: [],
  136. time_options: [
  137. { value: 0, text: '全部班' },
  138. { value: 1, text: '上午' },
  139. { value: 2, text: '下午' },
  140. { value: 3, text: '晚上' }
  141. ],
  142. zone_options_visible: false,
  143. time_options_visible: false
  144. }
  145. },
  146. props: {
  147. search_keyword: {
  148. type: String
  149. }
  150. },
  151. computed: {
  152. filtedScheduals: function () {
  153. var search_keyword = this.search_keyword
  154. if (this.search_keyword.length > 0) {
  155. var scheduals = []
  156. for (let index = 0; index < this.scheduals.length; index++) {
  157. const schedual = this.scheduals[index]
  158. if (
  159. schedual.patient.name.indexOf(search_keyword) != -1 ||
  160. schedual.patient.dialysis_no.indexOf(search_keyword) != -1
  161. ) {
  162. scheduals.push(schedual)
  163. }
  164. }
  165. return this.processScheduals(scheduals)
  166. }
  167. //
  168. if (this.zone_selected != 0) {
  169. // var zone_name = this.zone_options[this.zone_selected].text
  170. // for (let index = 0; index < this.zone_scheduals.length; index++) {
  171. // const zone_scheduals = this.zone_scheduals[index]
  172. // if (zone_scheduals.zone_name == zone_name) {
  173. // return [zone_scheduals]
  174. // }
  175. // }
  176. var zone_name = this.zone_options[this.zone_selected].text
  177. var schedules = []
  178. var filtedSchedules = []
  179. for (let o_i = 0; o_i < this.zone_scheduals.length; o_i++) {
  180. const scheduleInfo = this.zone_scheduals[o_i]
  181. var originSchedules = scheduleInfo.scheduals
  182. for (let s_i = 0; s_i < originSchedules.length; s_i++) {
  183. const schedule = originSchedules[s_i]
  184. if (this.zone_selected == 0) {
  185. if (
  186. this.time_selected == 0 ||
  187. schedule.schedule_type == this.time_selected
  188. ) {
  189. filtedSchedules.push(schedule)
  190. }
  191. } else {
  192. if (
  193. zone_name.length > 0 &&
  194. zone_name == schedule.device_number.zone.name
  195. ) {
  196. if (
  197. this.time_selected == 0 ||
  198. schedule.schedule_type == this.time_selected
  199. ) {
  200. filtedSchedules.push(schedule)
  201. }
  202. }
  203. }
  204. }
  205. // if (filtedSchedules.length > 0) {
  206. // schedules.push({
  207. // zone_name: scheduleInfo.zone_name,
  208. // scheduals: filtedSchedules
  209. // });
  210. // }
  211. }
  212. console.log(filtedSchedules)
  213. return this.processScheduals(filtedSchedules)
  214. }
  215. if (this.time_selected != 0) {
  216. var zone_name = this.zone_options[this.zone_selected].text
  217. var schedules = []
  218. var filtedSchedules = []
  219. for (let o_i = 0; o_i < this.zone_scheduals.length; o_i++) {
  220. const scheduleInfo = this.zone_scheduals[o_i]
  221. var originSchedules = scheduleInfo.scheduals
  222. for (let s_i = 0; s_i < originSchedules.length; s_i++) {
  223. const schedule = originSchedules[s_i]
  224. if (this.zone_selected == 0) {
  225. if (
  226. this.time_selected == 0 ||
  227. schedule.schedule_type == this.time_selected
  228. ) {
  229. filtedSchedules.push(schedule)
  230. }
  231. } else {
  232. if (
  233. zone_name.length > 0 &&
  234. zone_name == schedule.device_number.zone.name
  235. ) {
  236. if (
  237. this.time_selected == 0 ||
  238. schedule.schedule_type == this.time_selected
  239. ) {
  240. filtedSchedules.push(schedule)
  241. }
  242. }
  243. }
  244. }
  245. // if (filtedSchedules.length > 0) {
  246. // schedules.push({
  247. // zone_name: scheduleInfo.zone_name,
  248. // scheduals: filtedSchedules
  249. // });
  250. // }
  251. }
  252. console.log(filtedSchedules)
  253. return this.processScheduals(filtedSchedules)
  254. }
  255. var zone_selected = this.zone_selected
  256. var timetype_selected = this.time_selected
  257. var assessment_before_dislysis_count = 0
  258. var prescription_count = 0
  259. if (zone_selected != 0 || timetype_selected != 0) {
  260. var zone_name =
  261. zone_selected == 0 ? '' : this.zone_options[zone_selected].text
  262. var schedules = []
  263. var filtedSchedules = []
  264. for (let o_i = 0; o_i < this.zone_scheduals.length; o_i++) {
  265. const scheduleInfo = this.zone_scheduals[o_i]
  266. var originSchedules = scheduleInfo.scheduals
  267. for (let s_i = 0; s_i < originSchedules.length; s_i++) {
  268. const schedule = originSchedules[s_i]
  269. if (
  270. zone_name.length == 0 ||
  271. (zone_name.length > 0 &&
  272. zone_name == schedule.device_number.zone.name)
  273. ) {
  274. if (
  275. timetype_selected == 0 ||
  276. schedule.schedule_type == timetype_selected
  277. ) {
  278. filtedSchedules.push(schedule)
  279. }
  280. }
  281. }
  282. // if (filtedSchedules.length > 0) {
  283. // schedules.push({
  284. // zone_name: scheduleInfo.zone_name,
  285. // scheduals: filtedSchedules
  286. // });
  287. // }
  288. }
  289. console.log(filtedSchedules)
  290. return this.processScheduals(filtedSchedules)
  291. if (this.select_index == 2) {
  292. var scheduals = []
  293. for (let index = 0; index < this.scheduals.length; index++) {
  294. const schedual = this.scheduals[index]
  295. if (
  296. schedual.assessment_before_dislysis == null ||
  297. schedual.assessment_before_dislysis.weight_before == 0
  298. ) {
  299. if (
  300. this.cur_zone_selected > 0 &&
  301. schedual.device_number.zone.id != this.cur_zone_selected
  302. ) {
  303. continue
  304. }
  305. if (
  306. timetype_selected > 0 &&
  307. schedual.schedule_type != timetype_selected
  308. ) {
  309. continue
  310. }
  311. scheduals.push(schedual)
  312. }
  313. }
  314. return this.processScheduals(scheduals)
  315. // return scheduals;
  316. } else if (this.select_index == 1) {
  317. var scheduals = []
  318. for (let index = 0; index < this.scheduals.length; index++) {
  319. const schedual = this.scheduals[index]
  320. if (
  321. schedual.prescription == null ||
  322. schedual.prescription.creater == 0
  323. ) {
  324. if (
  325. this.cur_zone_selected > 0 &&
  326. schedual.device_number.zone.id != this.cur_zone_selected
  327. ) {
  328. continue
  329. }
  330. if (
  331. timetype_selected > 0 &&
  332. schedual.schedule_type != timetype_selected
  333. ) {
  334. continue
  335. }
  336. scheduals.push(schedual)
  337. }
  338. }
  339. // return scheduals;
  340. return this.processScheduals(scheduals)
  341. } else {
  342. // return this.zone_scheduals;
  343. var scheduals = []
  344. for (let index = 0; index < this.scheduals.length; index++) {
  345. const schedual = this.scheduals[index]
  346. if (schedual.dialysis_order == null) {
  347. if (
  348. this.cur_zone_selected > 0 &&
  349. schedual.device_number.zone.id != this.cur_zone_selected
  350. ) {
  351. continue
  352. }
  353. if (
  354. timetype_selected > 0 &&
  355. schedual.schedule_type != timetype_selected
  356. ) {
  357. continue
  358. }
  359. scheduals.push(schedual)
  360. }
  361. }
  362. // return scheduals;
  363. return this.processScheduals(scheduals)
  364. }
  365. }
  366. if (this.select_index == 2) {
  367. var scheduals = []
  368. for (let index = 0; index < this.scheduals.length; index++) {
  369. const schedual = this.scheduals[index]
  370. if (
  371. schedual.assessment_before_dislysis == null ||
  372. schedual.assessment_before_dislysis.weight_before == 0
  373. ) {
  374. scheduals.push(schedual)
  375. }
  376. }
  377. return this.processScheduals(scheduals)
  378. // return scheduals;
  379. } else if (this.select_index == 1) {
  380. var scheduals = []
  381. for (let index = 0; index < this.scheduals.length; index++) {
  382. const schedual = this.scheduals[index]
  383. if (
  384. schedual.prescription == null ||
  385. schedual.prescription.creater == 0
  386. ) {
  387. scheduals.push(schedual)
  388. }
  389. }
  390. // return scheduals;
  391. return this.processScheduals(scheduals)
  392. } else {
  393. // return this.zone_scheduals;
  394. var scheduals = []
  395. for (let index = 0; index < this.scheduals.length; index++) {
  396. const schedual = this.scheduals[index]
  397. if (schedual.dialysis_order == null) {
  398. scheduals.push(schedual)
  399. }
  400. }
  401. // return scheduals;
  402. return this.processScheduals(scheduals)
  403. }
  404. }
  405. },
  406. created () {
  407. var area = getSelectedAreaDataConfigList()
  408. var time = getSelectedTimesDataConfigList()
  409. var type = getWaitTypeSelectedConfig()
  410. if (area != null) {
  411. this.zone_options_visible = false
  412. this.zone_selected = parseInt(area)
  413. this.select_index = -1
  414. }
  415. if (time != null) {
  416. this.time_selected = parseInt(time)
  417. this.select_index = -1
  418. this.time_options_visible = false
  419. }
  420. if (type != null) {
  421. this.select_index = parseInt(type)
  422. }
  423. var storedata = this.$store.getters.waitscheduals
  424. var scheduals = storedata.waitscheduals
  425. if (Object.keys(storedata).length > 0) {
  426. var totalCount = scheduals.length
  427. var prescription_count = 0
  428. var assessment_before_dislysis_count = 0
  429. for (let index = 0; index < scheduals.length; index++) {
  430. const schedual = scheduals[index]
  431. if (schedual.assessment_before_dislysis == null) {
  432. assessment_before_dislysis_count += 1
  433. }
  434. if (schedual.prescription == null) {
  435. prescription_count += 1
  436. }
  437. }
  438. this.menuList[2].count = assessment_before_dislysis_count
  439. this.menuList[1].count = prescription_count
  440. this.scheduals = scheduals
  441. this.zone_options = this.makeZones(scheduals)
  442. this.zone_scheduals = this.processScheduals(scheduals)
  443. } else {
  444. this.requestScheduals()
  445. }
  446. },
  447. mounted () {
  448. this.timer = window.setInterval(() => {
  449. setTimeout(this.requestScheduals(), 0)
  450. }, 120000)
  451. },
  452. beforeDestroy () {
  453. clearInterval(this.timer)
  454. this.timer = null
  455. this.$once('hook:beforeDestroy', () => {
  456. clearInterval(this.timer)
  457. })
  458. },
  459. methods: {
  460. processScheduals: function (scheduals) {
  461. var zoneMap = {}
  462. var schedualMap = {}
  463. var assessment_before_dislysis_count = 0
  464. var prescription_count = 0
  465. for (let index = 0; index < scheduals.length; index++) {
  466. const schedual = scheduals[index]
  467. if (schedualMap[schedual.device_number.zone.id] == null) {
  468. schedualMap[schedual.device_number.zone.id] = []
  469. }
  470. if (this.select_index == 1) {
  471. if (
  472. schedual.prescription == null ||
  473. schedual.prescription.creater == 0
  474. ) {
  475. schedualMap[schedual.device_number.zone.id].push(schedual)
  476. prescription_count++
  477. }
  478. } else if (this.select_index == 2) {
  479. if (
  480. schedual.assessment_before_dislysis == null ||
  481. schedual.assessment_before_dislysis.weight_before == 0
  482. ) {
  483. schedualMap[schedual.device_number.zone.id].push(schedual)
  484. assessment_before_dislysis_count++
  485. }
  486. } else {
  487. if (schedual.dialysis_order == null) {
  488. schedualMap[schedual.device_number.zone.id].push(schedual)
  489. }
  490. }
  491. if (zoneMap[schedual.device_number.zone.id] == null) {
  492. zoneMap[schedual.device_number.zone.id] = schedual.device_number.zone
  493. }
  494. }
  495. if (this.select_index == 1) {
  496. this.menuList[1].count = prescription_count
  497. }
  498. if (this.select_index == 2) {
  499. this.menuList[2].count = assessment_before_dislysis_count
  500. }
  501. var zones = []
  502. // zones.push({ value: 0, text: "全部分区" })
  503. for (var zoneId in zoneMap) {
  504. zones.push({ id: zoneMap[zoneId].id, name: zoneMap[zoneId].name })
  505. }
  506. zones = zones.sort(function (a, b) {
  507. return a.id > b.id
  508. })
  509. // this.zones = zones
  510. var zone_scheduals = []
  511. for (let index = 0; index < zones.length; index++) {
  512. const zone = zones[index]
  513. var scheduals = schedualMap[zone.id]
  514. zone_scheduals.push({
  515. zone_id: zone.id,
  516. zone_name: zone.name,
  517. scheduals: scheduals
  518. })
  519. }
  520. // this.zone_scheduals = zone_scheduals;
  521. return zone_scheduals
  522. },
  523. reloads: function () {
  524. this.reload()
  525. },
  526. handleAllChange: function (tabIndex) {
  527. this.select_index = tabIndex
  528. this.zone_selected = 0
  529. this.time_selected = 0
  530. },
  531. menuTabClick: function (tabIndex) {
  532. this.select_index = tabIndex
  533. this.zone_selected = 0
  534. this.time_selected = 0
  535. setSelectedAreaDataConfigList(this.zone_selected)
  536. setSelectedTimesDataConfigList(this.time_selected)
  537. setWaitTypeSelectedConfig(tabIndex)
  538. },
  539. handleZoneChange: function (index, zone) {
  540. this.zone_options_visible = false
  541. this.zone_selected = index
  542. this.cur_zone_selected = zone.value
  543. // this.select_index = -1;
  544. setSelectedAreaDataConfigList(index.toString())
  545. },
  546. handleTimeChange: function (index) {
  547. this.time_selected = index
  548. // this.select_index = -1;
  549. this.time_options_visible = false
  550. setSelectedTimesDataConfigList(index.toString())
  551. },
  552. requestScheduals () {
  553. // this.loading = true;
  554. var date = parseTime(Date.parse(new Date()), '{y}-{m}-{d}')
  555. getWaitingScheduals({ date: date })
  556. .then(rs => {
  557. var resp = rs.data
  558. if (resp.state == 1) {
  559. this.loading = false
  560. var scheduals = resp.data.scheduals
  561. this.$store.dispatch('SetWaitScheduals', {
  562. waitscheduals: scheduals
  563. })
  564. var totalCount = scheduals.length
  565. var prescription_count = 0
  566. var assessment_before_dislysis_count = 0
  567. for (let index = 0; index < scheduals.length; index++) {
  568. const schedual = scheduals[index]
  569. if (schedual.assessment_before_dislysis == null) {
  570. assessment_before_dislysis_count += 1
  571. }
  572. if (schedual.prescription == null) {
  573. prescription_count += 1
  574. }
  575. }
  576. this.menuList[2].count = assessment_before_dislysis_count
  577. this.menuList[1].count = prescription_count
  578. this.scheduals = scheduals
  579. this.zone_options = this.makeZones(scheduals)
  580. this.zone_scheduals = this.processScheduals(scheduals)
  581. } else {
  582. this.loading = false
  583. this.$toast({
  584. message: resp.msg
  585. })
  586. }
  587. })
  588. .catch(error => {
  589. this.loading = false
  590. // 超时之后在这里捕抓错误信息.
  591. if (error.response) {
  592. this.networkStates = false
  593. } else if (error.request) {
  594. this.networkStates = false
  595. // if(error.request.readyState == 4 && error.request.status == 0){
  596. // //我在这里重新请求
  597. // this.networkStates = false
  598. // }
  599. } else {
  600. this.networkStates = false
  601. }
  602. })
  603. },
  604. makeZones: function (scheduals) {
  605. var zoneMap = {}
  606. for (let index = 0; index < scheduals.length; index++) {
  607. const schedual = scheduals[index]
  608. if (zoneMap[schedual.device_number.zone.id] == null) {
  609. zoneMap[schedual.device_number.zone.id] = schedual.device_number.zone
  610. }
  611. }
  612. var zones = []
  613. zones.push({ value: 0, text: '全部分区' })
  614. for (var zoneId in zoneMap) {
  615. zones.push({ value: zoneMap[zoneId].id, text: zoneMap[zoneId].name })
  616. }
  617. // zones = zones.sort(function (a, b) {
  618. // return a.value > b.value
  619. // })
  620. return zones
  621. }
  622. }
  623. }
  624. </script>
  625. <style style="stylesheet/scss" lang="scss" scoped>
  626. .screening {
  627. border-bottom: 1px #e5e5e5 solid;
  628. position: fixed;
  629. top: 100px;
  630. @media only screen and (min-width: 768px) {
  631. top: 163px;
  632. }
  633. @media only screen and (min-width: 415px) and (max-width: 767px) {
  634. top: 134px;
  635. }
  636. right: 0;
  637. z-index: 66;
  638. left: 0;
  639. background: #fff;
  640. // @media only screen and (max-width: 812px) {
  641. // top: 50px !important;
  642. // }
  643. ul {
  644. @include display-flex;
  645. @include align-items-center;
  646. @include text-align;
  647. @include justify-content-between;
  648. width: 96%;
  649. margin: 0 auto;
  650. font-size: 0.45rem;
  651. color: $title-color;
  652. li {
  653. padding: 0.3rem 0;
  654. .iconfont {
  655. font-size: 0.45rem;
  656. margin-left: 0.1rem;
  657. }
  658. }
  659. .active {
  660. position: relative;
  661. &::before {
  662. position: absolute;
  663. bottom: 0;
  664. left: 0;
  665. width: 100%;
  666. height: 2px;
  667. background: $main-color;
  668. // border-bottom: 0.04rem $main-color solid;
  669. content: "";
  670. }
  671. }
  672. }
  673. }
  674. .stateBox {
  675. // padding: 0.5rem 0 0 0.6rem;
  676. .title {
  677. font-size: 0.34rem;
  678. color: #34495e;
  679. font-weight: 600;
  680. height: 1rem;
  681. line-height: 1rem;
  682. display: inline-block;
  683. }
  684. }
  685. .shadow {
  686. width: 100%;
  687. height: 100%;
  688. position: absolute;
  689. left: 0;
  690. top: 0;
  691. z-index: 998;
  692. background-color: #000;
  693. opacity: 0.6;
  694. display: none;
  695. }
  696. </style>