after_Blood.vue 23KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700
  1. <template>
  2. <div class="main-contain">
  3. <div class="position">
  4. <div>
  5. <span>
  6. <el-button @click="return_click" type="text" icon="el-icon-arrow-left">返回</el-button>
  7. </span>&nbsp;&nbsp;
  8. <span>患者透后血压分析</span>
  9. </div>
  10. </div>
  11. <div class="app-container">
  12. <div class="page_patientControlAnalysis">
  13. <div style="display: flex;">
  14. <div>
  15. 日期:
  16. <el-select v-model="date_value" @change="datachange" placeholder="请选择" style="width: 100px;">
  17. <el-option
  18. v-for="item in date_options"
  19. :key="item.value"
  20. :label="item.label"
  21. :value="item.value">
  22. </el-option>
  23. </el-select>
  24. </div>
  25. <div style="margin:0 10px">
  26. <el-date-picker
  27. v-model="start_date"
  28. type="date"
  29. value-format="yyyy-MM-dd"
  30. placeholder="选择日期"
  31. style="width: 150px;">
  32. </el-date-picker>
  33. <span>-</span>
  34. <el-date-picker
  35. v-model="end_date"
  36. type="date"
  37. value-format="yyyy-MM-dd"
  38. placeholder="选择日期"
  39. style="width: 150px;">
  40. </el-date-picker>
  41. </div>
  42. <div>
  43. <el-button type="primary" @click="sete_click">查询</el-button>
  44. <el-button type="primary" @click="Download_click">下载</el-button>
  45. </div>
  46. </div>
  47. <!-- 图表 -->
  48. <div ref="mychart">
  49. <div class="echart" id="mychart" style="width:100%;height:60vh"></div>
  50. </div>
  51. <div style="position: fixed;right: 5%;top: 50vh;">
  52. <el-popover
  53. placement="left"
  54. title="提示"
  55. width="500"
  56. trigger="click"
  57. content="1.统计时间段内留治患者干体重,在当前时间段的区间分布,不是统计每次透析的干体重。
  58. 2.如果一个患者在时间段内,调整过两次干体重,以最后一次为准。">
  59. <img src="@/assets/img/xiang.png" alt="" style="height: 20px;width: 20px;" slot="reference">
  60. <!-- <el-button slot="reference">click 激活</el-button> -->
  61. </el-popover>
  62. </div>
  63. </div>
  64. </div>
  65. <!-- 弹窗 -->
  66. <div>
  67. <el-dialog
  68. title="提示"
  69. :visible.sync="complete_dialog"
  70. width="80%">
  71. <div>
  72. <div style="display: flex;margin-bottom: 20px;">
  73. <div style="flex: 2;display: flex;">
  74. <div>
  75. 日期:
  76. <el-select v-model="date_value" @change="datachange" placeholder="请选择" style="width: 100px;">
  77. <el-option
  78. v-for="item in date_options"
  79. :key="item.value"
  80. :label="item.label"
  81. :value="item.value">
  82. </el-option>
  83. </el-select>
  84. </div>
  85. <div style="margin:0 10px">
  86. <el-date-picker
  87. v-model="start_date"
  88. type="date"
  89. value-format="yyyy-MM-dd"
  90. placeholder="选择日期"
  91. style="width: 150px;">
  92. </el-date-picker>
  93. <span>-</span>
  94. <el-date-picker
  95. v-model="end_date"
  96. type="date"
  97. value-format="yyyy-MM-dd"
  98. placeholder="选择日期"
  99. style="width: 150px;">
  100. </el-date-picker>
  101. </div>
  102. <div>
  103. 状态:
  104. <el-select v-model="status_value" placeholder="请选择" style="width: 130px;">
  105. <el-option :key="0" label="不限" :value="0"></el-option>
  106. <el-option
  107. v-for="item in status_options"
  108. :key="item.value"
  109. :label="item.label"
  110. :value="item.value">
  111. </el-option>
  112. </el-select>
  113. </div>
  114. </div>
  115. <div style="flex: 1;">
  116. <div>
  117. <el-button type="primary" @click="detil_click">查询</el-button>
  118. <el-button type="primary" @click="derive_click">导出</el-button>
  119. </div>
  120. </div>
  121. </div>
  122. <div>
  123. <el-table :data="tableData"
  124. border
  125. style="width: 100%;"
  126. :header-cell-style = "{'text-align':'center'}"
  127. :cell-style="{'text-align':'center'}"
  128. height="380">
  129. <el-table-column
  130. prop="index"
  131. label="序号"
  132. width="">
  133. </el-table-column>
  134. <el-table-column
  135. prop="dialysis_no"
  136. label="透析号"
  137. width="">
  138. </el-table-column>
  139. <el-table-column
  140. prop="patient_name"
  141. label="患者姓名">
  142. </el-table-column>
  143. <el-table-column
  144. prop="age"
  145. label="年龄">
  146. </el-table-column>
  147. <el-table-column
  148. prop="dialysis_date"
  149. label="透析日期"
  150. width="">
  151. </el-table-column>
  152. <el-table-column
  153. prop="PostDialysisBP"
  154. label="透后血压"
  155. width="">
  156. </el-table-column>
  157. </el-table>
  158. </div>
  159. <div style="text-align:right;margin-top: 10px;">
  160. <el-pagination
  161. @size-change="handleSizeChange"
  162. @current-change="handleCurrentChange"
  163. :current-page="currentPage"
  164. :page-sizes="[50,100, 200, 300, 400]"
  165. :page-size="limit"
  166. layout="total, sizes, prev, pager, next, jumper"
  167. :total="total">
  168. </el-pagination>
  169. </div>
  170. </div>
  171. <span slot="footer" class="dialog-footer">
  172. <el-button @click="complete_dialog = false">取 消</el-button>
  173. <el-button type="primary" @click="complete_dialog = false">确 定</el-button>
  174. </span>
  175. </el-dialog>
  176. </div>
  177. </div>
  178. </template>
  179. <script>
  180. import * as echarts from 'echarts';
  181. import XLSX from 'xlsx';
  182. import { uParseTime } from "@/utils/tools";
  183. import {Getpatinetbp,Getbpdetail} from '../../../../api/qcd'
  184. import {getAllNurseList} from '@/api/fallassement'
  185. import { getAllDoctorList} from "@/api/device"
  186. import html2canvas from "html2canvas"
  187. export default {
  188. components:{
  189. },
  190. data(){
  191. return{
  192. date_value:4,
  193. start_date:'',
  194. end_date:this.getTime(new Date()),
  195. mode:'',
  196. date_mode:'',
  197. source:'',
  198. status_value:0,
  199. complete_dialog:false,
  200. currentPage:1,
  201. limit:50,
  202. total:0,
  203. tableData:[],
  204. nurseList:[],
  205. operators:[],
  206. docList:[],
  207. status_options:[],
  208. date_options:[{value:1,label:'最近七天'},{value:2,label:'本周'},{value:3,label:'上周'},{value:4,label:'本月'},
  209. {value:5,label:'上月'},{value:6,label:'本年'},{value:7,label:'上一年'}
  210. ],
  211. date_mode_options:[{value:1,label:'按周'},{value:2,label:'按天'},{value:3,label:'按月'},{value:4,label:'按年'}],
  212. source_options:[{value:1,label:'以开始透析为准'},{value:2,label:'以排班为准'}],
  213. status_id:"",
  214. }
  215. },
  216. methods:{
  217. // 返回
  218. return_click(){
  219. this.$router.push('/Dialysisanalysis/qualitycontrol/weightblood')
  220. },
  221. // 数据源
  222. getecharts(){
  223. var chartDom = document.getElementById('mychart')
  224. var myChart = echarts.init(chartDom);
  225. const params={
  226. start_time:this.start_date,
  227. end_time:this.end_date,
  228. statistics_type:1
  229. }
  230. Getpatinetbp(params).then(response =>{
  231. if(response.data.state ==1){
  232. const list = response.data.data.list
  233. const xAxis = []
  234. const yAxis = []
  235. var option = []
  236. var total =0
  237. for(let key in list){
  238. const obj={
  239. name:list[key].name,
  240. value:list[key].total
  241. }
  242. xAxis.push(obj)
  243. yAxis.push(list[key].name)
  244. total = total + list[key].total
  245. const obj2 ={
  246. value:(key*1)+1,
  247. label:list[key].name
  248. }
  249. option.push(obj2)
  250. }
  251. this.status_options = option
  252. console.log('this.status_options',response.data.data);
  253. const option = {
  254. title:{
  255. text:'总数'+total,
  256. left:'5%',
  257. bottom:'5%',
  258. textStyle:{
  259. fontSize:30
  260. }
  261. },
  262. tooltip: {
  263. trigger: 'item',
  264. },
  265. legend: {
  266. data:yAxis,
  267. left: '10%',
  268. top: '30%',
  269. orient: 'vertical'
  270. },
  271. color:['#FFD7C0','#9FBDFC',"#A9E0F3", "#FF9994",'aquamarine','gold'],
  272. series: [
  273. {
  274. name: '',
  275. type: 'pie',
  276. radius: ['40%', '70%'],
  277. avoidLabelOverlap: true,
  278. itemStyle: {
  279. borderRadius: 10,
  280. borderColor: '#fff',
  281. borderWidth: 2
  282. },
  283. label: {
  284. show: true,
  285. position: 'center',
  286. normal : {
  287. formatter: '{b}:{c}: ({d}%)',
  288. textStyle : {
  289. fontWeight : 'normal',
  290. fontSize : 15,
  291. color : "black"
  292. }
  293. }
  294. },
  295. emphasis: {
  296. label: {
  297. show: true,
  298. fontSize: 40,
  299. fontWeight: 'bold'
  300. }
  301. },
  302. labelLine: {
  303. show: false
  304. },
  305. data: xAxis
  306. }
  307. ]
  308. };
  309. myChart.setOption(option);
  310. myChart.on('click',params =>{
  311. this.complete_dialog = true
  312. console.log('bbbb',params);
  313. for(let i in this.status_options){
  314. if(params.data.name == this.status_options[i].label){
  315. this.status_value = this.status_options[i].value
  316. }
  317. }
  318. this.getdetail(this.status_value)
  319. })
  320. }
  321. })
  322. },
  323. // 查询
  324. sete_click(){
  325. this.getecharts()
  326. },
  327. // 详情查询
  328. detil_click(){
  329. this.getdetail(this.status_value)
  330. },
  331. // 下载
  332. Download_click(){
  333. const options ={
  334. allowTaint: true,
  335. useCORS: true
  336. }
  337. html2canvas(this.$refs.mychart,options).then(canvas =>{
  338. // const imageSrc = canvas.toDataURL();
  339. const imageUrl = canvas.toDataURL("image/png");
  340. const blob = this.dataURLtoBlob(imageUrl)
  341. const url = URL.createObjectURL(blob);
  342. var link= document.createElement("a");
  343. // //将生成的图片url赋值给a标签的href属性
  344. link.href = url;
  345. // //设置下载的文件名
  346. link.download = "透析完成率统计.jpg";
  347. // // 将a标签插入dom中
  348. console.log('link',link);
  349. document.body.appendChild(link);
  350. //模拟点击事件触发下载
  351. link.click();
  352. // 完成之后销毁创建的a标签
  353. document.body.removeChild(link);
  354. })
  355. },
  356. // 导出excel
  357. derive_click(){
  358. let tableData = [
  359. ['序号', '透析号', '患者姓名', '年龄','透析日期', '透后血压']//导出表头
  360. ]
  361. this.tableData.forEach((item,index) =>{
  362. let rowdata=[]
  363. rowdata=[
  364. item.index,
  365. item.dialysis_no,
  366. item.patient_name,
  367. item.age,
  368. item.dialysis_date,
  369. item.PostDialysisBP
  370. ]
  371. tableData.push(rowdata)
  372. })
  373. let workSheet = XLSX.utils.aoa_to_sheet(tableData);
  374. let bookNew = XLSX.utils.book_new();
  375. XLSX.utils.book_append_sheet(bookNew, workSheet, '患者透后血压分析') // 工作簿名称
  376. let name = '患者透后血压分析'+ '.xlsx'
  377. XLSX.writeFile(bookNew, name) // 保存的文件名
  378. },
  379. // 详情数据源
  380. getdetail(value){
  381. const params ={
  382. start_time:this.start_date,
  383. end_time:this.end_date,
  384. status_type:value,
  385. page:this.currentPage,
  386. limit:this.limit,
  387. }
  388. Getbpdetail(params).then(response =>{
  389. if(response.data.state ==1){
  390. const list = response.data.data.list
  391. const xAxis = []
  392. const table = []
  393. if(list.length > 0){
  394. list.forEach((item,index) =>{
  395. const obj={
  396. index:index+1,
  397. dialysis_no:item.dialysis_no,
  398. patient_name:item.patient_name,
  399. age:item.age,
  400. dialysis_date:this.getTime(item.assessment_date),
  401. PostDialysisBP:item.post_dialysis_bp,
  402. }
  403. table.push(obj)
  404. })
  405. this.tableData = table
  406. this.total = response.data.data.total
  407. }
  408. }
  409. console.log('55555透后',response);
  410. })
  411. },
  412. // 选择日期
  413. datachange(eve){
  414. if(eve ==1){
  415. this.start_date = this.getPreviousDate(7)
  416. this.end_date = this.getTime(new Date())
  417. }else if(eve==2){
  418. this.start_date = this.getFirstDayOfWeek(new Date())
  419. this.end_date = this.getTime(new Date())
  420. console.log('this.start_date', this.start_date);
  421. }else if(eve ==3){
  422. var date=new Date()
  423. date.setDate(date.getDate()-7 - date.getDay() + 1);
  424. var m =''
  425. var d = ''
  426. if(date.getMonth() + 1<10){
  427. m = '0'+(date.getMonth() + 1)
  428. }else{
  429. m = date.getMonth() + 1
  430. }
  431. if(date.getDate()<10){
  432. d = '0'+date.getDate()
  433. }else{
  434. d = date.getDate()
  435. }
  436. // this.start_date = date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate() ;
  437. this.start_date = date.getFullYear() + "-" + m + "-" + d ;
  438. date.setDate(date.getDate() +6);
  439. var mm = ''
  440. var dd = ''
  441. if(date.getMonth() + 1<10){
  442. mm = '0'+(date.getMonth() + 1)
  443. }else{
  444. mm = date.getMonth() + 1
  445. }
  446. if(date.getDate()<10){
  447. dd = '0'+date.getDate()
  448. }else{
  449. dd = date.getDate()
  450. }
  451. // if(date.getMonth() + 1<10)
  452. // this.end_date = date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate();
  453. this.end_date = date.getFullYear() + "-" + mm + "-" + dd ;
  454. console.log('this.end_date',this.end_date);
  455. }else if(eve ==4){
  456. this.start_date = this.getFirstDayOfMonth(new Date())
  457. this.end_date = this.getTime(new Date())
  458. }else if(eve ==5){
  459. this.getLastMonthFirstDay()
  460. this.getLastMonthLastDay()
  461. }else if(eve == 6){
  462. this.start_date = this.getFirstDayOfYear(new Date())
  463. this.end_date = this.getTime(new Date())
  464. }else if(eve == 7){
  465. this.getLastYearFirstDay()
  466. this.getLastYearLastDay()
  467. }
  468. console.log('eve',eve);
  469. },
  470. // 首先定义一个getPreviousDate函数,方便调用
  471. getPreviousDate(numOfDays) {
  472. var date = new Date();
  473. date.setDate(date.getDate() - numOfDays);
  474. var year = date.getFullYear();
  475. if(date.getMonth() + 1<10){
  476. var month = '0'+(date.getMonth() + 1);
  477. }else{
  478. var month = date.getMonth() + 1;
  479. }
  480. if(date.getDate()<10){
  481. var day = '0'+date.getDate();
  482. }else{
  483. var day = date.getDate();
  484. }
  485. return year + "-" + month + "-" + day;
  486. },
  487. // 本周
  488. getFirstDayOfWeek(date){
  489. var weekday = date.getDay()
  490. date.setDate(date.getDate()-weekday+1);//往前算(weekday-1)天,年份、月份会自动变化
  491. return this.timeFormat(date);
  492. },
  493. // 本月
  494. getFirstDayOfMonth (date) {
  495. date.setDate(1);
  496. return this.timeFormat(date);
  497. },
  498. //上个月第一天
  499. getLastMonthFirstDay() {
  500. var date = new Date();
  501. date.setDate(0);
  502. var y = date.getFullYear(); //获取年份
  503. var m = date.getMonth() + 1; //获取月份
  504. m = m < 10 ? "0" + m : m;
  505. this.start_date = [y, m, '01'].join("-")
  506. // return [y, m, '01'].join("-");
  507. },
  508. // 上个月最后一天
  509. getLastMonthLastDay() {
  510. var date = new Date();
  511. date.setDate(0);
  512. var y = date.getFullYear(); //获取年份
  513. var m = date.getMonth() + 1; //获取月份
  514. var d = new Date(y, m, 0).getDate(); //获取当月最后一日
  515. m = m < 10 ? "0" + m : m; //月份补 0
  516. d = d < 10 ? "0" + d : d; //日数补 0
  517. this.end_date = [y, m, d].join("-")
  518. // return [y, m, d].join("-");
  519. },
  520. // 本年
  521. getFirstDayOfYear (date) {
  522. date.setDate(1);
  523. date.setMonth(0);
  524. return this.timeFormat(date);
  525. },
  526. // 上一年第一天
  527. getLastYearFirstDay() {
  528. let date = new Date();
  529. const year= date.setFullYear(date.getFullYear() - 1); // 设置年份为前一年
  530. const start_month= date.setMonth(0); // 设置月份为1月(注意月份是从0开始的)
  531. const start_day = date.setDate(1); // 设置日期为1日
  532. // const last_month = date.setMonth(11); // 设置月份为12月
  533. // const last_day = date.setDate(0); // 设置日期为0,这将自动设置为该月的最后一天
  534. // this.start_date = year+ "-" +start_month+ "-" +start_day
  535. this.start_date = this.getTime(start_day)
  536. // return this.start_date
  537. },
  538. // 上一年最后一天
  539. getLastYearLastDay() {
  540. let date = new Date();
  541. const year= date.setFullYear(date.getFullYear() - 1); // 设置年份为前一年
  542. const last_month = date.setMonth(12); // 设置月份为12月
  543. const last_day = date.setDate(0);// 设置日期为0,这将自动设置为该月的最后一天
  544. // this.end_date = year+ "-" +last_month+ "-" +last_day
  545. this.end_date = this.getTime(last_day)
  546. console.log('this.end_date',this.end_date);
  547. // return this.end_date;
  548. },
  549. // 日期格式化
  550. timeFormat(date) {
  551. if (!date || typeof(date) === "string") {
  552. this.error("参数异常,请检查...");
  553. }
  554. var y = date.getFullYear(); //年
  555. if(date.getMonth() + 1<10){
  556. var m ='0'+(date.getMonth() + 1); //月
  557. }else{
  558. var m =date.getMonth() + 1; //月
  559. }
  560. if(date.getDate() + 1<10){
  561. var d ='0'+date.getDate(); //日
  562. }else{
  563. var d = date.getDate(); //日
  564. }
  565. // var d = date.getDate(); //日
  566. return y + "-" + m + "-" + d;
  567. },
  568. handleCurrentChange(val){
  569. this.currentPage = val
  570. this.getdetail(this.status_value)
  571. },
  572. handleSizeChange(val){
  573. this.limit = val
  574. this.getdetail(this.status_value)
  575. },
  576. // 转换时间
  577. getTime(val) {
  578. if(val < 0){
  579. return ""
  580. }
  581. if(val == ""){
  582. return ""
  583. }else {
  584. return uParseTime(val, '{y}-{m}-{d}')
  585. }
  586. },
  587. dataURLtoBlob(dataURL) {
  588. const arr = dataURL.split(',');
  589. const mime = arr[0].match(/:(.*?);/)[1];
  590. const bstr = atob(arr[1]);
  591. let n = bstr.length;
  592. const u8arr = new Uint8Array(n);
  593. while (n--) {
  594. u8arr[n] = bstr.charCodeAt(n);
  595. }
  596. return new Blob([u8arr], { type: mime });
  597. },
  598. // 计算年龄
  599. analyzeIDCard(IDCard){
  600. var age = 0,yearBirth,monthBirth,dayBirth;
  601. //获取用户身份证号码
  602. var userCard = IDCard;
  603. //如果身份证号码为undefind则返回空
  604. if(!userCard){
  605. return age;
  606. }
  607. var reg = /(^\d{15}$)|(^\d{17}([0-9]|X)$)/; //验证身份证号码的正则
  608. if (reg.test(userCard)) {
  609. if (userCard.length == 15) {
  610. var org_birthday = userCard.substring(6, 12);
  611. //获取出生年月日
  612. yearBirth = "19" + org_birthday.substring(0, 2);
  613. monthBirth = org_birthday.substring(2, 4);
  614. dayBirth = org_birthday.substring(4, 6);
  615. } else if (userCard.length == 18) {
  616. //获取出生年月日
  617. yearBirth = userCard.substring(6,10);
  618. monthBirth = userCard.substring(10,12);
  619. dayBirth = userCard.substring(12,14);
  620. }
  621. //获取当前年月日并计算年龄
  622. var myDate = new Date();
  623. var monthNow = myDate.getMonth() + 1;
  624. var dayNow = myDate.getDate();
  625. var age = myDate.getFullYear() - yearBirth;
  626. if(monthNow < monthBirth || (monthNow == monthBirth && dayNow < dayBirth)){
  627. age--;
  628. }
  629. //返回年龄
  630. return age;
  631. } else {
  632. return ''
  633. }
  634. },
  635. // 护士
  636. getAllNurseList(){
  637. getAllNurseList().then(response=>{
  638. if(response.data.state ==1){
  639. var nurseList = response.data.data.nurseList
  640. console.log('0000',nurseList);
  641. this.nurseList =nurseList
  642. }
  643. })
  644. },
  645. // 医生
  646. getAllDoctorList(){
  647. getAllDoctorList().then(response=>{
  648. if(response.data.state == 1){
  649. var list = response.data.data.list
  650. console.log("list222222",list)
  651. this.docList = list
  652. this.operators = response.data.data.operators
  653. }
  654. })
  655. },
  656. getnurse(ids){
  657. const nurse = this.nurseList
  658. for(let i in nurse){
  659. if(ids==nurse[i].admin_user_id){
  660. return nurse[i].user_name
  661. }
  662. }
  663. },
  664. getdoctor(ids){
  665. const doctor = this.docList
  666. for(let i in doctor){
  667. if(ids == doctor[i].admin_user_id){
  668. return doctor[i].user_name
  669. }
  670. }
  671. }
  672. },
  673. mounted(){
  674. this.getecharts()
  675. },
  676. created(){
  677. this.start_date = this.getFirstDayOfMonth(new Date())
  678. this.getAllNurseList()
  679. this.getAllDoctorList()
  680. },
  681. }
  682. </script>