血透系统pad前端

WaitingArea.vue 7.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. <template>
  2. <div>
  3. <div class="screening">
  4. <ul>
  5. <popover placement="bottom" >
  6. <div slot="content" class="popover-demo-content">
  7. <ul>
  8. <li v-for="(option, index) in zone_options" :key="index" @click="handleZoneChange(index)" :class="zone_selected == index ? 'tick' : ''">{{ option.text }}</li>
  9. </ul>
  10. </div>
  11. <li>{{ zone_options[zone_selected].text }}<span class="iconfont">&#xe74a;</span></li>
  12. </popover>
  13. <li v-for="(item,i) in menuList" :class="select_index == i ? 'active' : ''" @click="menuTabClick(i)"
  14. :key="i">{{ item.label + (item.count > 0 ? '(' + item.count + ')' : '') }}</li>
  15. </ul>
  16. </div>
  17. <div class="stateBox ">
  18. <!-- <patient-box class="clearfix" :patients="filtedScheduals "></patient-box> -->
  19. <div v-for="(item, index) in filtedScheduals" :key="index">
  20. <h2 class="title" >{{item.zone_name}}</h2>
  21. <patient-box class="clearfix" :patients="item.scheduals"></patient-box>
  22. </div>
  23. <div class="NoData" v-show="filtedScheduals.length == 0"><img style="margin-top: 50px; margin-bottom: 50px" src="@/assets/login/data.jpg" alt=""></div>
  24. </div>
  25. </div>
  26. </template>
  27. <script>
  28. import PatientBox from "./PatientBox";
  29. import { getWaitingScheduals } from "@/api/dialysis";
  30. import { parseTime } from "@/utils";
  31. import { Popover } from "vux";
  32. export default {
  33. name: "WaitingArea",
  34. components: {
  35. PatientBox,
  36. Popover
  37. },
  38. data() {
  39. return {
  40. menuList: [
  41. { value: "2", label: "透前称量", count: 0 },
  42. { value: "3", label: "制定处方", count: 0 }
  43. ],
  44. select_index: -1,
  45. zone_selected: 0,
  46. scheduals: [],
  47. zone_options: [{ value: 0, text: "全部分区" }],
  48. zone_scheduals: []
  49. };
  50. },
  51. props: {
  52. search_keyword: {
  53. type: String
  54. }
  55. },
  56. computed: {
  57. filtedScheduals: function() {
  58. var search_keyword = this.search_keyword;
  59. if (this.search_keyword.length > 0) {
  60. var scheduals = [];
  61. for (let index = 0; index < this.scheduals.length; index++) {
  62. const schedual = this.scheduals[index];
  63. if (
  64. schedual.patient.name.indexOf(search_keyword) != -1 ||
  65. schedual.patient.dialysis_no.indexOf(search_keyword) != -1
  66. ) {
  67. scheduals.push(schedual);
  68. }
  69. }
  70. return this.processScheduals(scheduals);
  71. }
  72. if (this.zone_selected != 0) {
  73. var zone_name = this.zone_options[this.zone_selected].text;
  74. for (let index = 0; index < this.zone_scheduals.length; index++) {
  75. const zone_scheduals = this.zone_scheduals[index];
  76. if (zone_scheduals.zone_name == zone_name) {
  77. return [zone_scheduals];
  78. }
  79. }
  80. }
  81. if (this.select_index == 0) {
  82. // console.log("点击了第二个");
  83. var scheduals = [];
  84. for (let index = 0; index < this.scheduals.length; index++) {
  85. const schedual = this.scheduals[index];
  86. if (schedual.assessment_before_dislysis != null) {
  87. scheduals.push(schedual);
  88. }
  89. }
  90. return this.processScheduals(scheduals);
  91. // return scheduals;
  92. } else if (this.select_index == 1) {
  93. // console.log("点击了第三个");
  94. var scheduals = [];
  95. for (let index = 0; index < this.scheduals.length; index++) {
  96. const schedual = this.scheduals[index];
  97. if (
  98. schedual.assessment_before_dislysis == null &&
  99. schedual.prescription != null
  100. ) {
  101. scheduals.push(schedual);
  102. }
  103. }
  104. // return scheduals;
  105. return this.processScheduals(scheduals);
  106. } else {
  107. return this.zone_scheduals;
  108. }
  109. }
  110. },
  111. created() {
  112. this.requestScheduals();
  113. },
  114. methods: {
  115. menuTabClick: function(tabIndex) {
  116. this.select_index = tabIndex;
  117. this.zone_selected = 0;
  118. },
  119. handleZoneChange: function(index) {
  120. this.zone_selected = index;
  121. this.select_index = -1;
  122. },
  123. requestScheduals() {
  124. var date = parseTime(Date.parse(new Date()), "{y}-{m}-{d}");
  125. getWaitingScheduals({ date: date }).then(rs => {
  126. var resp = rs.data;
  127. // console.log(resp);
  128. if (resp.state == 1) {
  129. var scheduals = resp.data.scheduals;
  130. var totalCount = scheduals.length;
  131. var prescription_count = 0;
  132. var assessment_before_dislysis_count = 0;
  133. for (let index = 0; index < scheduals.length; index++) {
  134. const schedual = scheduals[index];
  135. if (schedual.assessment_before_dislysis != null) {
  136. assessment_before_dislysis_count += 1;
  137. } else if (schedual.prescription != null) {
  138. prescription_count += 1;
  139. }
  140. }
  141. this.menuList[0].count = assessment_before_dislysis_count;
  142. this.menuList[1].count = prescription_count;
  143. this.scheduals = scheduals;
  144. this.zone_options = this.makeZones(scheduals);
  145. this.zone_scheduals = this.processScheduals(scheduals);
  146. } else {
  147. this.$toast({
  148. message: resp.msg
  149. });
  150. }
  151. });
  152. },
  153. makeZones: function(scheduals) {
  154. var zoneMap = {};
  155. for (let index = 0; index < scheduals.length; index++) {
  156. const schedual = scheduals[index];
  157. if (zoneMap[schedual.device_zone.id] == null) {
  158. zoneMap[schedual.device_zone.id] = schedual.device_zone;
  159. }
  160. }
  161. var zones = [];
  162. zones.push({ value: 0, text: "全部分区" });
  163. for (var zoneId in zoneMap) {
  164. zones.push({ value: zoneMap[zoneId].id, text: zoneMap[zoneId].name });
  165. }
  166. zones = zones.sort(function(a, b) {
  167. return a.id > b.id;
  168. });
  169. return zones;
  170. },
  171. processScheduals: function(scheduals) {
  172. var zoneMap = {};
  173. var schedualMap = {};
  174. for (let index = 0; index < scheduals.length; index++) {
  175. const schedual = scheduals[index];
  176. if (schedualMap[schedual.device_zone.id] == null) {
  177. schedualMap[schedual.device_zone.id] = [];
  178. }
  179. schedualMap[schedual.device_zone.id].push(schedual);
  180. if (zoneMap[schedual.device_zone.id] == null) {
  181. zoneMap[schedual.device_zone.id] = schedual.device_zone;
  182. }
  183. }
  184. var zones = [];
  185. // zones.push({ value: 0, text: "全部分区" })
  186. for (var zoneId in zoneMap) {
  187. zones.push({ id: zoneMap[zoneId].id, name: zoneMap[zoneId].name });
  188. }
  189. zones = zones.sort(function(a, b) {
  190. return a.id > b.id;
  191. });
  192. // this.zones = zones
  193. var zone_scheduals = [];
  194. for (let index = 0; index < zones.length; index++) {
  195. const zone = zones[index];
  196. var scheduals = schedualMap[zone.id];
  197. zone_scheduals.push({
  198. zone_id: zone.id,
  199. zone_name: zone.name,
  200. scheduals: scheduals
  201. });
  202. }
  203. // this.zone_scheduals = zone_scheduals;
  204. return zone_scheduals;
  205. }
  206. }
  207. };
  208. </script>
  209. <style style="stylesheet/scss" lang="scss" scoped>
  210. .screening {
  211. border-bottom: 1px #e5e5e5 solid;
  212. ul {
  213. @include display-flex;
  214. @include align-items-center;
  215. @include text-align;
  216. @include justify-content-between;
  217. width: 60%;
  218. margin: 0 auto;
  219. font-size: 0.32rem;
  220. color:$title-color;
  221. li {
  222. padding: 0.3rem 0;
  223. .iconfont {
  224. font-size: 0.32rem;
  225. margin-left: 0.1rem;
  226. }
  227. }
  228. .active {
  229. position: relative;
  230. &::before {
  231. position: absolute;
  232. bottom: 0;
  233. left: 0;
  234. width: 100%;
  235. height: 2px;
  236. background: $main-color;
  237. // border-bottom: 0.04rem $main-color solid;
  238. content: "";
  239. }
  240. }
  241. }
  242. }
  243. .stateBox {
  244. padding: 0.5rem 0 0 0.6rem;
  245. .title {
  246. font-size: 0.34rem;
  247. color: #34495e;
  248. font-weight: 600;
  249. height: 0.9rem;
  250. line-height: 0.9rem;
  251. display: inline-block;
  252. }
  253. }
  254. </style>