血透系统pad前端

WaitingArea.vue 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  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)"
  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. networkStates: true,
  132. scheduals: [],
  133. zone_options: [{ value: 0, text: "全部分区" }],
  134. zone_scheduals: [],
  135. time_options: [
  136. { value: 0, text: "全部班" },
  137. { value: 1, text: "上午" },
  138. { value: 2, text: "下午" },
  139. { value: 3, text: "晚上" }
  140. ],
  141. zone_options_visible: false,
  142. time_options_visible: false
  143. };
  144. },
  145. props: {
  146. search_keyword: {
  147. type: String
  148. }
  149. },
  150. computed: {
  151. filtedScheduals: function() {
  152. var search_keyword = this.search_keyword;
  153. if (this.search_keyword.length > 0) {
  154. var scheduals = [];
  155. for (let index = 0; index < this.scheduals.length; index++) {
  156. const schedual = this.scheduals[index];
  157. if (
  158. schedual.patient.name.indexOf(search_keyword) != -1 ||
  159. schedual.patient.dialysis_no.indexOf(search_keyword) != -1
  160. ) {
  161. scheduals.push(schedual);
  162. }
  163. }
  164. return this.processScheduals(scheduals);
  165. }
  166. //
  167. // if (this.zone_selected != 0) {
  168. // var zone_name = this.zone_options[this.zone_selected].text
  169. // for (let index = 0; index < this.zone_scheduals.length; index++) {
  170. // const zone_scheduals = this.zone_scheduals[index]
  171. // if (zone_scheduals.zone_name == zone_name) {
  172. // return [zone_scheduals]
  173. // }
  174. // }
  175. // }
  176. // if (this.time_selected != 0) {
  177. // var zone_name = this.zone_options[this.zone_selected].text
  178. // console.log(zone_name)
  179. // var schedules = [];
  180. // for (let o_i = 0; o_i < this.zone_scheduals.length; o_i++) {
  181. // const scheduleInfo = this.zone_scheduals[o_i];
  182. // var originSchedules = scheduleInfo.scheduals;
  183. // var filtedSchedules = [];
  184. // for (let s_i = 0; s_i < originSchedules.length; s_i++) {
  185. // const schedule = originSchedules[s_i];
  186. // if(this.zone_selected == 0){
  187. // if (this.time_selected == 0 || schedule.schedule_type == this.time_selected) {
  188. // filtedSchedules.push(schedule);
  189. // }
  190. //
  191. // }else{
  192. // console.log(zone_name)
  193. // console.log(schedule.device_number.zone.name)
  194. //
  195. // if ((zone_name.length > 0 && zone_name == schedule.device_number.zone.name)) {
  196. // if (this.time_selected == 0 || schedule.schedule_type == this.time_selected) {
  197. // filtedSchedules.push(schedule);
  198. // }
  199. // }
  200. // }
  201. // }
  202. // if (filtedSchedules.length > 0) {
  203. // schedules.push({
  204. // zone_name: scheduleInfo.zone_name,
  205. // scheduals: filtedSchedules
  206. // });
  207. // }
  208. // }
  209. // return schedules
  210. // }
  211. var zone_selected = this.zone_selected;
  212. var timetype_selected = this.time_selected;
  213. if (zone_selected != 0 || timetype_selected != 0) {
  214. var zone_name =
  215. zone_selected == 0 ? "" : this.zone_options[zone_selected].text;
  216. var schedules = [];
  217. for (let o_i = 0; o_i < this.zone_scheduals.length; o_i++) {
  218. const scheduleInfo = this.zone_scheduals[o_i];
  219. var originSchedules = scheduleInfo.scheduals;
  220. var filtedSchedules = [];
  221. for (let s_i = 0; s_i < originSchedules.length; s_i++) {
  222. const schedule = originSchedules[s_i];
  223. if (
  224. zone_name.length == 0 ||
  225. (zone_name.length > 0 &&
  226. zone_name == schedule.device_number.zone.name)
  227. ) {
  228. if (
  229. timetype_selected == 0 ||
  230. schedule.schedule_type == timetype_selected
  231. ) {
  232. filtedSchedules.push(schedule);
  233. }
  234. }
  235. }
  236. if (filtedSchedules.length > 0) {
  237. schedules.push({
  238. zone_name: scheduleInfo.zone_name,
  239. scheduals: filtedSchedules
  240. });
  241. }
  242. }
  243. return schedules;
  244. }
  245. if (this.select_index == 2) {
  246. var scheduals = [];
  247. for (let index = 0; index < this.scheduals.length; index++) {
  248. const schedual = this.scheduals[index];
  249. if (schedual.assessment_before_dislysis == null) {
  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 (
  260. schedual.assessment_before_dislysis == null &&
  261. schedual.prescription == null
  262. ) {
  263. scheduals.push(schedual);
  264. }
  265. }
  266. // return scheduals;
  267. return this.processScheduals(scheduals);
  268. } else {
  269. return this.zone_scheduals;
  270. }
  271. }
  272. },
  273. created() {
  274. var area = getSelectedAreaDataConfigList();
  275. var time = getSelectedTimesDataConfigList();
  276. var type = getWaitTypeSelectedConfig();
  277. if (area != null) {
  278. this.zone_options_visible = false;
  279. this.zone_selected = parseInt(area);
  280. this.select_index = -1;
  281. }
  282. if (time != null) {
  283. this.time_selected = parseInt(time);
  284. this.select_index = -1;
  285. this.time_options_visible = false;
  286. }
  287. if (type != null) {
  288. this.select_index = parseInt(type);
  289. }
  290. this.requestScheduals();
  291. },
  292. mounted() {
  293. this.timer = window.setInterval(() => {
  294. setTimeout(this.requestScheduals(), 0);
  295. }, 30000);
  296. },
  297. beforeDestroy() {
  298. clearInterval(this.timer);
  299. this.timer = null;
  300. // this.$once('hook:beforeDestroy', () => {
  301. // clearInterval(this.timer);
  302. // })
  303. },
  304. methods: {
  305. reloads: function() {
  306. this.reload();
  307. },
  308. handleAllChange: function(tabIndex) {
  309. this.select_index = tabIndex;
  310. this.zone_selected = 0;
  311. this.time_selected = 0;
  312. },
  313. menuTabClick: function(tabIndex) {
  314. this.select_index = tabIndex;
  315. this.zone_selected = 0;
  316. this.time_selected = 0;
  317. setSelectedAreaDataConfigList(this.zone_selected);
  318. setSelectedTimesDataConfigList(this.time_selected);
  319. setWaitTypeSelectedConfig(tabIndex);
  320. },
  321. handleZoneChange: function(index) {
  322. this.zone_options_visible = false;
  323. this.zone_selected = index;
  324. this.select_index = -1;
  325. setSelectedAreaDataConfigList(index.toString());
  326. },
  327. handleTimeChange: function(index) {
  328. this.time_selected = index;
  329. this.select_index = -1;
  330. this.time_options_visible = false;
  331. setSelectedTimesDataConfigList(index.toString());
  332. },
  333. requestScheduals() {
  334. this.loading = true;
  335. var date = parseTime(Date.parse(new Date()), "{y}-{m}-{d}");
  336. getWaitingScheduals({ date: date })
  337. .then(rs => {
  338. var resp = rs.data;
  339. if (resp.state == 1) {
  340. this.loading = false;
  341. var scheduals = resp.data.scheduals;
  342. var totalCount = scheduals.length;
  343. var prescription_count = 0;
  344. var assessment_before_dislysis_count = 0;
  345. for (let index = 0; index < scheduals.length; index++) {
  346. const schedual = scheduals[index];
  347. if (schedual.assessment_before_dislysis == null) {
  348. assessment_before_dislysis_count += 1;
  349. }
  350. if (schedual.prescription == null) {
  351. prescription_count += 1;
  352. }
  353. }
  354. this.menuList[2].count = assessment_before_dislysis_count;
  355. this.menuList[1].count = prescription_count;
  356. this.scheduals = scheduals;
  357. this.zone_options = this.makeZones(scheduals);
  358. this.zone_scheduals = this.processScheduals(scheduals);
  359. } else {
  360. this.loading = false;
  361. this.$toast({
  362. message: resp.msg
  363. });
  364. }
  365. })
  366. .catch(error => {
  367. this.loading = false;
  368. //超时之后在这里捕抓错误信息.
  369. if (error.response) {
  370. this.networkStates = false;
  371. } else if (error.request) {
  372. this.networkStates = false;
  373. // if(error.request.readyState == 4 && error.request.status == 0){
  374. // //我在这里重新请求
  375. // this.networkStates = false
  376. // }
  377. } else {
  378. this.networkStates = false;
  379. }
  380. });
  381. },
  382. makeZones: function(scheduals) {
  383. var zoneMap = {};
  384. for (let index = 0; index < scheduals.length; index++) {
  385. const schedual = scheduals[index];
  386. if (zoneMap[schedual.device_number.zone.id] == null) {
  387. zoneMap[schedual.device_number.zone.id] = schedual.device_number.zone;
  388. }
  389. }
  390. var zones = [];
  391. zones.push({ value: 0, text: "全部分区" });
  392. for (var zoneId in zoneMap) {
  393. zones.push({ value: zoneMap[zoneId].id, text: zoneMap[zoneId].name });
  394. }
  395. // zones = zones.sort(function (a, b) {
  396. // return a.value > b.value
  397. // })
  398. return zones;
  399. },
  400. processScheduals: function(scheduals) {
  401. var zoneMap = {};
  402. var schedualMap = {};
  403. for (let index = 0; index < scheduals.length; index++) {
  404. const schedual = scheduals[index];
  405. if (schedualMap[schedual.device_number.zone.id] == null) {
  406. schedualMap[schedual.device_number.zone.id] = [];
  407. }
  408. schedualMap[schedual.device_number.zone.id].push(schedual);
  409. if (zoneMap[schedual.device_number.zone.id] == null) {
  410. zoneMap[schedual.device_number.zone.id] = schedual.device_number.zone;
  411. }
  412. }
  413. var zones = [];
  414. // zones.push({ value: 0, text: "全部分区" })
  415. for (var zoneId in zoneMap) {
  416. zones.push({ id: zoneMap[zoneId].id, name: zoneMap[zoneId].name });
  417. }
  418. zones = zones.sort(function(a, b) {
  419. return a.id > b.id;
  420. });
  421. // this.zones = zones
  422. var zone_scheduals = [];
  423. for (let index = 0; index < zones.length; index++) {
  424. const zone = zones[index];
  425. var scheduals = schedualMap[zone.id];
  426. zone_scheduals.push({
  427. zone_id: zone.id,
  428. zone_name: zone.name,
  429. scheduals: scheduals
  430. });
  431. }
  432. // this.zone_scheduals = zone_scheduals;
  433. return zone_scheduals;
  434. }
  435. }
  436. };
  437. </script>
  438. <style style="stylesheet/scss" lang="scss" scoped>
  439. .screening {
  440. border-bottom: 1px #e5e5e5 solid;
  441. position: fixed;
  442. top: 63px;
  443. right: 0;
  444. z-index: 66;
  445. left: 1.58rem;
  446. background: #fff;
  447. @media only screen and (max-width: 812px) {
  448. top: 50px !important;
  449. }
  450. ul {
  451. @include display-flex;
  452. @include align-items-center;
  453. @include text-align;
  454. @include justify-content-between;
  455. width: 60%;
  456. margin: 0 auto;
  457. font-size: 0.32rem;
  458. color: $title-color;
  459. li {
  460. padding: 0.3rem 0;
  461. .iconfont {
  462. font-size: 0.32rem;
  463. margin-left: 0.1rem;
  464. }
  465. }
  466. .active {
  467. position: relative;
  468. &::before {
  469. position: absolute;
  470. bottom: 0;
  471. left: 0;
  472. width: 100%;
  473. height: 2px;
  474. background: $main-color;
  475. // border-bottom: 0.04rem $main-color solid;
  476. content: "";
  477. }
  478. }
  479. }
  480. }
  481. .stateBox {
  482. // padding: 0.5rem 0 0 0.6rem;
  483. .title {
  484. font-size: 0.34rem;
  485. color: #34495e;
  486. font-weight: 600;
  487. height: 1rem;
  488. line-height: 1rem;
  489. display: inline-block;
  490. }
  491. }
  492. .shadow {
  493. width: 100%;
  494. height: 100%;
  495. position: absolute;
  496. left: 0;
  497. top: 0;
  498. z-index: 998;
  499. background-color: #000;
  500. opacity: 0.6;
  501. display: none;
  502. }
  503. </style>