Browse Source

8月14,体重血压分析的页面

yq1 7 months ago
parent
commit
06823626cc

+ 102 - 0
src/router/modules/Dialysisanalysis.js View File

@@ -32,6 +32,17 @@ export default {
32 32
         noCache: true
33 33
       }
34 34
     },
35
+    // {//体重血压质控
36
+    //   path: '/Dialysisanalysis/qualitycontrol/weightblood',
37
+    //   component: () => import('@/xt_pages/Dialysisanalysis/weightblood/index'),
38
+    //   name: 'weightblood',
39
+    //   meta: {
40
+    //     title: '体重血压分析',
41
+    //     noCache: true
42
+    //   }
43
+    // },
44
+
45
+
35 46
     {//透析总量分析
36 47
       path: '/Dialysisanalysis/qualitycontrol/new_otherIndicators/Total_analysis',
37 48
       component: () => import('@/xt_pages/Dialysisanalysis/new_otherIndicators/components/Total_analysis'),
@@ -88,6 +99,97 @@ export default {
88 99
       is_menu: false
89 100
     },
90 101
 
102
+    // 体重血压
103
+    // {//干体重分析
104
+    //   path: '/Dialysisanalysis/qualitycontrol/weightblood/dry_weight',
105
+    //   component: () => import('@/xt_pages/Dialysisanalysis/weightblood/components/dry_weight'),
106
+    //   name: 'dry_weight',
107
+    //   meta: {
108
+    //     title: '患者干体重分析',
109
+    //     noCache: true
110
+    //   },
111
+    //   hidden: true,
112
+    //   is_menu: false
113
+    // },
114
+    // {//上次透析分母
115
+    //   path: '/Dialysisanalysis/qualitycontrol/weightblood/list_denominator',
116
+    //   component: () => import('@/xt_pages/Dialysisanalysis/weightblood/components/list_denominator'),
117
+    //   name: 'list_denominator',
118
+    //   meta: {
119
+    //     title: '患者体重增长分析(以上次透后体重为分母)',
120
+    //     noCache: true
121
+    //   },
122
+    //   hidden: true,
123
+    //   is_menu: false
124
+    // },
125
+    // {//干体重分母
126
+    //   path: '/Dialysisanalysis/qualitycontrol/weightblood/dry_denominator',
127
+    //   component: () => import('@/xt_pages/Dialysisanalysis/weightblood/components/dry_denominator'),
128
+    //   name: 'dry_denominator',
129
+    //   meta: {
130
+    //     title: '患者体重增长分析(以干体重为分母)',
131
+    //     noCache: true
132
+    //   },
133
+    //   hidden: true,
134
+    //   is_menu: false
135
+    // },
136
+    // {//患者透后体重分析
137
+    //   path: '/Dialysisanalysis/qualitycontrol/weightblood/dialyze_after',
138
+    //   component: () => import('@/xt_pages/Dialysisanalysis/weightblood/components/dialyze_after'),
139
+    //   name: 'dialyze_after',
140
+    //   meta: {
141
+    //     title: '患者透后体重分析',
142
+    //     noCache: true
143
+    //   },
144
+    //   hidden: true,
145
+    //   is_menu: false
146
+    // },
147
+    // {//患者体重详情
148
+    //   path: '/Dialysisanalysis/qualitycontrol/weightblood/weight_table',
149
+    //   component: () => import('@/xt_pages/Dialysisanalysis/weightblood/components/weight_table'),
150
+    //   name: 'weight_table',
151
+    //   meta: {
152
+    //     title: '患者体重详情',
153
+    //     noCache: true
154
+    //   },
155
+    //   hidden: true,
156
+    //   is_menu: false
157
+    // },
158
+    // {//透前血压分析
159
+    //   path: '/Dialysisanalysis/qualitycontrol/weightblood/before_Blood',
160
+    //   component: () => import('@/xt_pages/Dialysisanalysis/weightblood/components/before_Blood'),
161
+    //   name: 'before_Blood',
162
+    //   meta: {
163
+    //     title: '透前血压分析',
164
+    //     noCache: true
165
+    //   },
166
+    //   hidden: true,
167
+    //   is_menu: false
168
+    // },
169
+    // {//透前血压分析
170
+    //   path: '/Dialysisanalysis/qualitycontrol/weightblood/after_Blood',
171
+    //   component: () => import('@/xt_pages/Dialysisanalysis/weightblood/components/after_Blood'),
172
+    //   name: 'after_Blood',
173
+    //   meta: {
174
+    //     title: '透后血压分析',
175
+    //     noCache: true
176
+    //   },
177
+    //   hidden: true,
178
+    //   is_menu: false
179
+    // },
180
+    // {//患者血压详情
181
+    //   path: '/Dialysisanalysis/qualitycontrol/weightblood/blood_table',
182
+    //   component: () => import('@/xt_pages/Dialysisanalysis/weightblood/components/blood_table'),
183
+    //   name: 'blood_table',
184
+    //   meta: {
185
+    //     title: '透后血压分析',
186
+    //     noCache: true
187
+    //   },
188
+    //   hidden: true,
189
+    //   is_menu: false
190
+    // },
191
+
192
+
91 193
 
92 194
     {
93 195
       path: '/Dialysisanalysis/qualitycontrol/Indicatorsdetail',

+ 715 - 0
src/xt_pages/Dialysisanalysis/weightblood/components/after_Blood.vue View File

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

+ 715 - 0
src/xt_pages/Dialysisanalysis/weightblood/components/before_Blood.vue View File

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

+ 600 - 0
src/xt_pages/Dialysisanalysis/weightblood/components/blood_table.vue View File

@@ -0,0 +1,600 @@
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: 2;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="dialyze_value" placeholder="请选择" style="width: 100px;">
46
+                <el-option :key="0" label="不限" :value="0"></el-option>
47
+                <el-option
48
+                  v-for="item in dialyze_options"
49
+                  :key="item.id"
50
+                  :label="item.name"
51
+                  :value="item.id">
52
+                </el-option>
53
+              </el-select>
54
+            </div>
55
+            
56
+          </div>
57
+          <div style="flex: 1;">
58
+            <div>
59
+              <el-button type="primary" @click="deil_click">查询</el-button>
60
+              <el-button type="primary" @click="exportExcel">导出</el-button>
61
+            </div>
62
+          </div>
63
+        </div>
64
+
65
+        <el-table :data="tableData" border style="width: 100%"
66
+        :header-cell-style="{textAlign: 'center'}"
67
+        :cell-style="{ textAlign: 'center' }"
68
+        height="380">
69
+          <el-table-column
70
+            prop="index"
71
+            label="序号"
72
+            width="">
73
+          </el-table-column>
74
+          <el-table-column
75
+            prop="dialysis_no"
76
+            label="透析号"
77
+            width="">
78
+          </el-table-column>
79
+          <el-table-column
80
+            prop="name"
81
+            label="患者姓名">
82
+          </el-table-column>
83
+          <el-table-column
84
+            prop="name"
85
+            label="性别"
86
+            width="">
87
+          </el-table-column>
88
+          <el-table-column
89
+            prop="name"
90
+            label="年龄"
91
+            width="">
92
+          </el-table-column>
93
+          <el-table-column
94
+            prop="date"
95
+            label="透析日期"
96
+            width="">
97
+          </el-table-column>
98
+          <el-table-column
99
+            prop="mode_name"
100
+            label="干体重"
101
+            width="">
102
+          </el-table-column>
103
+          <el-table-column
104
+            prop="dialyszers"
105
+            label="超滤总量(L)">
106
+          </el-table-column>
107
+          <el-table-column
108
+            prop="date"
109
+            label="实际超滤量(ml)"
110
+            width="">
111
+          </el-table-column>
112
+          <el-table-column
113
+            prop="mode_name"
114
+            label="超滤滤"
115
+            width="">
116
+          </el-table-column>
117
+          <el-table-column
118
+            prop="dialyszers"
119
+            label="透前血压">
120
+          </el-table-column>
121
+          <el-table-column
122
+            prop="dialyszers"
123
+            label="监测记录血压">
124
+          </el-table-column>
125
+          <el-table-column
126
+            prop="dialyszers"
127
+            label="透后血压">
128
+          </el-table-column>
129
+        </el-table>
130
+        <div style="text-align: right;margin-top: 10px;">
131
+          <el-pagination
132
+            @size-change="handleSizeChange"
133
+            @current-change="handleCurrentChange"
134
+            :current-page="currentPage"
135
+            :page-sizes="[50,100, 200, 300, 400]"
136
+            :page-size="limit"
137
+            layout="total, sizes, prev, pager, next, jumper"
138
+            :total="total">
139
+          </el-pagination>
140
+        </div>
141
+      </div>
142
+    </div>
143
+
144
+    <!-- 弹窗 -->
145
+   
146
+  </div>
147
+</template>
148
+<script>
149
+import * as echarts from 'echarts';
150
+import XLSX from 'xlsx';
151
+import { uParseTime } from "@/utils/tools";
152
+import {Getdialyzer,Getdialyzerdetail,Getdialyzerconfig} from '../../../../api/qcd'
153
+import { forEach } from 'jszip';
154
+import html2canvas from "html2canvas"
155
+  export default {
156
+    components:{
157
+    },
158
+    data(){
159
+      return{
160
+        date_value:4,
161
+        start_date:'',
162
+        end_date:this.getTime(new Date()),
163
+        mode:'',
164
+        date_mode:'',
165
+        source:'',
166
+        dialyze_value:0,
167
+        dialyze_dialog:false,
168
+        currentPage:1,
169
+        limit:50,
170
+        total:0,
171
+        tableData:[],
172
+        dialyze_options:[],
173
+        date_options:[{value:1,label:'最近七天'},{value:2,label:'本周'},{value:3,label:'上周'},{value:4,label:'本月'},
174
+                      {value:5,label:'上月'},{value:6,label:'本年'},{value:7,label:'上一年'}
175
+        ],
176
+        modearr:[{ id: 1, name: 'HD' },{ id: 2, name: 'HDF' },{ id: 3, name: 'HD + HP' },{ id: 4, name: 'HP' },
177
+          { id: 5, name: 'HF' },{ id: 6, name: 'SCUF' },{ id: 7, name: 'IUF' },{ id: 8, name: 'HFHD' },{ id: 9, name: 'HFHD+HP' },
178
+          { id: 10, name: 'PHF' },{ id: 11, name: 'HFR' },{ id: 12, name: 'HDF+HP' },{ id: 13, name: 'CRRT' },{ id: 14, name: '腹水回输' },
179
+          { id:19, name:"IUF+HD"},{ id:20, name:"UF"},{ id:21, name:"HD+"},{ id:22, name:"血浆胆红素吸附+HDF"},{ id:23, name:"血浆胆红素吸附"},
180
+          { id:24, name:"I-HDF"},{ id:25, name:"HD高通"},{ id:26, name:"CVVH"},{ id:27, name:"CVVHD"},{ id:28, name:"CVVHDF"},{ id:29, name:"PE"},
181
+          { id:30, name:"血浆胆红素吸附+HP"},{ id:31, name:"HPD"},{ id:32, name:"HDP"},{ id:33, name:"HFD"},{ id:34, name:"HDF100"},
182
+          { id:35, name:"HDF600"},{ id:36, name:"HDF800"},{ id:37, name:"HDF1000"},
183
+        ],
184
+        date_mode_options:[{value:1,label:'按周'},{value:2,label:'按天'},{value:3,label:'按月'},{value:4,label:'按年'}],
185
+        source_options:[{value:1,label:'以开始透析为准'},{value:2,label:'以排班为准'}],
186
+
187
+
188
+        input:'',
189
+      }
190
+    },
191
+    methods:{
192
+      // 返回
193
+      return_click(){
194
+        this.$router.push('/Dialysisanalysis/qualitycontrol/weightblood')
195
+      },
196
+      // 数据源
197
+      getecharts(){
198
+        var chartDom = document.getElementById('mychart')
199
+        var myChart = echarts.init(chartDom);
200
+        const params ={
201
+          start_date:this.start_date,
202
+          end_date:this.end_date,
203
+        }
204
+        Getdialyzer(params).then(response =>{
205
+          console.log('ressponse',response.data.data);
206
+          if(response.data.state ==1){
207
+            console.log('bbbbbbbbb',response.data.data);
208
+            const list = response.data.data.data
209
+            const xAxis =[]
210
+            const yAxis = []
211
+            list.forEach(item =>{
212
+
213
+              xAxis.push(item.name)
214
+              yAxis.push(item.count)
215
+            })
216
+            this.bar_xAxis = xAxis
217
+            const options = []
218
+            for(let i in xAxis){
219
+              const arr ={
220
+                id:i+1,
221
+                name:xAxis[i]
222
+              }
223
+              options.push(arr)
224
+            }
225
+            this.dialyze_options = options
226
+            const option = {
227
+              xAxis: {
228
+                type: 'category',
229
+                data: xAxis,
230
+                axisLabel:{
231
+                  interval:0,
232
+                }
233
+              },
234
+              yAxis: {
235
+                type: 'value'
236
+              },
237
+              series: [
238
+                {
239
+                  data:yAxis ,
240
+                  type: 'bar',
241
+                  barWidth: '25%',
242
+                  label: {
243
+                    normal: {
244
+                      show: true,
245
+                      position: 'top',
246
+                      formatter: '{c}',
247
+                      textStyle:{
248
+                        color: 'black',//字体颜色
249
+                        fontSize: 13//字体大小
250
+                      }
251
+                    },
252
+                  },
253
+                  itemStyle:{
254
+                    normal:{
255
+                      color:function (params){
256
+                        // const colorarr=['#FFA333','#A155E8','#6D91FF','#A233A2'];
257
+                        var colorarr = [["#A9E0F3", "#9FBDFC"],["#FFD7C0", "#FF9994"]]
258
+                        var index = params.dataIndex;
259
+                        if (params.dataIndex >= colorarr.length) {
260
+                          index = params.dataIndex % colorarr.length;
261
+                        }
262
+                        return new echarts.graphic.LinearGradient(0, 0, 0, 1, [
263
+                          { offset: 0, color: colorarr[index][0] },
264
+                          // { offset: 0.5, color: colorList[index][1] },
265
+                          { offset: 1, color: colorarr[index][1] }
266
+                        ]);
267
+                      }
268
+                    }
269
+                  }
270
+                }
271
+              ]
272
+            }
273
+            myChart.setOption(option);
274
+            myChart.on('click',params =>{
275
+              this.dialyze_dialog = true
276
+              console.log('vvvvv',params);
277
+              this.Getdialyzerdetail(params.name)
278
+            })
279
+          }
280
+
281
+        })
282
+
283
+      },
284
+      // 导出excel
285
+      exportExcel(){
286
+        let tableData = [
287
+          ['序号', '透析号', '患者姓名', '透析日期','透析模式', '透析器']//导出表头
288
+        ]
289
+        this.tableData.forEach((item,index) =>{
290
+          let rowdata=[]
291
+          rowdata=[
292
+            item.index,
293
+            item.dialysis_no,
294
+            item.name,
295
+            item.date,
296
+            item.mode_name,
297
+            item.dialyszers,
298
+          ]
299
+          tableData.push(rowdata)
300
+        })
301
+        let workSheet = XLSX.utils.aoa_to_sheet(tableData);
302
+        let bookNew = XLSX.utils.book_new();
303
+        XLSX.utils.book_append_sheet(bookNew, workSheet, '透析器使用统计') // 工作簿名称
304
+        let name = '透析器使用统计'+ '.xlsx'
305
+        XLSX.writeFile(bookNew, name) // 保存的文件名
306
+      },
307
+      // 查询
308
+      sete_click(){
309
+        this.getecharts()
310
+      },
311
+      // 详情查询
312
+      deil_click(){
313
+        this.Getdialyzerdetail(this.getdialyze(this.dialyze_value))
314
+      },
315
+       // 下载
316
+      Download_click(){
317
+        const options ={
318
+          allowTaint: true,
319
+          useCORS: true
320
+        }
321
+        html2canvas(this.$refs.mychart,options).then(canvas =>{
322
+          // const imageSrc = canvas.toDataURL();
323
+          const imageUrl = canvas.toDataURL("image/png");
324
+          // console.log('5555',imageUrl);
325
+        //   // const base = this.url.split(',')[1]
326
+        //   // console.log('2222',base);
327
+          const blob = this.dataURLtoBlob(imageUrl)
328
+          // console.log('4444',blob);
329
+          const url = URL.createObjectURL(blob);
330
+          // const file = (this.url).blob();
331
+          // console.log('1111',url);
332
+          var link= document.createElement("a");
333
+        //   //将生成的图片url赋值给a标签的href属性
334
+          link.href = url;
335
+        //   //设置下载的文件名
336
+          link.download = "透析器使用统计.jpg";
337
+          // // 将a标签插入dom中
338
+          console.log('link',link);
339
+          document.body.appendChild(link);
340
+          //模拟点击事件触发下载
341
+          link.click();
342
+          // 完成之后销毁创建的a标签
343
+          document.body.removeChild(link);
344
+
345
+        })
346
+      },
347
+      // 选择日期
348
+      datachange(eve){
349
+        if(eve ==1){
350
+          this.start_date = this.getPreviousDate(7)
351
+          this.end_date = this.getTime(new Date())
352
+        }else if(eve==2){
353
+          this.start_date = this.getFirstDayOfWeek(new Date())
354
+          this.end_date = this.getTime(new Date())
355
+          console.log('this.start_date', this.start_date);
356
+        }else if(eve ==3){
357
+          var date=new Date()
358
+          date.setDate(date.getDate()-7 - date.getDay() + 1);
359
+          var m =''
360
+          var d = ''
361
+          if(date.getMonth() + 1<10){
362
+            m = '0'+(date.getMonth() + 1)
363
+          }else{
364
+             m = date.getMonth() + 1
365
+          }
366
+          if(date.getDate()<10){
367
+             d = '0'+date.getDate()
368
+          }else{
369
+            d = date.getDate()
370
+          }
371
+          // this.start_date = date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate() ;
372
+          this.start_date = date.getFullYear() + "-" + m + "-" + d ;
373
+          date.setDate(date.getDate() +6);
374
+          var mm = ''
375
+          var dd = ''
376
+          if(date.getMonth() + 1<10){
377
+            mm = '0'+(date.getMonth() + 1)
378
+          }else{
379
+            mm = date.getMonth() + 1
380
+          }
381
+          if(date.getDate()<10){
382
+            dd = '0'+date.getDate()
383
+          }else{
384
+            dd = date.getDate()
385
+          }
386
+          // if(date.getMonth() + 1<10)
387
+          // this.end_date = date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate();
388
+          this.end_date = date.getFullYear() + "-" + mm + "-" + dd ;
389
+          console.log('this.end_date',this.end_date);
390
+
391
+        }else if(eve ==4){
392
+          this.start_date = this.getFirstDayOfMonth(new Date())
393
+          this.end_date = this.getTime(new Date())
394
+        }else if(eve ==5){
395
+          this.getLastMonthFirstDay()
396
+          this.getLastMonthLastDay()
397
+        }else if(eve == 6){
398
+          this.start_date = this.getFirstDayOfYear(new Date())
399
+          this.end_date = this.getTime(new Date())
400
+        }else if(eve == 7){
401
+          this.getLastYearFirstDay()
402
+          this.getLastYearLastDay()
403
+        }
404
+        console.log('eve',eve);
405
+      },
406
+      // 详情数据源
407
+      Getdialyzerdetail(name){
408
+        const params={
409
+          dialyzer:name,
410
+          start_date:this.start_date,
411
+          end_date:this.end_date,
412
+          page:this.currentPage,
413
+          limit:this.limit,
414
+        }
415
+        Getdialyzerdetail(params).then(response =>{
416
+          if(response.data.state == 1){
417
+            const list = response.data.data.prescriptions
418
+            const table=[]
419
+            list.forEach((item,index)=>{
420
+              const obj ={
421
+                index:index+1,
422
+                dialysis_no:item.patient.dialysis_no,
423
+                name:item.patient.name,
424
+                date:this.getTime(item.record_date),
425
+                mode_name:this.getmode(item.mode_id),
426
+                dialyszers:item.dialysis_dialyszers +'  '+ item.dialysis_irrigation+'  '+item.dialysis_strainer
427
+                // dialyszers:item.dialysis_dialyszers || item.dialysis_irrigation || item.dialysis_strainer
428
+              }
429
+              table.push(obj)
430
+            })
431
+            this.tableData = table
432
+            this.total = response.data.data.total
433
+          }
434
+          console.log('77777',response);
435
+        })
436
+      },
437
+       // 首先定义一个getPreviousDate函数,方便调用
438
+      getPreviousDate(numOfDays) {
439
+        var date = new Date();
440
+        date.setDate(date.getDate() - numOfDays);
441
+        var year = date.getFullYear();
442
+        if(date.getMonth() + 1<10){
443
+          var month = '0'+(date.getMonth() + 1);
444
+        }else{
445
+          var month = date.getMonth() + 1;
446
+        }
447
+
448
+        if(date.getDate()<10){
449
+          var day = '0'+date.getDate();
450
+        }else{
451
+          var day = date.getDate();
452
+        }
453
+        return year + "-" + month + "-" + day;
454
+      },
455
+      // 本周
456
+      getFirstDayOfWeek(date){
457
+        var weekday = date.getDay()
458
+        date.setDate(date.getDate()-weekday+1);//往前算(weekday-1)天,年份、月份会自动变化
459
+        return this.timeFormat(date);
460
+      },
461
+      // 本月
462
+      getFirstDayOfMonth (date) {
463
+        date.setDate(1);
464
+        return this.timeFormat(date);
465
+      },
466
+       //上个月第一天
467
+      getLastMonthFirstDay() {
468
+          var date = new Date();
469
+          date.setDate(0);
470
+          var y = date.getFullYear(); //获取年份
471
+          var m = date.getMonth() + 1; //获取月份
472
+          m = m < 10 ? "0" + m : m;
473
+          this.start_date = [y, m, '01'].join("-")
474
+          // return [y, m, '01'].join("-");
475
+      },
476
+      // 上个月最后一天
477
+      getLastMonthLastDay() {
478
+          var date = new Date();
479
+          date.setDate(0);
480
+          var y = date.getFullYear(); //获取年份
481
+          var m = date.getMonth() + 1; //获取月份
482
+          var d = new Date(y, m, 0).getDate(); //获取当月最后一日
483
+          m = m < 10 ? "0" + m : m; //月份补 0
484
+          d = d < 10 ? "0" + d : d; //日数补 0
485
+          this.end_date = [y, m, d].join("-")
486
+          // return [y, m, d].join("-");
487
+      },
488
+      // 本年
489
+      getFirstDayOfYear (date) {
490
+        date.setDate(1);
491
+        date.setMonth(0);
492
+        return this.timeFormat(date);
493
+      },
494
+      // 上一年第一天
495
+      getLastYearFirstDay() {
496
+          let date = new Date();
497
+         const year= date.setFullYear(date.getFullYear() - 1); // 设置年份为前一年
498
+         const start_month= date.setMonth(0); // 设置月份为1月(注意月份是从0开始的)
499
+         const start_day = date.setDate(1); // 设置日期为1日
500
+        //  const last_month = date.setMonth(11); // 设置月份为12月
501
+        //  const last_day = date.setDate(0); // 设置日期为0,这将自动设置为该月的最后一天
502
+        //  this.start_date = year+ "-" +start_month+ "-" +start_day
503
+         this.start_date = this.getTime(start_day)
504
+        //  return this.start_date
505
+      },
506
+      // 上一年最后一天
507
+      getLastYearLastDay() {
508
+          let date = new Date();
509
+          const year= date.setFullYear(date.getFullYear() - 1); // 设置年份为前一年
510
+          const last_month = date.setMonth(12); // 设置月份为12月
511
+          const last_day = date.setDate(0);// 设置日期为0,这将自动设置为该月的最后一天
512
+          // this.end_date =  year+ "-" +last_month+ "-" +last_day
513
+          this.end_date = this.getTime(last_day)
514
+          console.log('this.end_date',this.end_date);
515
+          // return this.end_date;
516
+      },
517
+      // 日期格式化
518
+      timeFormat(date) {
519
+          if (!date || typeof(date) === "string") {
520
+            this.error("参数异常,请检查...");
521
+          }
522
+          var y = date.getFullYear(); //年
523
+          if(date.getMonth() + 1<10){
524
+            var m ='0'+(date.getMonth() + 1); //月
525
+          }else{
526
+            var m =date.getMonth() + 1; //月
527
+          }
528
+          if(date.getDate() + 1<10){
529
+            var d ='0'+date.getDate(); //日
530
+          }else{
531
+            var d = date.getDate(); //日
532
+          }
533
+          // var d = date.getDate(); //日
534
+
535
+          return y + "-" + m + "-" + d;
536
+      },
537
+      handleCurrentChange(val){
538
+        this.currentPage = val
539
+        this.Getdialyzerdetail(this.getdialyze(this.dialyze_value))
540
+      },
541
+      handleSizeChange(val){
542
+        this.limit = val
543
+        this.Getdialyzerdetail(this.getdialyze(this.dialyze_value))
544
+      },
545
+      // 透析模式
546
+      getmode(ids){
547
+        const modes=this.modearr
548
+        for(let i in modes){
549
+          if(ids == modes[i].id){
550
+            return modes[i].name
551
+          }
552
+        }
553
+      },
554
+       // 转换时间
555
+      getTime(val) {
556
+        if(val < 0){
557
+          return ""
558
+        }
559
+        if(val == ""){
560
+          return ""
561
+        }else {
562
+          return uParseTime(val, '{y}-{m}-{d}')
563
+        }
564
+      },
565
+      dataURLtoBlob(dataURL) {
566
+        const arr = dataURL.split(',');
567
+        const mime = arr[0].match(/:(.*?);/)[1];
568
+        const bstr = atob(arr[1]);
569
+        let n = bstr.length;
570
+        const u8arr = new Uint8Array(n);
571
+        while (n--) {
572
+          u8arr[n] = bstr.charCodeAt(n);
573
+        }
574
+        return new Blob([u8arr], { type: mime });
575
+      },
576
+      // 全部透析器
577
+      Getdialyzerconfig(){
578
+        Getdialyzerconfig().then(response =>{
579
+          console.log('666666',response);
580
+        })
581
+      },
582
+      getdialyze(val){
583
+        const option = this.dialyze_options
584
+        for(let i in option){
585
+          if(val == option[i].id){
586
+            return option[i].name
587
+          }
588
+        }
589
+      }
590
+    },
591
+    mounted(){
592
+      this.getecharts()
593
+    },
594
+    created(){
595
+      this.start_date = this.getFirstDayOfMonth(new Date())
596
+      this.Getdialyzerconfig()
597
+    },
598
+
599
+  }
600
+</script>

+ 681 - 0
src/xt_pages/Dialysisanalysis/weightblood/components/dialyze_after.vue View File

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

+ 682 - 0
src/xt_pages/Dialysisanalysis/weightblood/components/dry_denominator.vue View File

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

+ 711 - 0
src/xt_pages/Dialysisanalysis/weightblood/components/dry_weight.vue View File

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

+ 682 - 0
src/xt_pages/Dialysisanalysis/weightblood/components/list_denominator.vue View File

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

+ 618 - 0
src/xt_pages/Dialysisanalysis/weightblood/components/weight_table.vue View File

@@ -0,0 +1,618 @@
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: 2;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="dialyze_value" placeholder="请选择" style="width: 100px;">
46
+                <el-option :key="0" label="不限" :value="0"></el-option>
47
+                <el-option
48
+                  v-for="item in dialyze_options"
49
+                  :key="item.id"
50
+                  :label="item.name"
51
+                  :value="item.id">
52
+                </el-option>
53
+              </el-select>
54
+            </div>
55
+            <div>
56
+              干体重:
57
+              <el-select v-model="dialyze_value" placeholder="请选择" style="width: 100px;">
58
+                <el-option :key="0" label="不限" :value="0"></el-option>
59
+                <el-option
60
+                  v-for="item in dialyze_options"
61
+                  :key="item.id"
62
+                  :label="item.name"
63
+                  :value="item.id">
64
+                </el-option>
65
+              </el-select>
66
+            </div>
67
+            <div>
68
+              透后体重:
69
+              <el-select v-model="dialyze_value" placeholder="请选择" style="width: 100px;">
70
+                <el-option :key="0" label="不限" :value="0"></el-option>
71
+                <el-option
72
+                  v-for="item in dialyze_options"
73
+                  :key="item.id"
74
+                  :label="item.name"
75
+                  :value="item.id">
76
+                </el-option>
77
+              </el-select>
78
+            </div>
79
+            <div >
80
+              <el-input v-model="input" 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
+
91
+        <el-table :data="tableData" border style="width: 100%"
92
+        :header-cell-style="{textAlign: 'center'}"
93
+        :cell-style="{ textAlign: 'center' }"
94
+        height="380">
95
+          <el-table-column
96
+            prop="index"
97
+            label="序号"
98
+            width="">
99
+          </el-table-column>
100
+          <el-table-column
101
+            prop="dialysis_no"
102
+            label="透析号"
103
+            width="">
104
+          </el-table-column>
105
+          <el-table-column
106
+            prop="name"
107
+            label="患者姓名">
108
+          </el-table-column>
109
+          <el-table-column
110
+            prop="name"
111
+            label="性别"
112
+            width="">
113
+          </el-table-column>
114
+          <el-table-column
115
+            prop="name"
116
+            label="年龄"
117
+            width="">
118
+          </el-table-column>
119
+          <el-table-column
120
+            prop="date"
121
+            label="透析日期"
122
+            width="">
123
+          </el-table-column>
124
+          <el-table-column
125
+            prop="mode_name"
126
+            label="干体重"
127
+            width="">
128
+          </el-table-column>
129
+          <el-table-column
130
+            prop="dialyszers"
131
+            label="前次透后体重">
132
+          </el-table-column>
133
+          <el-table-column
134
+            prop="date"
135
+            label="透前体重"
136
+            width="">
137
+          </el-table-column>
138
+          <el-table-column
139
+            prop="mode_name"
140
+            label="体重增加"
141
+            width="">
142
+          </el-table-column>
143
+          <el-table-column
144
+            prop="dialyszers"
145
+            label="透后体重">
146
+          </el-table-column>
147
+        </el-table>
148
+        <div style="text-align: right;margin-top: 10px;">
149
+          <el-pagination
150
+            @size-change="handleSizeChange"
151
+            @current-change="handleCurrentChange"
152
+            :current-page="currentPage"
153
+            :page-sizes="[50,100, 200, 300, 400]"
154
+            :page-size="limit"
155
+            layout="total, sizes, prev, pager, next, jumper"
156
+            :total="total">
157
+          </el-pagination>
158
+        </div>
159
+      </div>
160
+    </div>
161
+
162
+    <!-- 弹窗 -->
163
+   
164
+  </div>
165
+</template>
166
+<script>
167
+import * as echarts from 'echarts';
168
+import XLSX from 'xlsx';
169
+import { uParseTime } from "@/utils/tools";
170
+import {Getdialyzer,Getdialyzerdetail,Getdialyzerconfig} from '../../../../api/qcd'
171
+import { forEach } from 'jszip';
172
+import html2canvas from "html2canvas"
173
+  export default {
174
+    components:{
175
+    },
176
+    data(){
177
+      return{
178
+        date_value:4,
179
+        start_date:'',
180
+        end_date:this.getTime(new Date()),
181
+        mode:'',
182
+        date_mode:'',
183
+        source:'',
184
+        dialyze_value:0,
185
+        dialyze_dialog:false,
186
+        currentPage:1,
187
+        limit:50,
188
+        total:0,
189
+        tableData:[],
190
+        dialyze_options:[],
191
+        date_options:[{value:1,label:'最近七天'},{value:2,label:'本周'},{value:3,label:'上周'},{value:4,label:'本月'},
192
+                      {value:5,label:'上月'},{value:6,label:'本年'},{value:7,label:'上一年'}
193
+        ],
194
+        modearr:[{ id: 1, name: 'HD' },{ id: 2, name: 'HDF' },{ id: 3, name: 'HD + HP' },{ id: 4, name: 'HP' },
195
+          { id: 5, name: 'HF' },{ id: 6, name: 'SCUF' },{ id: 7, name: 'IUF' },{ id: 8, name: 'HFHD' },{ id: 9, name: 'HFHD+HP' },
196
+          { id: 10, name: 'PHF' },{ id: 11, name: 'HFR' },{ id: 12, name: 'HDF+HP' },{ id: 13, name: 'CRRT' },{ id: 14, name: '腹水回输' },
197
+          { id:19, name:"IUF+HD"},{ id:20, name:"UF"},{ id:21, name:"HD+"},{ id:22, name:"血浆胆红素吸附+HDF"},{ id:23, name:"血浆胆红素吸附"},
198
+          { id:24, name:"I-HDF"},{ id:25, name:"HD高通"},{ id:26, name:"CVVH"},{ id:27, name:"CVVHD"},{ id:28, name:"CVVHDF"},{ id:29, name:"PE"},
199
+          { id:30, name:"血浆胆红素吸附+HP"},{ id:31, name:"HPD"},{ id:32, name:"HDP"},{ id:33, name:"HFD"},{ id:34, name:"HDF100"},
200
+          { id:35, name:"HDF600"},{ id:36, name:"HDF800"},{ id:37, name:"HDF1000"},
201
+        ],
202
+        date_mode_options:[{value:1,label:'按周'},{value:2,label:'按天'},{value:3,label:'按月'},{value:4,label:'按年'}],
203
+        source_options:[{value:1,label:'以开始透析为准'},{value:2,label:'以排班为准'}],
204
+
205
+
206
+        input:'',
207
+      }
208
+    },
209
+    methods:{
210
+      // 返回
211
+      return_click(){
212
+        this.$router.push('/Dialysisanalysis/qualitycontrol/weightblood')
213
+      },
214
+      // 数据源
215
+      getecharts(){
216
+        var chartDom = document.getElementById('mychart')
217
+        var myChart = echarts.init(chartDom);
218
+        const params ={
219
+          start_date:this.start_date,
220
+          end_date:this.end_date,
221
+        }
222
+        Getdialyzer(params).then(response =>{
223
+          console.log('ressponse',response.data.data);
224
+          if(response.data.state ==1){
225
+            console.log('bbbbbbbbb',response.data.data);
226
+            const list = response.data.data.data
227
+            const xAxis =[]
228
+            const yAxis = []
229
+            list.forEach(item =>{
230
+
231
+              xAxis.push(item.name)
232
+              yAxis.push(item.count)
233
+            })
234
+            this.bar_xAxis = xAxis
235
+            const options = []
236
+            for(let i in xAxis){
237
+              const arr ={
238
+                id:i+1,
239
+                name:xAxis[i]
240
+              }
241
+              options.push(arr)
242
+            }
243
+            this.dialyze_options = options
244
+            const option = {
245
+              xAxis: {
246
+                type: 'category',
247
+                data: xAxis,
248
+                axisLabel:{
249
+                  interval:0,
250
+                }
251
+              },
252
+              yAxis: {
253
+                type: 'value'
254
+              },
255
+              series: [
256
+                {
257
+                  data:yAxis ,
258
+                  type: 'bar',
259
+                  barWidth: '25%',
260
+                  label: {
261
+                    normal: {
262
+                      show: true,
263
+                      position: 'top',
264
+                      formatter: '{c}',
265
+                      textStyle:{
266
+                        color: 'black',//字体颜色
267
+                        fontSize: 13//字体大小
268
+                      }
269
+                    },
270
+                  },
271
+                  itemStyle:{
272
+                    normal:{
273
+                      color:function (params){
274
+                        // const colorarr=['#FFA333','#A155E8','#6D91FF','#A233A2'];
275
+                        var colorarr = [["#A9E0F3", "#9FBDFC"],["#FFD7C0", "#FF9994"]]
276
+                        var index = params.dataIndex;
277
+                        if (params.dataIndex >= colorarr.length) {
278
+                          index = params.dataIndex % colorarr.length;
279
+                        }
280
+                        return new echarts.graphic.LinearGradient(0, 0, 0, 1, [
281
+                          { offset: 0, color: colorarr[index][0] },
282
+                          // { offset: 0.5, color: colorList[index][1] },
283
+                          { offset: 1, color: colorarr[index][1] }
284
+                        ]);
285
+                      }
286
+                    }
287
+                  }
288
+                }
289
+              ]
290
+            }
291
+            myChart.setOption(option);
292
+            myChart.on('click',params =>{
293
+              this.dialyze_dialog = true
294
+              console.log('vvvvv',params);
295
+              this.Getdialyzerdetail(params.name)
296
+            })
297
+          }
298
+
299
+        })
300
+
301
+      },
302
+      // 导出excel
303
+      exportExcel(){
304
+        let tableData = [
305
+          ['序号', '透析号', '患者姓名', '透析日期','透析模式', '透析器']//导出表头
306
+        ]
307
+        this.tableData.forEach((item,index) =>{
308
+          let rowdata=[]
309
+          rowdata=[
310
+            item.index,
311
+            item.dialysis_no,
312
+            item.name,
313
+            item.date,
314
+            item.mode_name,
315
+            item.dialyszers,
316
+          ]
317
+          tableData.push(rowdata)
318
+        })
319
+        let workSheet = XLSX.utils.aoa_to_sheet(tableData);
320
+        let bookNew = XLSX.utils.book_new();
321
+        XLSX.utils.book_append_sheet(bookNew, workSheet, '透析器使用统计') // 工作簿名称
322
+        let name = '透析器使用统计'+ '.xlsx'
323
+        XLSX.writeFile(bookNew, name) // 保存的文件名
324
+      },
325
+      // 查询
326
+      sete_click(){
327
+        this.getecharts()
328
+      },
329
+      // 详情查询
330
+      deil_click(){
331
+        this.Getdialyzerdetail(this.getdialyze(this.dialyze_value))
332
+      },
333
+       // 下载
334
+      Download_click(){
335
+        const options ={
336
+          allowTaint: true,
337
+          useCORS: true
338
+        }
339
+        html2canvas(this.$refs.mychart,options).then(canvas =>{
340
+          // const imageSrc = canvas.toDataURL();
341
+          const imageUrl = canvas.toDataURL("image/png");
342
+          // console.log('5555',imageUrl);
343
+        //   // const base = this.url.split(',')[1]
344
+        //   // console.log('2222',base);
345
+          const blob = this.dataURLtoBlob(imageUrl)
346
+          // console.log('4444',blob);
347
+          const url = URL.createObjectURL(blob);
348
+          // const file = (this.url).blob();
349
+          // console.log('1111',url);
350
+          var link= document.createElement("a");
351
+        //   //将生成的图片url赋值给a标签的href属性
352
+          link.href = url;
353
+        //   //设置下载的文件名
354
+          link.download = "透析器使用统计.jpg";
355
+          // // 将a标签插入dom中
356
+          console.log('link',link);
357
+          document.body.appendChild(link);
358
+          //模拟点击事件触发下载
359
+          link.click();
360
+          // 完成之后销毁创建的a标签
361
+          document.body.removeChild(link);
362
+
363
+        })
364
+      },
365
+      // 选择日期
366
+      datachange(eve){
367
+        if(eve ==1){
368
+          this.start_date = this.getPreviousDate(7)
369
+          this.end_date = this.getTime(new Date())
370
+        }else if(eve==2){
371
+          this.start_date = this.getFirstDayOfWeek(new Date())
372
+          this.end_date = this.getTime(new Date())
373
+          console.log('this.start_date', this.start_date);
374
+        }else if(eve ==3){
375
+          var date=new Date()
376
+          date.setDate(date.getDate()-7 - date.getDay() + 1);
377
+          var m =''
378
+          var d = ''
379
+          if(date.getMonth() + 1<10){
380
+            m = '0'+(date.getMonth() + 1)
381
+          }else{
382
+             m = date.getMonth() + 1
383
+          }
384
+          if(date.getDate()<10){
385
+             d = '0'+date.getDate()
386
+          }else{
387
+            d = date.getDate()
388
+          }
389
+          // this.start_date = date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate() ;
390
+          this.start_date = date.getFullYear() + "-" + m + "-" + d ;
391
+          date.setDate(date.getDate() +6);
392
+          var mm = ''
393
+          var dd = ''
394
+          if(date.getMonth() + 1<10){
395
+            mm = '0'+(date.getMonth() + 1)
396
+          }else{
397
+            mm = date.getMonth() + 1
398
+          }
399
+          if(date.getDate()<10){
400
+            dd = '0'+date.getDate()
401
+          }else{
402
+            dd = date.getDate()
403
+          }
404
+          // if(date.getMonth() + 1<10)
405
+          // this.end_date = date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate();
406
+          this.end_date = date.getFullYear() + "-" + mm + "-" + dd ;
407
+          console.log('this.end_date',this.end_date);
408
+
409
+        }else if(eve ==4){
410
+          this.start_date = this.getFirstDayOfMonth(new Date())
411
+          this.end_date = this.getTime(new Date())
412
+        }else if(eve ==5){
413
+          this.getLastMonthFirstDay()
414
+          this.getLastMonthLastDay()
415
+        }else if(eve == 6){
416
+          this.start_date = this.getFirstDayOfYear(new Date())
417
+          this.end_date = this.getTime(new Date())
418
+        }else if(eve == 7){
419
+          this.getLastYearFirstDay()
420
+          this.getLastYearLastDay()
421
+        }
422
+        console.log('eve',eve);
423
+      },
424
+      // 详情数据源
425
+      Getdialyzerdetail(name){
426
+        const params={
427
+          dialyzer:name,
428
+          start_date:this.start_date,
429
+          end_date:this.end_date,
430
+          page:this.currentPage,
431
+          limit:this.limit,
432
+        }
433
+        Getdialyzerdetail(params).then(response =>{
434
+          if(response.data.state == 1){
435
+            const list = response.data.data.prescriptions
436
+            const table=[]
437
+            list.forEach((item,index)=>{
438
+              const obj ={
439
+                index:index+1,
440
+                dialysis_no:item.patient.dialysis_no,
441
+                name:item.patient.name,
442
+                date:this.getTime(item.record_date),
443
+                mode_name:this.getmode(item.mode_id),
444
+                dialyszers:item.dialysis_dialyszers +'  '+ item.dialysis_irrigation+'  '+item.dialysis_strainer
445
+                // dialyszers:item.dialysis_dialyszers || item.dialysis_irrigation || item.dialysis_strainer
446
+              }
447
+              table.push(obj)
448
+            })
449
+            this.tableData = table
450
+            this.total = response.data.data.total
451
+          }
452
+          console.log('77777',response);
453
+        })
454
+      },
455
+       // 首先定义一个getPreviousDate函数,方便调用
456
+      getPreviousDate(numOfDays) {
457
+        var date = new Date();
458
+        date.setDate(date.getDate() - numOfDays);
459
+        var year = date.getFullYear();
460
+        if(date.getMonth() + 1<10){
461
+          var month = '0'+(date.getMonth() + 1);
462
+        }else{
463
+          var month = date.getMonth() + 1;
464
+        }
465
+
466
+        if(date.getDate()<10){
467
+          var day = '0'+date.getDate();
468
+        }else{
469
+          var day = date.getDate();
470
+        }
471
+        return year + "-" + month + "-" + day;
472
+      },
473
+      // 本周
474
+      getFirstDayOfWeek(date){
475
+        var weekday = date.getDay()
476
+        date.setDate(date.getDate()-weekday+1);//往前算(weekday-1)天,年份、月份会自动变化
477
+        return this.timeFormat(date);
478
+      },
479
+      // 本月
480
+      getFirstDayOfMonth (date) {
481
+        date.setDate(1);
482
+        return this.timeFormat(date);
483
+      },
484
+       //上个月第一天
485
+      getLastMonthFirstDay() {
486
+          var date = new Date();
487
+          date.setDate(0);
488
+          var y = date.getFullYear(); //获取年份
489
+          var m = date.getMonth() + 1; //获取月份
490
+          m = m < 10 ? "0" + m : m;
491
+          this.start_date = [y, m, '01'].join("-")
492
+          // return [y, m, '01'].join("-");
493
+      },
494
+      // 上个月最后一天
495
+      getLastMonthLastDay() {
496
+          var date = new Date();
497
+          date.setDate(0);
498
+          var y = date.getFullYear(); //获取年份
499
+          var m = date.getMonth() + 1; //获取月份
500
+          var d = new Date(y, m, 0).getDate(); //获取当月最后一日
501
+          m = m < 10 ? "0" + m : m; //月份补 0
502
+          d = d < 10 ? "0" + d : d; //日数补 0
503
+          this.end_date = [y, m, d].join("-")
504
+          // return [y, m, d].join("-");
505
+      },
506
+      // 本年
507
+      getFirstDayOfYear (date) {
508
+        date.setDate(1);
509
+        date.setMonth(0);
510
+        return this.timeFormat(date);
511
+      },
512
+      // 上一年第一天
513
+      getLastYearFirstDay() {
514
+          let date = new Date();
515
+         const year= date.setFullYear(date.getFullYear() - 1); // 设置年份为前一年
516
+         const start_month= date.setMonth(0); // 设置月份为1月(注意月份是从0开始的)
517
+         const start_day = date.setDate(1); // 设置日期为1日
518
+        //  const last_month = date.setMonth(11); // 设置月份为12月
519
+        //  const last_day = date.setDate(0); // 设置日期为0,这将自动设置为该月的最后一天
520
+        //  this.start_date = year+ "-" +start_month+ "-" +start_day
521
+         this.start_date = this.getTime(start_day)
522
+        //  return this.start_date
523
+      },
524
+      // 上一年最后一天
525
+      getLastYearLastDay() {
526
+          let date = new Date();
527
+          const year= date.setFullYear(date.getFullYear() - 1); // 设置年份为前一年
528
+          const last_month = date.setMonth(12); // 设置月份为12月
529
+          const last_day = date.setDate(0);// 设置日期为0,这将自动设置为该月的最后一天
530
+          // this.end_date =  year+ "-" +last_month+ "-" +last_day
531
+          this.end_date = this.getTime(last_day)
532
+          console.log('this.end_date',this.end_date);
533
+          // return this.end_date;
534
+      },
535
+      // 日期格式化
536
+      timeFormat(date) {
537
+          if (!date || typeof(date) === "string") {
538
+            this.error("参数异常,请检查...");
539
+          }
540
+          var y = date.getFullYear(); //年
541
+          if(date.getMonth() + 1<10){
542
+            var m ='0'+(date.getMonth() + 1); //月
543
+          }else{
544
+            var m =date.getMonth() + 1; //月
545
+          }
546
+          if(date.getDate() + 1<10){
547
+            var d ='0'+date.getDate(); //日
548
+          }else{
549
+            var d = date.getDate(); //日
550
+          }
551
+          // var d = date.getDate(); //日
552
+
553
+          return y + "-" + m + "-" + d;
554
+      },
555
+      handleCurrentChange(val){
556
+        this.currentPage = val
557
+        this.Getdialyzerdetail(this.getdialyze(this.dialyze_value))
558
+      },
559
+      handleSizeChange(val){
560
+        this.limit = val
561
+        this.Getdialyzerdetail(this.getdialyze(this.dialyze_value))
562
+      },
563
+      // 透析模式
564
+      getmode(ids){
565
+        const modes=this.modearr
566
+        for(let i in modes){
567
+          if(ids == modes[i].id){
568
+            return modes[i].name
569
+          }
570
+        }
571
+      },
572
+       // 转换时间
573
+      getTime(val) {
574
+        if(val < 0){
575
+          return ""
576
+        }
577
+        if(val == ""){
578
+          return ""
579
+        }else {
580
+          return uParseTime(val, '{y}-{m}-{d}')
581
+        }
582
+      },
583
+      dataURLtoBlob(dataURL) {
584
+        const arr = dataURL.split(',');
585
+        const mime = arr[0].match(/:(.*?);/)[1];
586
+        const bstr = atob(arr[1]);
587
+        let n = bstr.length;
588
+        const u8arr = new Uint8Array(n);
589
+        while (n--) {
590
+          u8arr[n] = bstr.charCodeAt(n);
591
+        }
592
+        return new Blob([u8arr], { type: mime });
593
+      },
594
+      // 全部透析器
595
+      Getdialyzerconfig(){
596
+        Getdialyzerconfig().then(response =>{
597
+          console.log('666666',response);
598
+        })
599
+      },
600
+      getdialyze(val){
601
+        const option = this.dialyze_options
602
+        for(let i in option){
603
+          if(val == option[i].id){
604
+            return option[i].name
605
+          }
606
+        }
607
+      }
608
+    },
609
+    mounted(){
610
+      this.getecharts()
611
+    },
612
+    created(){
613
+      this.start_date = this.getFirstDayOfMonth(new Date())
614
+      this.Getdialyzerconfig()
615
+    },
616
+
617
+  }
618
+</script>

+ 276 - 0
src/xt_pages/Dialysisanalysis/weightblood/index.vue View File

@@ -0,0 +1,276 @@
1
+<!-- 其他指标 -->
2
+<template>
3
+  <div class="main-contain">
4
+    <div class="position">
5
+<!--        <bread-crumb :crumbs="crumbs"></bread-crumb>-->
6
+    </div>
7
+    <div class="app-container">
8
+      <div class="page_patientControlAnalysis">
9
+        <div class="photos">
10
+          <div v-for="(item,index) in indicators" :key="index"  @click="echart_click(item)"
11
+            style="width: 280px;height: 235px;border:1px solid gainsboro;border-radius: 8px;margin: 0 0 30px 28px"
12
+          >
13
+            <!-- <div v-if="" class="background date_type1" style="background-repeat: no-repeat;"></div>
14
+            <div v-if="item.check_type == 1" class="background date_type2" style="background-repeat: no-repeat;"></div>
15
+            <div v-if="item.check_type == 2" class="background date_type3" style="background-repeat: no-repeat;"></div>
16
+            <p class="title">{{item.item_name}}</p> -->
17
+            <div :class="[item.sub_check_type ==1 ? 'date_type1 background' : item.sub_check_type ==2 ?'date_type2 background':item.sub_check_type ==3 ?'date_type3 background':'']" style="background-repeat: no-repeat;"></div>
18
+            <!-- <div v-if="item.check_type == 1" class="background date_type2" style="background-repeat: no-repeat;"></div>
19
+            <div v-if="item.check_type == 2" class="background date_type3" style="background-repeat: no-repeat;"></div> -->
20
+            <!-- <div v-if="item.check_type == 1" class="background date_type1" style="background-repeat: no-repeat;"></div> -->
21
+
22
+            <p class="title" style="text-align: center;">{{item.item_name}}</p>
23
+
24
+          </div>
25
+        </div>
26
+      </div>
27
+    </div>
28
+  </div>
29
+</template>
30
+
31
+<script>
32
+import BreadCrumb from '@/xt_pages/components/bread-crumb'
33
+import { getStatisticsList } from '../../../api/statistics'
34
+export default {
35
+  name:'index',
36
+  components: {
37
+      BreadCrumb,
38
+  },
39
+  data() {
40
+      return {
41
+        indicators:[],
42
+          activeName: 'first'
43
+      }
44
+  },
45
+  methods:{
46
+    getStatisticsList(){
47
+      let params = {
48
+      }
49
+      this.indicators = []
50
+      getStatisticsList(params).then(response => {
51
+        if (response.data.state == 1) {
52
+          this.indicators  =  this.indicators.concat(response.data.data.configurationlist)
53
+          console.log('444444444',this.indicators);
54
+          for(let i = 0; i < this.indicators.length; i++){
55
+            this.indicators[i]["check_type"] = 1
56
+            this.indicators[i]["sub_check_type"] = 1
57
+          }
58
+          let obj = {
59
+            "check_type":1,
60
+            "item_name":"患者干体重分析",
61
+            "sub_check_type":2
62
+          }
63
+          this.indicators.push(obj)
64
+          let obj2 = {
65
+            "check_type":2,
66
+            "item_name":"患者体重增长分析(以上次透后体重为分母)",
67
+            "sub_check_type":1
68
+          }
69
+          this.indicators.push(obj2)
70
+          let obj3 = {
71
+            "check_type":3,
72
+            "item_name":"患者体重增长分析(以干体重为分母)",
73
+            "sub_check_type":1
74
+          }
75
+          this.indicators.push(obj3)
76
+
77
+          let obj4 = {
78
+            "check_type":4,
79
+            "item_name":"患者透后体重分析",
80
+            "sub_check_type":1
81
+          }
82
+          this.indicators.push(obj4)
83
+          let obj5 = {
84
+            "check_type":5,
85
+            "item_name":"患者体重详情",
86
+            "sub_check_type":3
87
+          }
88
+          this.indicators.push(obj5)
89
+          let obj6 = {
90
+            "check_type":6,
91
+            "item_name":"患者透前血压分析",
92
+            "sub_check_type":2
93
+          }
94
+          this.indicators.push(obj6)
95
+
96
+          let obj7 = {
97
+            "check_type":7,
98
+            "item_name":"患者透后血压分析",
99
+            "sub_check_type":2
100
+          }
101
+          this.indicators.push(obj7)
102
+          let obj8 = {
103
+            "check_type":8,
104
+            "item_name":"患者血压详情",
105
+            "sub_check_type":3
106
+          }
107
+          this.indicators.push(obj8)
108
+
109
+          console.log( this.indicators)
110
+          // this.indicators.push("")
111
+        } else {
112
+          this.$message.error(response.data.msg)
113
+        }
114
+      })
115
+    },
116
+    echart_click(item){
117
+      if(item.check_type == 1){
118
+        this.$router.push('/Dialysisanalysis/qualitycontrol/weightblood/dry_weight')
119
+      }else if(item.check_type == 2){
120
+        this.$router.push('/Dialysisanalysis/qualitycontrol/weightblood/list_denominator')
121
+      }else if (item.check_type == 3){
122
+        this.$router.push('/Dialysisanalysis/qualitycontrol/weightblood/dry_denominator')
123
+      }else if (item.check_type == 4){
124
+        this.$router.push('/Dialysisanalysis/qualitycontrol/weightblood/dialyze_after')
125
+      } else if(item.check_type == 5){
126
+        this.$router.push('/Dialysisanalysis/qualitycontrol/weightblood/weight_table')
127
+      }else if (item.check_type == 6){
128
+        this.$router.push('/Dialysisanalysis/qualitycontrol/weightblood/before_Blood')
129
+      }else if (item.check_type == 7){
130
+        this.$router.push('/Dialysisanalysis/qualitycontrol/weightblood/after_Blood')
131
+      }else if(item.check_type == 8){
132
+        this.$router.push('/Dialysisanalysis/qualitycontrol/weightblood/blood_table')
133
+      }
134
+     
135
+      
136
+      console.log('item',item);
137
+    }
138
+    // jump(project_id, item_id,project_type){
139
+    //   this.$router.push('/Dialysisanalysis/qualitycontrol/Indicatorsdetail?project_id='+project_id+"&item_id="+item_id+"&project_type="+parseInt(project_type))
140
+    // },
141
+    // handleClick(tab, event) {
142
+    //   console.log(tab, event);
143
+    // },
144
+    // echart_click(item){
145
+    //   // if(item.check_type == 1){
146
+    //   //   if(item.sub_check_type == 1){
147
+    //   //     this.$router.push('/Dialysisanalysis/qualitycontrol/Indicatorsdetail?project_id='+item.inspection_major+"&item_id="+item.inspection_minor+"&project_type="+parseInt(item.id))
148
+
149
+    //   //     // this.$router.push('/Dialysisanalysis/qualitycontrol/otherIndicators/components/columnarTotal')
150
+
151
+    //   //   }else if(item.sub_check_type == 2){
152
+    //   //     this.$router.push('/Dialysisanalysis/qualitycontrol/platelets')
153
+    //   //   }
154
+    //   // }else if(item.check_type == 2){
155
+    //   //   this.$router.push('/Dialysisanalysis/qualitycontrol/summary')
156
+    //   // }
157
+
158
+
159
+    // }
160
+  },
161
+  created(){
162
+  this.getStatisticsList()
163
+
164
+}
165
+}
166
+</script>
167
+
168
+<style lang="scss" scoped>
169
+
170
+.page_patientControlAnalysis{
171
+.background{
172
+  height: 180px;
173
+  width: 100%;
174
+  background-repeat:no-repeat;
175
+}
176
+.date_type1{
177
+  background: url('../../../assets/img/zhuzhuantu.png');
178
+}
179
+.date_type2{
180
+  background: url('../../../assets/img/bingzhuantua.png');
181
+}
182
+.date_type3{
183
+  background: url('../../../assets/img/biaoge.png');
184
+}
185
+
186
+.title{
187
+  font-size: 18px;
188
+  margin: 15px 10px;
189
+  color: #333333;
190
+  text-overflow: ellipsis;
191
+  overflow: hidden;
192
+  white-space: nowrap;
193
+}
194
+.tag {
195
+  margin-left: 10px;
196
+  height: 82px;
197
+  overflow: auto;
198
+}
199
+.use {
200
+  font-size: 14px;
201
+  color: #999;
202
+  margin-left: 10px;
203
+}
204
+// .shoucang{
205
+//   width: 20px;
206
+//   height: 20px;
207
+//   margin-right: 15px;
208
+//   float: right;
209
+//   background:url('../../../assets/img/xingixnghuise.png')
210
+// }
211
+.tags{
212
+  font-size: 14px;
213
+  font-family: Microsoft YaHei;
214
+  color: #477ac5;
215
+  background: #edf4ff;
216
+  margin-right: 3px;
217
+  margin-top: 3px;
218
+  padding: 1px 6px;
219
+  border-radius: 5px;
220
+}
221
+.photos{
222
+  display: flex;
223
+  justify-content: flex-start;
224
+  flex-wrap: wrap;
225
+}
226
+
227
+}
228
+// .page_patientControlAnalysis {
229
+
230
+// .pointTitle {
231
+//   font-size: 13px;
232
+// }
233
+
234
+// .chartTitle {
235
+//   font-size: 16px;
236
+//   font-weight: bold;
237
+//   color: #000000;
238
+// }
239
+
240
+// .point {
241
+//   width: 13px;
242
+//   height: 13px;
243
+//   background: linear-gradient(
244
+//       0deg,
245
+//       rgba(169, 224, 243, 1),
246
+//       rgba(159, 189, 252, 1)
247
+//   );
248
+//   border-radius: 7px;
249
+//   margin-right: 8px;
250
+// }
251
+
252
+// .pointTitle {
253
+//   font-size: 13px;
254
+// }
255
+
256
+// }
257
+
258
+</style>
259
+
260
+<style lang="scss">
261
+// .page_patientControlAnalysis {
262
+
263
+// .el-form-item {
264
+//   margin-bottom: 0;
265
+// }
266
+
267
+// .cell {
268
+//   text-align: center;
269
+// }
270
+
271
+// ::-webkit-scrollbar {
272
+//   height: 15px !important;
273
+// }
274
+
275
+// }
276
+</style>