schedualPatient.vue 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. <template>
  2. <div class="main-contain">
  3. <div class="position">
  4. <bread-crumb :crumbs='crumbs'></bread-crumb>
  5. </div>
  6. <div class="app-container">
  7. <div class="cell clearfix">
  8. <!-- <label class="title"><span class="name">病人查询</span> : </label> -->
  9. <el-input size="small" style="width: 280px;" v-model.trim="search_input" class="filter-item"/>
  10. <el-button size="small" class="filter-item" type="primary" icon="el-icon-search" @click="searchAction">搜索</el-button>
  11. </div>
  12. <div class="cell clearfix">
  13. <label class="title"><span class="name">日期查询</span> : </label>
  14. <el-date-picker v-model="selected_date" prefix-icon="el-icon-date" @change="handleScheduleDateChange" :editable="false" :clearable="false" style="width: 196px;" type="date" placeholder="选择日期时间" align="right" ></el-date-picker>
  15. </div>
  16. <div class="cell clearfix">
  17. <label class="title"><span class="name">排班班次</span> : </label>
  18. <div class="time ">
  19. <ul class="">
  20. <li v-for="option in schedule_type_options" :key="option.value" @click="handletimeType(option.value)" :class="schedule_type_selected == option.value ? 'active' : ''" >{{option.text}}
  21. </li>
  22. </ul>
  23. </div>
  24. </div>
  25. <div class="cell clearfix">
  26. <label class="title"><span class="name">分区</span> : </label>
  27. <div class="time ">
  28. <ul class="">
  29. <li v-for="option in zone_options" :key="option.id" :class="option.id == zone_selected ? 'active' : ''" @click='handleZoneChange(option.id)'>{{ option.text }}
  30. </li>
  31. </ul>
  32. </div>
  33. </div>
  34. <div class="PatientArea">
  35. <div v-for="zone_schedule in filtedSchedules" :key="zone_schedule.zone_id" class="list clearfix">
  36. <h3 class="title">{{zone_schedule.zone_name}}</h3>
  37. <patient-box :schedules="zone_schedule.schedules"></patient-box>
  38. </div>
  39. <div class="NoData" v-show="filtedSchedules.length == 0">
  40. <img src="@/assets/img/data.jpg" alt="">
  41. </div>
  42. </div>
  43. </div>
  44. </div>
  45. </template>
  46. <script>
  47. import PatientBox from './PatientBox'
  48. import { getDialysisRecordInitData, getDialysisSchedules } from '@/api/dialysis_record'
  49. import { parseTime } from '@/utils'
  50. import BreadCrumb from '@/xt_pages/components/bread-crumb'
  51. export default {
  52. name: 'Patient',
  53. components: {
  54. PatientBox,
  55. BreadCrumb
  56. },
  57. data() {
  58. return {
  59. crumbs: [
  60. { path: false, name: '透析管理' },
  61. { path: 'dialysis/dialysisrecord', name: '透析记录' }
  62. ],
  63. selected_date: new Date(), // this.$store.getters.app.dialysis_area.schedule_date,
  64. schedule_type_selected: 0, // this.$store.getters.app.dialysis_area.schedule_type_select_index,
  65. schedule_type_options: [
  66. { value: 0, text: '全部' },
  67. { value: 1, text: '上午' },
  68. { value: 2, text: '下午' },
  69. { value: 3, text: '晚上' }
  70. ],
  71. zone_selected: 0, // this.$store.getters.app.dialysis_area.zone_select_index,
  72. zone_options: [
  73. { id: 0, text: '全部' }
  74. ],
  75. zone_schedules: [],
  76. date_picker_options: {
  77. shortcuts: [
  78. {
  79. text: '今天',
  80. onClick(picker) {
  81. picker.$emit('pick', new Date())
  82. }
  83. },
  84. {
  85. text: '昨天',
  86. onClick(picker) {
  87. const date = new Date()
  88. date.setTime(date.getTime() - 3600 * 1000 * 24)
  89. picker.$emit('pick', date)
  90. }
  91. },
  92. {
  93. text: '一周前',
  94. onClick(picker) {
  95. const date = new Date()
  96. date.setTime(date.getTime() - 3600 * 1000 * 24 * 7)
  97. picker.$emit('pick', date)
  98. }
  99. }
  100. ]
  101. },
  102. // search_input 和 search_keyword,使输入关键字时不会经常刷新 filtedSchedules
  103. search_keyword: '', // 确定用于搜索的关键字
  104. search_input: '' // 输入中的关键字
  105. }
  106. },
  107. computed: {
  108. filtedSchedules: function() {
  109. var search_keyword = this.search_keyword
  110. if (search_keyword.length > 0) {
  111. var schedules = []
  112. for (let o_i = 0; o_i < this.zone_schedules.length; o_i++) {
  113. const scheduleInfo = this.zone_schedules[o_i]
  114. var originSchedules = scheduleInfo.schedules
  115. if (originSchedules.length == 0) {
  116. continue
  117. }
  118. var filtedSchedules = []
  119. for (let s_i = 0; s_i < originSchedules.length; s_i++) {
  120. const schedule = originSchedules[s_i]
  121. if (schedule.patient.name.indexOf(search_keyword) != -1) {
  122. filtedSchedules.push(schedule)
  123. // break
  124. }
  125. }
  126. if (filtedSchedules.length > 0) {
  127. schedules.push({ zone_id: scheduleInfo.zone_id, zone_name: scheduleInfo.zone_name, schedules: filtedSchedules })
  128. }
  129. }
  130. return schedules
  131. }
  132. var zone_selected = this.zone_selected
  133. var timetype_selected = this.schedule_type_selected
  134. if ((zone_selected == 0 && timetype_selected == 0) || this.zone_options.length <= 1) {
  135. var schedules = []
  136. for (let index = 0; index < this.zone_schedules.length; index++) {
  137. const scheduleInfo = this.zone_schedules[index]
  138. if (scheduleInfo.schedules.length != 0) {
  139. schedules.push(scheduleInfo)
  140. }
  141. }
  142. return schedules
  143. }
  144. var schedules = []
  145. for (let o_i = 0; o_i < this.zone_schedules.length; o_i++) {
  146. const scheduleInfo = this.zone_schedules[o_i]
  147. if (zone_selected == scheduleInfo.zone_id && timetype_selected == 0) {
  148. if (scheduleInfo.schedules.length == 0) {
  149. return []
  150. } else {
  151. return [scheduleInfo]
  152. }
  153. }
  154. var originSchedules = scheduleInfo.schedules
  155. if (originSchedules.length == 0) {
  156. continue
  157. }
  158. var filtedSchedules = []
  159. for (let s_i = 0; s_i < originSchedules.length; s_i++) {
  160. const schedule = originSchedules[s_i]
  161. if (zone_selected != 0) {
  162. if (zone_selected == schedule.device_number.zone.id) {
  163. if (timetype_selected == 0 || schedule.schedule_type == timetype_selected) {
  164. filtedSchedules.push(schedule)
  165. }
  166. }
  167. } else {
  168. if (timetype_selected == 0 || schedule.schedule_type == timetype_selected) {
  169. filtedSchedules.push(schedule)
  170. }
  171. }
  172. }
  173. if (filtedSchedules.length > 0) {
  174. schedules.push({ zone_id: scheduleInfo.zone_id, zone_name: scheduleInfo.zone_name, schedules: filtedSchedules })
  175. }
  176. }
  177. return schedules
  178. }
  179. },
  180. created() {
  181. var schedule_type_selected = this.$store.getters.schedule_type_selected
  182. var zone_selected = this.$store.getters.zone_selected
  183. if (schedule_type_selected) {
  184. this.schedule_type_selected = schedule_type_selected.schedule_type_selected
  185. }
  186. if (zone_selected) {
  187. this.zone_selected = zone_selected.zone_selected
  188. }
  189. this.getInitData()
  190. },
  191. methods: {
  192. handletimeType: function(index) {
  193. this.schedule_type_selected = index
  194. this.$store.dispatch('SetScheduleTypeSelected', { schedule_type_selected: index })
  195. this.search_keyword = this.search_input = ''
  196. // this.$store.dispatch("SaveDialysisAreaSelectIndexs", {
  197. // zone: this.zone_selected,
  198. // schedule_type: this.schedule_type_selected,
  199. // schedule_date: this.selected_date,
  200. // })
  201. },
  202. handleZoneChange: function(index) {
  203. this.zone_selected = index
  204. this.$store.dispatch('SetZoneSelected', { zone_selected: index })
  205. this.search_keyword = this.search_input = ''
  206. // this.$store.dispatch("SaveDialysisAreaSelectIndexs", {
  207. // zone: this.zone_selected,
  208. // schedule_type: this.schedule_type_selected,
  209. // schedule_date: this.selected_date,
  210. // })
  211. },
  212. handleScheduleDateChange: function() {
  213. this.zone_selected = 0
  214. this.schedule_type_selected = 0
  215. this.search_keyword = this.search_input = ''
  216. // this.$store.dispatch("SaveDialysisAreaSelectIndexs", {
  217. // zone: this.zone_selected,
  218. // schedule_type: this.schedule_type_selected,
  219. // schedule_date: this.selected_date,
  220. // })
  221. this.requestDialysisSchedules()
  222. },
  223. searchAction: function() {
  224. this.search_keyword = this.search_input
  225. this.schedule_type_selected = 0
  226. this.zone_selected = 0
  227. },
  228. getInitData: function() {
  229. getDialysisRecordInitData().then(rs => {
  230. var resp = rs.data
  231. if (resp.state == 1) {
  232. var zones = resp.data.zones
  233. var schedules = resp.data.schedules
  234. var zone_options = [{ id: 0, text: '全部' }]
  235. for (let z_i = 0; z_i < zones.length; z_i++) {
  236. const zone = zones[z_i]
  237. zone_options.push({ id: zone.id, text: zone.name })
  238. }
  239. this.zone_options = zone_options
  240. this.zone_schedules = this.processedDialysisSchedules(schedules, this.zone_options)
  241. } else {
  242. this.$message.error(resp.msg)
  243. }
  244. })
  245. },
  246. requestDialysisSchedules: function() {
  247. var ymd = parseTime(this.selected_date, '{y}-{m}-{d}')
  248. getDialysisSchedules(ymd).then(rs => {
  249. var resp = rs.data
  250. if (resp.state == 1) {
  251. var schedules = resp.data.schedules
  252. this.zone_schedules = this.processedDialysisSchedules(schedules, this.zone_options)
  253. } else {
  254. this.$message.error(resp.msg)
  255. }
  256. })
  257. },
  258. processedDialysisSchedules: function(schedules, zone_options) {
  259. var zoneMap = {}
  260. var scheduleMap = {}
  261. for (let z_i = 0; z_i < zone_options.length; z_i++) {
  262. const zone = zone_options[z_i]
  263. if (zone.id == 0) {
  264. continue
  265. }
  266. scheduleMap[zone.id] = []
  267. }
  268. for (let index = 0; index < schedules.length; index++) {
  269. const schedule = schedules[index]
  270. scheduleMap[schedule.device_number.zone.id].push(schedule)
  271. }
  272. var zone_schedules = []
  273. for (let index = 0; index < zone_options.length; index++) {
  274. const zone = zone_options[index]
  275. if (zone.id == 0) {
  276. continue
  277. }
  278. var schedules = scheduleMap[zone.id]
  279. zone_schedules.push({ zone_id: zone.id, zone_name: zone.text, schedules: schedules })
  280. }
  281. return zone_schedules
  282. }
  283. }
  284. }
  285. </script>
  286. <style rel="stylesheet/scss" lang="scss" scoped>
  287. .app-container {
  288. // margin: 20px;
  289. font-size: 15px;
  290. .filter-container {
  291. padding-bottom: 5px;
  292. }
  293. .search-component {
  294. width: 500px;
  295. .searchBox {
  296. width: 300px;
  297. height: 36px;
  298. line-height: 36px;
  299. padding-left: 15px;
  300. border: 1px #dcdfe6 solid;
  301. border-right: none;
  302. outline: none;
  303. float: left;
  304. border-radius: 6px 0 0 6px;
  305. font-size: 14px;
  306. color: #333;
  307. background: #fff;
  308. box-shadow: 3px 3px 4px rgba(135, 135, 135, 0.05);
  309. }
  310. .searchBtn {
  311. background-color: #409eff;
  312. color: #fff;
  313. font-size: 15px;
  314. text-align: center;
  315. height: 36px;
  316. line-height: 36px;
  317. float: left;
  318. outline: none;
  319. width: 70px;
  320. border: none;
  321. border-radius: 0 6px 6px 0;
  322. font-family: "Microsoft Yahei";
  323. cursor: pointer;
  324. }
  325. }
  326. .amount {
  327. font-weight: normal;
  328. padding: 10px 0 0 0;
  329. color: #606266;
  330. font-size: 14px;
  331. span {
  332. color: #ef2525;
  333. font-family: "Arial";
  334. padding: 0 2px;
  335. }
  336. }
  337. }
  338. .PatientArea{
  339. .list{
  340. .title{
  341. font-size: 16px;
  342. color: #34495e;
  343. height:50px ;
  344. line-height: 50px;
  345. font-weight: bold;
  346. }
  347. }
  348. }
  349. </style>