血透系统pad前端

WaitingArea.vue 19KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  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. >重新加载
  93. </van-button>
  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. // }
  177. // if (this.time_selected != 0) {
  178. // var zone_name = this.zone_options[this.zone_selected].text
  179. // console.log(zone_name)
  180. // var schedules = [];
  181. // for (let o_i = 0; o_i < this.zone_scheduals.length; o_i++) {
  182. // const scheduleInfo = this.zone_scheduals[o_i];
  183. // var originSchedules = scheduleInfo.scheduals;
  184. // var filtedSchedules = [];
  185. // for (let s_i = 0; s_i < originSchedules.length; s_i++) {
  186. // const schedule = originSchedules[s_i];
  187. // if(this.zone_selected == 0){
  188. // if (this.time_selected == 0 || schedule.schedule_type == this.time_selected) {
  189. // filtedSchedules.push(schedule);
  190. // }
  191. //
  192. // }else{
  193. // console.log(zone_name)
  194. // console.log(schedule.device_number.zone.name)
  195. //
  196. // if ((zone_name.length > 0 && zone_name == schedule.device_number.zone.name)) {
  197. // if (this.time_selected == 0 || schedule.schedule_type == this.time_selected) {
  198. // filtedSchedules.push(schedule);
  199. // }
  200. // }
  201. // }
  202. // }
  203. // if (filtedSchedules.length > 0) {
  204. // schedules.push({
  205. // zone_name: scheduleInfo.zone_name,
  206. // scheduals: filtedSchedules
  207. // });
  208. // }
  209. // }
  210. // return schedules
  211. // }
  212. var zone_selected = this.zone_selected;
  213. var timetype_selected = this.time_selected;
  214. var assessment_before_dislysis_count = 0;
  215. var prescription_count = 0;
  216. if (zone_selected != 0 || timetype_selected != 0) {
  217. // var zone_name = zone_selected == 0 ? "" : this.zone_options[zone_selected].text;
  218. // var schedules = [];
  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. // var filtedSchedules = [];
  223. // for (let s_i = 0; s_i < originSchedules.length; s_i++) {
  224. // const schedule = originSchedules[s_i];
  225. // if ( zone_name.length == 0 || (zone_name.length > 0 && zone_name == schedule.device_number.zone.name)) {
  226. // if ( timetype_selected == 0 || schedule.schedule_type == timetype_selected ) {
  227. // filtedSchedules.push(schedule);
  228. // }
  229. // }
  230. // }
  231. // if (filtedSchedules.length > 0) {
  232. // schedules.push({
  233. // zone_name: scheduleInfo.zone_name,
  234. // scheduals: filtedSchedules
  235. // });
  236. // }
  237. // }
  238. // return schedules;
  239. if (this.select_index == 2) {
  240. var scheduals = [];
  241. for (let index = 0; index < this.scheduals.length; index++) {
  242. const schedual = this.scheduals[index];
  243. if (schedual.assessment_before_dislysis == null || schedual.assessment_before_dislysis.weight_before == 0) {
  244. if(this.cur_zone_selected > 0 && schedual.device_number.zone.id != this.cur_zone_selected) {
  245. continue
  246. }
  247. if(timetype_selected > 0 && schedual.schedule_type != timetype_selected) {
  248. continue
  249. }
  250. scheduals.push(schedual);
  251. }
  252. }
  253. return this.processScheduals(scheduals);
  254. // return scheduals;
  255. } else if (this.select_index == 1) {
  256. var scheduals = [];
  257. for (let index = 0; index < this.scheduals.length; index++) {
  258. const schedual = this.scheduals[index];
  259. if (schedual.prescription == null || schedual.prescription.prescription_doctor == 0) {
  260. if(this.cur_zone_selected > 0 && schedual.device_number.zone.id != this.cur_zone_selected) {
  261. continue
  262. }
  263. if(timetype_selected > 0 && schedual.schedule_type != timetype_selected) {
  264. continue
  265. }
  266. scheduals.push(schedual);
  267. }
  268. }
  269. // return scheduals;
  270. return this.processScheduals(scheduals);
  271. } else {
  272. // return this.zone_scheduals;
  273. var scheduals = [];
  274. for (let index = 0; index < this.scheduals.length; index++) {
  275. const schedual = this.scheduals[index];
  276. if (schedual.dialysis_order == null) {
  277. if(this.cur_zone_selected > 0 && schedual.device_number.zone.id != this.cur_zone_selected) {
  278. continue
  279. }
  280. if(timetype_selected > 0 && schedual.schedule_type != timetype_selected) {
  281. continue
  282. }
  283. scheduals.push(schedual);
  284. }
  285. }
  286. // return scheduals;
  287. return this.processScheduals(scheduals);
  288. }
  289. }
  290. if (this.select_index == 2) {
  291. var scheduals = [];
  292. for (let index = 0; index < this.scheduals.length; index++) {
  293. const schedual = this.scheduals[index];
  294. if (schedual.assessment_before_dislysis == null || schedual.assessment_before_dislysis.weight_before == 0) {
  295. scheduals.push(schedual);
  296. }
  297. }
  298. return this.processScheduals(scheduals);
  299. // return scheduals;
  300. } else if (this.select_index == 1) {
  301. var scheduals = [];
  302. for (let index = 0; index < this.scheduals.length; index++) {
  303. const schedual = this.scheduals[index];
  304. if (schedual.prescription == null || schedual.prescription.prescription_doctor == 0) {
  305. scheduals.push(schedual);
  306. }
  307. }
  308. // return scheduals;
  309. return this.processScheduals(scheduals);
  310. } else {
  311. // return this.zone_scheduals;
  312. var scheduals = [];
  313. for (let index = 0; index < this.scheduals.length; index++) {
  314. const schedual = this.scheduals[index];
  315. if (schedual.dialysis_order == null) {
  316. scheduals.push(schedual);
  317. }
  318. }
  319. // return scheduals;
  320. return this.processScheduals(scheduals);
  321. }
  322. }
  323. },
  324. created() {
  325. var area = getSelectedAreaDataConfigList();
  326. var time = getSelectedTimesDataConfigList();
  327. var type = getWaitTypeSelectedConfig();
  328. if (area != null) {
  329. this.zone_options_visible = false;
  330. this.zone_selected = parseInt(area);
  331. this.select_index = -1;
  332. }
  333. if (time != null) {
  334. this.time_selected = parseInt(time);
  335. this.select_index = -1;
  336. this.time_options_visible = false;
  337. }
  338. if (type != null) {
  339. this.select_index = parseInt(type);
  340. }
  341. this.requestScheduals();
  342. },
  343. mounted() {
  344. this.timer = window.setInterval(() => {
  345. setTimeout(this.requestScheduals(), 0);
  346. }, 30000);
  347. },
  348. beforeDestroy() {
  349. clearInterval(this.timer);
  350. this.timer = null;
  351. this.$once('hook:beforeDestroy', () => {
  352. clearInterval(this.timer);
  353. })
  354. },
  355. methods: {
  356. processScheduals: function(scheduals) {
  357. var zoneMap = {};
  358. var schedualMap = {};
  359. var assessment_before_dislysis_count = 0;
  360. var prescription_count = 0;
  361. for (let index = 0; index < scheduals.length; index++) {
  362. const schedual = scheduals[index];
  363. if (schedualMap[schedual.device_number.zone.id] == null) {
  364. schedualMap[schedual.device_number.zone.id] = [];
  365. }
  366. if (this.select_index == 1) {
  367. if(schedual.prescription == null || schedual.prescription.prescription_doctor == 0){
  368. schedualMap[schedual.device_number.zone.id].push(schedual);
  369. prescription_count++
  370. }
  371. } else if (this.select_index == 2){
  372. if(schedual.assessment_before_dislysis == null || schedual.assessment_before_dislysis.weight_before == 0){
  373. schedualMap[schedual.device_number.zone.id].push(schedual);
  374. assessment_before_dislysis_count++
  375. }
  376. } else {
  377. if(schedual.dialysis_order == null){
  378. schedualMap[schedual.device_number.zone.id].push(schedual);
  379. }
  380. }
  381. if (zoneMap[schedual.device_number.zone.id] == null) {
  382. zoneMap[schedual.device_number.zone.id] = schedual.device_number.zone;
  383. }
  384. }
  385. if (this.select_index == 1) {
  386. this.menuList[1].count = prescription_count;
  387. }
  388. if (this.select_index == 2) {
  389. this.menuList[2].count = assessment_before_dislysis_count;
  390. }
  391. var zones = [];
  392. // zones.push({ value: 0, text: "全部分区" })
  393. for (var zoneId in zoneMap) {
  394. zones.push({ id: zoneMap[zoneId].id, name: zoneMap[zoneId].name });
  395. }
  396. zones = zones.sort(function(a, b) {
  397. return a.id > b.id;
  398. });
  399. // this.zones = zones
  400. var zone_scheduals = [];
  401. for (let index = 0; index < zones.length; index++) {
  402. const zone = zones[index];
  403. var scheduals = schedualMap[zone.id];
  404. zone_scheduals.push({
  405. zone_id: zone.id,
  406. zone_name: zone.name,
  407. scheduals: scheduals
  408. });
  409. }
  410. // this.zone_scheduals = zone_scheduals;
  411. return zone_scheduals;
  412. },
  413. reloads: function() {
  414. this.reload();
  415. },
  416. handleAllChange: function(tabIndex) {
  417. this.select_index = tabIndex;
  418. this.zone_selected = 0;
  419. this.time_selected = 0;
  420. },
  421. menuTabClick: function(tabIndex) {
  422. this.select_index = tabIndex;
  423. this.zone_selected = 0;
  424. this.time_selected = 0;
  425. setSelectedAreaDataConfigList(this.zone_selected);
  426. setSelectedTimesDataConfigList(this.time_selected);
  427. setWaitTypeSelectedConfig(tabIndex);
  428. },
  429. handleZoneChange: function(index,zone) {
  430. this.zone_options_visible = false;
  431. this.zone_selected = index;
  432. this.cur_zone_selected = zone.value
  433. // this.select_index = -1;
  434. setSelectedAreaDataConfigList(index.toString());
  435. },
  436. handleTimeChange: function(index) {
  437. this.time_selected = index;
  438. // this.select_index = -1;
  439. this.time_options_visible = false;
  440. setSelectedTimesDataConfigList(index.toString());
  441. },
  442. requestScheduals() {
  443. // this.loading = true;
  444. var date = parseTime(Date.parse(new Date()), "{y}-{m}-{d}");
  445. getWaitingScheduals({ date: date })
  446. .then(rs => {
  447. var resp = rs.data;
  448. if (resp.state == 1) {
  449. this.loading = false;
  450. var scheduals = resp.data.scheduals;
  451. var totalCount = scheduals.length;
  452. var prescription_count = 0;
  453. var assessment_before_dislysis_count = 0;
  454. for (let index = 0; index < scheduals.length; index++) {
  455. const schedual = scheduals[index];
  456. if (schedual.assessment_before_dislysis == null) {
  457. assessment_before_dislysis_count += 1;
  458. }
  459. if (schedual.prescription == null) {
  460. prescription_count += 1;
  461. }
  462. }
  463. this.menuList[2].count = assessment_before_dislysis_count;
  464. this.menuList[1].count = prescription_count;
  465. this.scheduals = scheduals;
  466. this.zone_options = this.makeZones(scheduals);
  467. this.zone_scheduals = this.processScheduals(scheduals);
  468. } else {
  469. this.loading = false;
  470. this.$toast({
  471. message: resp.msg
  472. });
  473. }
  474. })
  475. .catch(error => {
  476. this.loading = false;
  477. //超时之后在这里捕抓错误信息.
  478. if (error.response) {
  479. this.networkStates = false;
  480. } else if (error.request) {
  481. this.networkStates = false;
  482. // if(error.request.readyState == 4 && error.request.status == 0){
  483. // //我在这里重新请求
  484. // this.networkStates = false
  485. // }
  486. } else {
  487. this.networkStates = false;
  488. }
  489. });
  490. },
  491. makeZones: function(scheduals) {
  492. var zoneMap = {};
  493. for (let index = 0; index < scheduals.length; index++) {
  494. const schedual = scheduals[index];
  495. if (zoneMap[schedual.device_number.zone.id] == null) {
  496. zoneMap[schedual.device_number.zone.id] = schedual.device_number.zone;
  497. }
  498. }
  499. var zones = [];
  500. zones.push({ value: 0, text: "全部分区" });
  501. for (var zoneId in zoneMap) {
  502. zones.push({ value: zoneMap[zoneId].id, text: zoneMap[zoneId].name });
  503. }
  504. // zones = zones.sort(function (a, b) {
  505. // return a.value > b.value
  506. // })
  507. return zones;
  508. }
  509. }
  510. };
  511. </script>
  512. <style style="stylesheet/scss" lang="scss" scoped>
  513. .screening {
  514. border-bottom: 1px #e5e5e5 solid;
  515. position: fixed;
  516. top: 63px;
  517. right: 0;
  518. z-index: 66;
  519. left: 1.58rem;
  520. background: #fff;
  521. @media only screen and (max-width: 812px) {
  522. top: 50px !important;
  523. }
  524. ul {
  525. @include display-flex;
  526. @include align-items-center;
  527. @include text-align;
  528. @include justify-content-between;
  529. width: 60%;
  530. margin: 0 auto;
  531. font-size: 0.32rem;
  532. color: $title-color;
  533. li {
  534. padding: 0.3rem 0;
  535. .iconfont {
  536. font-size: 0.32rem;
  537. margin-left: 0.1rem;
  538. }
  539. }
  540. .active {
  541. position: relative;
  542. &::before {
  543. position: absolute;
  544. bottom: 0;
  545. left: 0;
  546. width: 100%;
  547. height: 2px;
  548. background: $main-color;
  549. // border-bottom: 0.04rem $main-color solid;
  550. content: "";
  551. }
  552. }
  553. }
  554. }
  555. .stateBox {
  556. // padding: 0.5rem 0 0 0.6rem;
  557. .title {
  558. font-size: 0.34rem;
  559. color: #34495e;
  560. font-weight: 600;
  561. height: 1rem;
  562. line-height: 1rem;
  563. display: inline-block;
  564. }
  565. }
  566. .shadow {
  567. width: 100%;
  568. height: 100%;
  569. position: absolute;
  570. left: 0;
  571. top: 0;
  572. z-index: 998;
  573. background-color: #000;
  574. opacity: 0.6;
  575. display: none;
  576. }
  577. </style>