血透系统pad前端

DialysisArea.vue 9.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  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
  9. v-for="(zone, index) in zones"
  10. :key="zone.value"
  11. @click="handleZoneChange(index)"
  12. :class="zone_selected == index ? 'tick' : ''"
  13. >{{zone.text}}</li>
  14. </ul>
  15. </div>
  16. <li>
  17. {{ zones.length <= 1 && zone_selected > 0 ? "全部分区" : zones[zone_selected].text }}
  18. <span
  19. class="iconfont"
  20. >&#xe74a;</span>
  21. </li>
  22. </popover>
  23. <popover placement="bottom">
  24. <div slot="content" class="popover-demo-content">
  25. <ul>
  26. <li
  27. v-for="schedualType in schedual_types"
  28. :key="schedualType.value"
  29. @click="handletimeType(schedualType.value)"
  30. :class="schedual_type_selected == schedualType.value ? 'tick' : ''"
  31. >{{schedualType.text}}</li>
  32. </ul>
  33. </div>
  34. <li>
  35. {{ schedual_types[schedual_type_selected].text}}
  36. <span class="iconfont">&#xe74a;</span>
  37. </li>
  38. </popover>
  39. <li @click="openPicker()">
  40. {{selected_date_str}}
  41. <span class="iconfont">&#xe74a;</span>
  42. </li>
  43. </ul>
  44. </div>
  45. <div class="stateBox">
  46. <div v-for="(item, index) in filtedScheduals" :key="index">
  47. <h2 class="title">{{item.zone_name}}</h2>
  48. <patient-box class="clearfix" :patients="item.scheduals"></patient-box>
  49. </div>
  50. <div class="NoData" v-show="filtedScheduals.length == 0">
  51. <img style="margin-top: 50px; margin-bottom: 50px" src="@/assets/login/data.jpg" alt />
  52. </div>
  53. </div>
  54. <mt-datetime-picker
  55. v-model="selected_date"
  56. ref="picker"
  57. type="date"
  58. year-format="{value} "
  59. month-format="{value} "
  60. date-format="{value} "
  61. @confirm="handleScheduleDateChange"
  62. ></mt-datetime-picker>
  63. </div>
  64. </template>
  65. <script>
  66. import PatientBox from "./PatientBox";
  67. import { Popover } from "vux";
  68. import { Datetime } from "vux";
  69. import { parseTime } from "@/utils/index";
  70. import { getDialysisScheduals } from "@/api/dialysis";
  71. export default {
  72. name: "DialysisArea",
  73. components: {
  74. PatientBox,
  75. Popover,
  76. Datetime
  77. },
  78. data() {
  79. return {
  80. selected_date: this.$store.getters.app.dialysis_area.schedule_date, //new Date(),
  81. schedual_types: [
  82. { value: 0, text: "全部班", select: true },
  83. { value: 1, text: "上午", select: false },
  84. { value: 2, text: "下午", select: false },
  85. { value: 3, text: "晚上", select: false }
  86. ],
  87. schedual_type_selected: this.$store.getters.app.dialysis_area
  88. .schedule_type_select_index,
  89. zone_selected: this.$store.getters.app.dialysis_area.zone_select_index,
  90. zones: [{ value: 0, text: "全部分区", select: true }],
  91. dialysis_scheduals: []
  92. };
  93. },
  94. props: {
  95. search_keyword: {
  96. type: String,
  97. default: ""
  98. }
  99. },
  100. computed: {
  101. selected_date_str: function() {
  102. return parseTime(this.selected_date, "{y}-{m}-{d}");
  103. },
  104. filtedScheduals: function() {
  105. if (this.dialysis_scheduals.length == 0) {
  106. return [];
  107. }
  108. var search_keyword = this.search_keyword;
  109. if (search_keyword.length > 0) {
  110. var schedules = [];
  111. for (let o_i = 0; o_i < this.dialysis_scheduals.length; o_i++) {
  112. const scheduleInfo = this.dialysis_scheduals[o_i];
  113. var originSchedules = scheduleInfo.scheduals;
  114. if (originSchedules.length == 0) {
  115. continue;
  116. }
  117. var filtedSchedules = [];
  118. for (let s_i = 0; s_i < originSchedules.length; s_i++) {
  119. const schedule = originSchedules[s_i];
  120. if (
  121. schedule.patient.name.indexOf(search_keyword) != -1 ||
  122. schedule.patient.dialysis_no.indexOf(search_keyword) != -1
  123. ) {
  124. filtedSchedules.push(schedule);
  125. break;
  126. }
  127. }
  128. if (filtedSchedules.length > 0) {
  129. schedules.push({
  130. zone_name: scheduleInfo.zone_name,
  131. scheduals: filtedSchedules
  132. });
  133. }
  134. }
  135. return schedules;
  136. }
  137. var zone_selected = this.zone_selected;
  138. var timetype_selected = this.schedual_type_selected;
  139. if (
  140. (zone_selected == 0 && timetype_selected == 0) ||
  141. this.zones.length <= 1
  142. ) {
  143. return this.dialysis_scheduals;
  144. }
  145. var zone_name = zone_selected == 0 ? "" : this.zones[zone_selected].text;
  146. var schedules = [];
  147. for (let o_i = 0; o_i < this.dialysis_scheduals.length; o_i++) {
  148. const scheduleInfo = this.dialysis_scheduals[o_i];
  149. var originSchedules = scheduleInfo.scheduals;
  150. var filtedSchedules = [];
  151. for (let s_i = 0; s_i < originSchedules.length; s_i++) {
  152. const schedule = originSchedules[s_i];
  153. if (
  154. zone_name.length == 0 ||
  155. (zone_name.length > 0 && zone_name == schedule.device_zone.name)
  156. ) {
  157. if (
  158. timetype_selected == 0 ||
  159. schedule.schedule_type == timetype_selected
  160. ) {
  161. filtedSchedules.push(schedule);
  162. }
  163. }
  164. }
  165. if (filtedSchedules.length > 0) {
  166. schedules.push({
  167. zone_name: scheduleInfo.zone_name,
  168. scheduals: filtedSchedules
  169. });
  170. }
  171. }
  172. return schedules;
  173. }
  174. },
  175. created() {
  176. this.requestDialysisScheduals();
  177. },
  178. methods: {
  179. handletimeType: function(index) {
  180. this.schedual_type_selected = index;
  181. this.$emit("clear_search_keyword");
  182. this.$store.dispatch("SaveDialysisAreaSelectIndexs", {
  183. zone: this.zone_selected,
  184. schedule_type: this.schedual_type_selected,
  185. schedule_date: this.selected_date
  186. });
  187. },
  188. handleZoneChange: function(index) {
  189. this.zone_selected = index;
  190. this.$emit("clear_search_keyword");
  191. this.$store.dispatch("SaveDialysisAreaSelectIndexs", {
  192. zone: this.zone_selected,
  193. schedule_type: this.schedual_type_selected,
  194. schedule_date: this.selected_date
  195. });
  196. },
  197. handleScheduleDateChange: function(date) {
  198. this.zone_selected = 0;
  199. this.schedual_type_selected = 0;
  200. this.$emit("clear_search_keyword");
  201. this.$store.dispatch("SaveDialysisAreaSelectIndexs", {
  202. zone: this.zone_selected,
  203. schedule_type: this.schedual_type_selected,
  204. schedule_date: this.selected_date
  205. });
  206. this.requestDialysisScheduals();
  207. },
  208. requestDialysisScheduals() {
  209. var type = 0;
  210. getDialysisScheduals({ type: type, date: this.selected_date_str })
  211. .then(rs => {
  212. var resp = rs.data;
  213. if (resp.state == 1) {
  214. // console.log(resp.data)
  215. var scheduals = resp.data.scheduals;
  216. var zoneMap = {};
  217. var schedualMap = {};
  218. for (let index = 0; index < scheduals.length; index++) {
  219. const schedual = scheduals[index];
  220. if (schedual.dialysis_order == null) {
  221. continue;
  222. }
  223. if (schedualMap[schedual.device_zone.name] == null) {
  224. schedualMap[schedual.device_zone.name] = [];
  225. }
  226. schedualMap[schedual.device_zone.name].push(schedual);
  227. if (zoneMap[schedual.device_zone.name] == null) {
  228. zoneMap[schedual.device_zone.name] = schedual.device_zone;
  229. }
  230. }
  231. var zones = [];
  232. zones.push({ value: 0, text: "全部分区" });
  233. for (var zoneName in zoneMap) {
  234. zones.push({ value: zoneMap[zoneName].id, text: zoneName });
  235. }
  236. zones = zones.sort(function(a, b) {
  237. return a.value > b.value;
  238. });
  239. this.zones = zones;
  240. var dialysis_scheduals = [];
  241. for (let index = 0; index < zones.length; index++) {
  242. const zone = zones[index];
  243. var scheduals = schedualMap[zone.text];
  244. if (scheduals == null) {
  245. continue;
  246. }
  247. dialysis_scheduals.push({
  248. zone_name: zone.text,
  249. scheduals: scheduals
  250. });
  251. }
  252. this.dialysis_scheduals = dialysis_scheduals;
  253. } else {
  254. this.$toast({
  255. message: resp.msg
  256. });
  257. }
  258. })
  259. .catch(v => {});
  260. },
  261. openPicker() {
  262. this.$refs.picker.open();
  263. }
  264. }
  265. };
  266. </script>
  267. <style style="stylesheet/scss" lang="scss" scoped>
  268. .screening {
  269. border-bottom: 1px #e5e5e5 solid;
  270. ul {
  271. @include display-flex;
  272. @include align-items-center;
  273. @include text-align;
  274. @include justify-content-between;
  275. width: 60%;
  276. margin: 0 auto;
  277. li {
  278. font-size: 0.32rem;
  279. padding: 0.3rem 0;
  280. cursor: pointer;
  281. .iconfont {
  282. font-size: 0.32rem;
  283. color: #a8b3ba;
  284. margin-left: 0.1rem;
  285. }
  286. }
  287. }
  288. }
  289. .stateBox {
  290. padding: 0.26rem 0 0 0.6rem;
  291. background: #fff;
  292. .title {
  293. font-size: 0.34rem;
  294. font-weight: 600;
  295. color: $title-color;
  296. height: 0.8rem;
  297. line-height: 0.8rem;
  298. display: inline-block;
  299. }
  300. }
  301. </style>
  302. <style lang="scss">
  303. .picker-toolbar {
  304. height: 60px;
  305. @media only screen and (max-width: 812px) {
  306. height: 30px !important;
  307. }
  308. }
  309. .mint-datetime-action {
  310. line-height: 60px;
  311. font-size: 0.34rem;
  312. @media only screen and (max-width: 812px) {
  313. line-height: 30px !important;
  314. }
  315. }
  316. </style>