weight_table.vue 18KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  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;margin-bottom: 20px;">
  14. <div style="flex: 6;display: flex;flex-wrap:wrap">
  15. <div>
  16. 日期:
  17. <el-select v-model="date_value" @change="datachange" placeholder="请选择" style="width: 100px;">
  18. <el-option
  19. v-for="item in date_options"
  20. :key="item.value"
  21. :label="item.label"
  22. :value="item.value">
  23. </el-option>
  24. </el-select>
  25. </div>
  26. <div style="margin:0 10px;">
  27. <el-date-picker
  28. v-model="start_date"
  29. type="date"
  30. value-format="yyyy-MM-dd"
  31. placeholder="选择日期"
  32. style="width: 150px;">
  33. </el-date-picker>
  34. <span>-</span>
  35. <el-date-picker
  36. v-model="end_date"
  37. type="date"
  38. value-format="yyyy-MM-dd"
  39. placeholder="选择日期"
  40. style="width: 150px;">
  41. </el-date-picker>
  42. </div>
  43. <div>
  44. 体重增长:
  45. <el-select v-model="weight_value" placeholder="请选择" style="width: 100px;">
  46. <el-option :key="0" label="不限" :value="0"></el-option>
  47. <el-option
  48. v-for="item in weight_gain"
  49. :key="item.value"
  50. :label="item.label"
  51. :value="item.value">
  52. </el-option>
  53. </el-select>
  54. </div>
  55. <div>
  56. 干体重:
  57. <el-select v-model="dry_value" placeholder="请选择" style="width: 100px;">
  58. <el-option :key="0" label="不限" :value="0"></el-option>
  59. <el-option
  60. v-for="item in status_options"
  61. :key="item.value"
  62. :label="item.label"
  63. :value="item.value">
  64. </el-option>
  65. </el-select>
  66. </div>
  67. <div>
  68. 透后体重:
  69. <el-select v-model="after_value" placeholder="请选择" style="width: 100px;">
  70. <el-option :key="0" label="不限" :value="0"></el-option>
  71. <el-option
  72. v-for="item in after_options"
  73. :key="item.value"
  74. :label="item.label"
  75. :value="item.value">
  76. </el-option>
  77. </el-select>
  78. </div>
  79. <div >
  80. <el-input v-model="Patient_name" placeholder="搜索患者姓名"></el-input>
  81. </div>
  82. </div>
  83. <div style="flex: 1;">
  84. <div>
  85. <el-button type="primary" @click="deil_click">查询</el-button>
  86. <el-button type="primary" @click="exportExcel">导出</el-button>
  87. </div>
  88. </div>
  89. </div>
  90. <el-table :data="tableData" border style="width: 100%"
  91. :header-cell-style="{textAlign: 'center'}"
  92. :cell-style="{ textAlign: 'center' }"
  93. height="380">
  94. <el-table-column
  95. prop="index"
  96. label="序号"
  97. width="">
  98. </el-table-column>
  99. <el-table-column
  100. prop="dialysis_no"
  101. label="透析号"
  102. width="">
  103. </el-table-column>
  104. <el-table-column
  105. prop="name"
  106. label="患者姓名">
  107. </el-table-column>
  108. <el-table-column
  109. prop="sex"
  110. label="性别"
  111. width="">
  112. </el-table-column>
  113. <el-table-column
  114. prop="age"
  115. label="年龄"
  116. width="">
  117. </el-table-column>
  118. <el-table-column
  119. prop="date"
  120. label="透析日期"
  121. width="">
  122. </el-table-column>
  123. <el-table-column
  124. prop="dry_weight"
  125. label="干体重"
  126. width="">
  127. </el-table-column>
  128. <el-table-column
  129. prop="last_weight_after"
  130. label="前次透后体重">
  131. </el-table-column>
  132. <el-table-column
  133. prop="weight_before"
  134. label="透前体重"
  135. width="">
  136. </el-table-column>
  137. <el-table-column
  138. prop="weight_add"
  139. label="体重增加"
  140. width="">
  141. </el-table-column>
  142. <el-table-column
  143. prop="weight_after"
  144. label="透后体重">
  145. </el-table-column>
  146. </el-table>
  147. <div style="text-align: right;margin-top: 10px;">
  148. <el-pagination
  149. @size-change="handleSizeChange"
  150. @current-change="handleCurrentChange"
  151. :current-page="currentPage"
  152. :page-sizes="[50,100, 200, 300, 400]"
  153. :page-size="limit"
  154. layout="total, sizes, prev, pager, next, jumper"
  155. :total="total">
  156. </el-pagination>
  157. </div>
  158. </div>
  159. </div>
  160. <!-- 弹窗 -->
  161. </div>
  162. </template>
  163. <script>
  164. import * as echarts from 'echarts';
  165. import XLSX from 'xlsx';
  166. import { uParseTime } from "@/utils/tools";
  167. import {Getweightdetail} from '../../../../api/qcd'
  168. import { forEach } from 'jszip';
  169. import html2canvas from "html2canvas"
  170. export default {
  171. components:{
  172. },
  173. data(){
  174. return{
  175. date_value:4,
  176. start_date:'',
  177. end_date:this.getTime(new Date()),
  178. mode:'',
  179. date_mode:'',
  180. source:'',
  181. dialyze_value:0,
  182. dialyze_dialog:false,
  183. currentPage:1,
  184. limit:50,
  185. total:0,
  186. tableData:[],
  187. weight_gain:[{value:1,label:'体重增长<=3%'},{value:2,label:'3%<体重增长<5%'},{value:3,label:'体重增长>=5%'}],
  188. weight_value:0,
  189. dry_value:0,
  190. after_value:0,
  191. after_options:[{value:1,label:'达到干体重'},{value:2,label:'未达到干体重'},{value:3,label:'其他或卧床'}],
  192. Patient_name:'',
  193. date_options:[{value:1,label:'最近七天'},{value:2,label:'本周'},{value:3,label:'上周'},{value:4,label:'本月'},
  194. {value:5,label:'上月'},{value:6,label:'本年'},{value:7,label:'上一年'}
  195. ],
  196. status_options:[{value:1,label:'小于40kg'},{value:2,label:'40~50kg'},{value:3,label:'60~70kg'},
  197. {value:4,label:'大于70kg'},{value:5,label:'未知'}],
  198. date_mode_options:[{value:1,label:'按周'},{value:2,label:'按天'},{value:3,label:'按月'},{value:4,label:'按年'}],
  199. source_options:[{value:1,label:'以开始透析为准'},{value:2,label:'以排班为准'}],
  200. // weight_gain:[],
  201. weight_value:0,
  202. dry_value:0,
  203. after_value:0,
  204. // after_options:[],
  205. Patient_name:'',
  206. }
  207. },
  208. methods:{
  209. // 返回
  210. return_click(){
  211. this.$router.push('/Dialysisanalysis/qualitycontrol/weightblood')
  212. },
  213. // 导出excel
  214. exportExcel(){
  215. let tableData = [
  216. ['序号', '透析号', '患者姓名','性别','年龄','透析日期','干体重','前次透后体重','透前体重','体重增加','透后体重',]//导出表头
  217. ]
  218. this.tableData.forEach((item,index) =>{
  219. let rowdata=[]
  220. rowdata=[
  221. item.index,
  222. item.dialysis_no,
  223. item.name,
  224. item.sex,
  225. item.age,
  226. item.date,
  227. item.dry_weight,
  228. item.last_weight_after,
  229. item.weight_before,
  230. item.weight_add,
  231. item.weight_after
  232. ]
  233. tableData.push(rowdata)
  234. })
  235. let workSheet = XLSX.utils.aoa_to_sheet(tableData);
  236. let bookNew = XLSX.utils.book_new();
  237. XLSX.utils.book_append_sheet(bookNew, workSheet, '患者体重详情') // 工作簿名称
  238. let name = '患者体重详情'+ '.xlsx'
  239. XLSX.writeFile(bookNew, name) // 保存的文件名
  240. },
  241. // 查询
  242. sete_click(){
  243. this.getecharts()
  244. },
  245. // 详情查询
  246. deil_click(){
  247. // this.Getdialyzerdetail(this.getdialyze(this.dialyze_value))
  248. },
  249. // 下载
  250. Download_click(){
  251. const options ={
  252. allowTaint: true,
  253. useCORS: true
  254. }
  255. html2canvas(this.$refs.mychart,options).then(canvas =>{
  256. // const imageSrc = canvas.toDataURL();
  257. const imageUrl = canvas.toDataURL("image/png");
  258. // console.log('5555',imageUrl);
  259. // // const base = this.url.split(',')[1]
  260. // // console.log('2222',base);
  261. const blob = this.dataURLtoBlob(imageUrl)
  262. // console.log('4444',blob);
  263. const url = URL.createObjectURL(blob);
  264. // const file = (this.url).blob();
  265. // console.log('1111',url);
  266. var link= document.createElement("a");
  267. // //将生成的图片url赋值给a标签的href属性
  268. link.href = url;
  269. // //设置下载的文件名
  270. link.download = "透析器使用统计.jpg";
  271. // // 将a标签插入dom中
  272. console.log('link',link);
  273. document.body.appendChild(link);
  274. //模拟点击事件触发下载
  275. link.click();
  276. // 完成之后销毁创建的a标签
  277. document.body.removeChild(link);
  278. })
  279. },
  280. // 选择日期
  281. datachange(eve){
  282. if(eve ==1){
  283. this.start_date = this.getPreviousDate(7)
  284. this.end_date = this.getTime(new Date())
  285. }else if(eve==2){
  286. this.start_date = this.getFirstDayOfWeek(new Date())
  287. this.end_date = this.getTime(new Date())
  288. console.log('this.start_date', this.start_date);
  289. }else if(eve ==3){
  290. var date=new Date()
  291. date.setDate(date.getDate()-7 - date.getDay() + 1);
  292. var m =''
  293. var d = ''
  294. if(date.getMonth() + 1<10){
  295. m = '0'+(date.getMonth() + 1)
  296. }else{
  297. m = date.getMonth() + 1
  298. }
  299. if(date.getDate()<10){
  300. d = '0'+date.getDate()
  301. }else{
  302. d = date.getDate()
  303. }
  304. // this.start_date = date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate() ;
  305. this.start_date = date.getFullYear() + "-" + m + "-" + d ;
  306. date.setDate(date.getDate() +6);
  307. var mm = ''
  308. var dd = ''
  309. if(date.getMonth() + 1<10){
  310. mm = '0'+(date.getMonth() + 1)
  311. }else{
  312. mm = date.getMonth() + 1
  313. }
  314. if(date.getDate()<10){
  315. dd = '0'+date.getDate()
  316. }else{
  317. dd = date.getDate()
  318. }
  319. // if(date.getMonth() + 1<10)
  320. // this.end_date = date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate();
  321. this.end_date = date.getFullYear() + "-" + mm + "-" + dd ;
  322. console.log('this.end_date',this.end_date);
  323. }else if(eve ==4){
  324. this.start_date = this.getFirstDayOfMonth(new Date())
  325. this.end_date = this.getTime(new Date())
  326. }else if(eve ==5){
  327. this.getLastMonthFirstDay()
  328. this.getLastMonthLastDay()
  329. }else if(eve == 6){
  330. this.start_date = this.getFirstDayOfYear(new Date())
  331. this.end_date = this.getTime(new Date())
  332. }else if(eve == 7){
  333. this.getLastYearFirstDay()
  334. this.getLastYearLastDay()
  335. }
  336. console.log('eve',eve);
  337. },
  338. // 详情数据源
  339. Getdialyzerdetail(){
  340. const params ={
  341. start_time:this.start_date,
  342. end_time:this.end_date,
  343. add_type:this.weight_value,
  344. dry_type:this.dry_value,
  345. after_type:this.after_value,
  346. keyword:this.Patient_name,
  347. page:this.currentPage,
  348. limit:this.limit,
  349. }
  350. Getweightdetail(params).then(response =>{
  351. if(response.data.state == 1){
  352. console.log('体重详情分析',response.data.data);
  353. const list = response.data.data.list
  354. const table=[]
  355. if(list.length >0){
  356. list.forEach((item,index)=>{
  357. const obj ={
  358. index:index+1,
  359. dialysis_no:item.dialysis_no,
  360. name:item.patient_name,
  361. sex:this.getgender(item.gender),
  362. age:item.age,
  363. date:this.getTime(item.assessment_date),
  364. dry_weight:item.dry_weight,
  365. last_weight_after:item.last_weight_after,
  366. weight_before:item.weight_before,
  367. weight_add:item.weight_add,
  368. weight_after:item.weight_after
  369. }
  370. table.push(obj)
  371. })
  372. this.tableData = table
  373. this.total = response.data.data.total
  374. }
  375. }
  376. console.log('77777',response);
  377. })
  378. },
  379. // 首先定义一个getPreviousDate函数,方便调用
  380. getPreviousDate(numOfDays) {
  381. var date = new Date();
  382. date.setDate(date.getDate() - numOfDays);
  383. var year = date.getFullYear();
  384. if(date.getMonth() + 1<10){
  385. var month = '0'+(date.getMonth() + 1);
  386. }else{
  387. var month = date.getMonth() + 1;
  388. }
  389. if(date.getDate()<10){
  390. var day = '0'+date.getDate();
  391. }else{
  392. var day = date.getDate();
  393. }
  394. return year + "-" + month + "-" + day;
  395. },
  396. // 本周
  397. getFirstDayOfWeek(date){
  398. var weekday = date.getDay()
  399. date.setDate(date.getDate()-weekday+1);//往前算(weekday-1)天,年份、月份会自动变化
  400. return this.timeFormat(date);
  401. },
  402. // 本月
  403. getFirstDayOfMonth (date) {
  404. date.setDate(1);
  405. return this.timeFormat(date);
  406. },
  407. //上个月第一天
  408. getLastMonthFirstDay() {
  409. var date = new Date();
  410. date.setDate(0);
  411. var y = date.getFullYear(); //获取年份
  412. var m = date.getMonth() + 1; //获取月份
  413. m = m < 10 ? "0" + m : m;
  414. this.start_date = [y, m, '01'].join("-")
  415. // return [y, m, '01'].join("-");
  416. },
  417. // 上个月最后一天
  418. getLastMonthLastDay() {
  419. var date = new Date();
  420. date.setDate(0);
  421. var y = date.getFullYear(); //获取年份
  422. var m = date.getMonth() + 1; //获取月份
  423. var d = new Date(y, m, 0).getDate(); //获取当月最后一日
  424. m = m < 10 ? "0" + m : m; //月份补 0
  425. d = d < 10 ? "0" + d : d; //日数补 0
  426. this.end_date = [y, m, d].join("-")
  427. // return [y, m, d].join("-");
  428. },
  429. // 本年
  430. getFirstDayOfYear (date) {
  431. date.setDate(1);
  432. date.setMonth(0);
  433. return this.timeFormat(date);
  434. },
  435. // 上一年第一天
  436. getLastYearFirstDay() {
  437. let date = new Date();
  438. const year= date.setFullYear(date.getFullYear() - 1); // 设置年份为前一年
  439. const start_month= date.setMonth(0); // 设置月份为1月(注意月份是从0开始的)
  440. const start_day = date.setDate(1); // 设置日期为1日
  441. // const last_month = date.setMonth(11); // 设置月份为12月
  442. // const last_day = date.setDate(0); // 设置日期为0,这将自动设置为该月的最后一天
  443. // this.start_date = year+ "-" +start_month+ "-" +start_day
  444. this.start_date = this.getTime(start_day)
  445. // return this.start_date
  446. },
  447. // 上一年最后一天
  448. getLastYearLastDay() {
  449. let date = new Date();
  450. const year= date.setFullYear(date.getFullYear() - 1); // 设置年份为前一年
  451. const last_month = date.setMonth(12); // 设置月份为12月
  452. const last_day = date.setDate(0);// 设置日期为0,这将自动设置为该月的最后一天
  453. // this.end_date = year+ "-" +last_month+ "-" +last_day
  454. this.end_date = this.getTime(last_day)
  455. console.log('this.end_date',this.end_date);
  456. // return this.end_date;
  457. },
  458. // 日期格式化
  459. timeFormat(date) {
  460. if (!date || typeof(date) === "string") {
  461. this.error("参数异常,请检查...");
  462. }
  463. var y = date.getFullYear(); //年
  464. if(date.getMonth() + 1<10){
  465. var m ='0'+(date.getMonth() + 1); //月
  466. }else{
  467. var m =date.getMonth() + 1; //月
  468. }
  469. if(date.getDate() + 1<10){
  470. var d ='0'+date.getDate(); //日
  471. }else{
  472. var d = date.getDate(); //日
  473. }
  474. // var d = date.getDate(); //日
  475. return y + "-" + m + "-" + d;
  476. },
  477. handleCurrentChange(val){
  478. this.currentPage = val
  479. this.Getdialyzerdetail()
  480. },
  481. handleSizeChange(val){
  482. this.limit = val
  483. this.Getdialyzerdetail()
  484. },
  485. // 性别
  486. getgender(ids){
  487. if(ids ==1){
  488. return "男"
  489. }else{
  490. return "女"
  491. }
  492. },
  493. // 转换时间
  494. getTime(val) {
  495. if(val < 0){
  496. return ""
  497. }
  498. if(val == ""){
  499. return ""
  500. }else {
  501. return uParseTime(val, '{y}-{m}-{d}')
  502. }
  503. },
  504. dataURLtoBlob(dataURL) {
  505. const arr = dataURL.split(',');
  506. const mime = arr[0].match(/:(.*?);/)[1];
  507. const bstr = atob(arr[1]);
  508. let n = bstr.length;
  509. const u8arr = new Uint8Array(n);
  510. while (n--) {
  511. u8arr[n] = bstr.charCodeAt(n);
  512. }
  513. return new Blob([u8arr], { type: mime });
  514. },
  515. getdialyze(val){
  516. const option = this.dialyze_options
  517. for(let i in option){
  518. if(val == option[i].id){
  519. return option[i].name
  520. }
  521. }
  522. }
  523. },
  524. mounted(){
  525. },
  526. created(){
  527. this.start_date = this.getFirstDayOfMonth(new Date())
  528. this.Getdialyzerdetail()
  529. },
  530. }
  531. </script>