ai-watch-app/pages/index/echarts.vue

610 lines
15 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="body-style">
<tm-nav-bar left-icon="arrow-left" :title="dataConfig[type].name" @clickLeft="back" />
<view class="flx jcsb ac" style="height: 40rpx;background-color: #fff;padding: 20rpx;">
<view class="" style="font-size: 40rpx;font-weight: bold;">
</view>
<view class="" style="color: #b8b8b8;font-size: 24rpx;">
{{time}}
</view>
</view>
<view style="height: 40rpx;background-color: #fff;">
</view>
<!-- <view class="title flx ac" style="justify-content: center;">
<view class="title-data">
{{dataConfig[type].title}}
</view>
<view class="title-unit">
{{dataConfig[type].unit}}
</view>
</view> -->
<view style=" height:600rpx;background-color: #fff;"><l-echart ref="chartRef" @finished="init"></l-echart></view>
<cankao v-if="dataConfig[type].cankaoData" :cankaoData="dataConfig[type].cankaoData" ></cankao>
<view class="box-rds " @click="goPath">
<view class="flx jcsb ac">
<view class="" style="font-size: 26rpx;">
全部数据
</view>
<view style="color: #b8b8b8;">></view>
</view>
</view>
<view class="" style="height: 20rpx;">
</view>
</view>
</template>
<script>
import * as echarts from '@/uni_modules/lime-echart/static/echarts.min'
import { mapGetters } from "vuex";
export default {
data() {
return {
time: new Date().toISOString().substring(0, 10),
type:'',
desc:'',
dataConfig:{
bloodGlucose:{
title:'123123',
name:'血糖',
color:"#fb8544",
unit:'毫摩尔/升',
cankaoData:[
{
name:'空腹/餐前',
data:[
0,3.9,6.1,15
],
adjustment:[
0.05,
0.00,
-0.05
],
max:15
},
{
name:'餐后1小时',
data:[
0,6.7,9.4,15
],
adjustment:[
0.04,
0.00,
-0.04
],
max:15
},
{
name:'餐后2小时',
data:[
0,4.4,7.8,15
],
adjustment:[
0.04,
0.00,
-0.04
],
max:15
}
]
},
bloodOxygen:{
title:'123123',
name:'血氧',
color:"#bf32fc",
unit:'%',
cankaoData:false,
},
bodyTemperature:{
title:'bodyTemperature',
name:'体温',
color:"#bf32fc",
unit:'℃',
cankaoData:false,
},
pulseReat:{
title:'123123',
name:'心率',
color:"#fd5656",
unit:'次/分',
cankaoData:false,
},
bloodLiquid:{
title:'123123',
name:'尿酸',
color:"#f00",
unit:'微摩尔/升',
cankaoData:[
{
name:'尿酸',
data:[
0,150,420,1000
],
adjustment:[
0.06,
0.00,
-0.06
],
max:1000
},
],
}
},
option:{
xAxis: {
splitLine:{
show:false
},
type:'value',
max:4,
min:0,
axisLabel: {
show: true,
splitNumber:2,
formatter: function(value, index) {
let arr = ['12am', '6am', '12pm', '6pm', '12am']
return arr[ Math.floor(index)];
}
}
},
yAxis: {
splitLine:{
show:true,
lineStyle: {
// 使用深浅的间隔色
color: ["#ccc"],
type:"dashed"
}
},
axisTick: {
show: false
},
axisLine: {
show: false // 设置y轴线不显示
},
axisLabel: {},
position:"right",
splitNumber:3
},
series: [
{
symbolSize: 5,
data:
[
// [0.5, 3.5],
// [1.2, 2.4],
// [1.4, 2.8],
// [2.7, 2.4],
// [3.4, 6],
],
markLine: {
data: [
{
yAxis: 2.5, // 在 y 值为 100 的位置添加水平参考线
}
],
lineStyle:{
color:'#ccc',
cap:"butt"
},
label:{
color:'#ccc',
},
},
type: 'scatter',
}
]
},
option2: {
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
},
confine: true
},
legend: {
data: ['热度', '正面', '负面']
},
grid: {
left: 20,
right: 20,
bottom: 15,
top: 40,
containLabel: true
},
xAxis: [
{
type: 'value',
axisLine: {
lineStyle: {
color: '#999999'
}
},
axisLabel: {
color: '#666666',
}
}
],
yAxis: [
{
type: 'category',
axisTick: { show: false },
data: ['汽车之家', '今日头条', '百度贴吧', '一点资讯', '微信', '微博', '知乎'],
axisLine: {
lineStyle: {
color: '#999999'
}
},
axisLabel: {
color: '#666666'
}
}
],
series: [
{
name: '热度',
type: 'bar',
label: {
normal: {
show: true,
position: 'inside'
}
},
data: [300, 270, 340, 344, 300, 320, 310],
},
{
name: '正面',
type: 'bar',
stack: '总量',
label: {
normal: {
show: true
}
},
data: [120, 102, 141, 174, 190, 250, 220]
},
{
name: '负面',
type: 'bar',
stack: '总量',
label: {
normal: {
show: true,
position: 'left'
}
},
data: [-20, -32, -21, -34, -90, -130, -110]
}
]
},
}
},
onLoad(e) {
this.type = e.type
this.desc = e.desc || ''
// this.getDataList()
},
computed: {
...mapGetters({
getActiceDevice: "api/getActiceDevice"
})
},
methods: {
async init() {
this.chart = await this.$refs.chartRef.init(echarts);
let option = await this.getDataList();
this.chart.setOption(option)
},
back() {
uni.navigateBack({
delta: 1
})
},
goPath(){
uni.navigateTo({
url:'./detail?type='+this.type +(this.desc == ''?'':'&desc='+this.desc)
})
},
makeHour(hours){
return Math.floor(hours/6); // 使用%运算符取余确保结果是0-4的范围
},
makeMinute(minute){
return minute/60;
},
makeFloatHoursMinutes(hours, minutes) {
let total = hours * 3600 + minutes * 60;
let floatData = total / 86400 * 4
return floatData.toFixed(2);
},
async getDataList(){
let res = await this.$store.dispatch('api/getDeviceListDays', {
type: (this.type == 'step'?'step_split':this.type),
// type: (this.type),
device_real_time: this.time,
device_id:this.getActiceDevice.device_id
})
return this.makeOptionConfig(res.data);
},
makeOptionConfig(data){
let echartsData = [];
let sum = 0;
let max = 0;
let min = 0;
let avg = 0;
let len = 0;
switch(this.type){
case 'bodyTemperature':
data.map((v,i) => {
let timeArr = v.hour_minute.split(':');
let dataMsg = parseFloat(v.data_msg);
let floatData = this.makeFloatHoursMinutes(timeArr[0],timeArr[1])
echartsData.push({value:[floatData,dataMsg],itemStyle: {color: this.dataConfig[this.type].color}})
sum += dataMsg
if(max == 0 || max < dataMsg){
max = dataMsg
}
if(min == 0 || max > dataMsg){
min = dataMsg
}
})
avg = sum / data.length
avg = parseFloat(avg.toFixed(2))
this.option.series[0].data = echartsData
this.option.series[0].markLine.data[0].yAxis = avg
this.option.series[0].markLine.lineStyle.color = this.dataConfig[this.type].color
this.option.series[0].markLine.label.color = this.dataConfig[this.type].color
this.option.yAxis.min = 32;
this.option.yAxis.max = max + 4;
this.option.title = {
text :min + '-' + max,
subtext: '毫摩尔/升',
left: 'center'
};
this.dataConfig.bodyTemperature.title = min + '-' + max
break;
case 'bloodOxygen':
data.map((v,i) => {
let timeArr = v.hour_minute.split(':');
let dataMsg = parseFloat(v.data_msg);
let floatData = this.makeFloatHoursMinutes(timeArr[0],timeArr[1])
echartsData.push({value:[floatData,dataMsg],itemStyle: {color: this.dataConfig[this.type].color}})
sum += dataMsg
if(max == 0 || max < dataMsg){
max = dataMsg
}
if(min == 0 || max > dataMsg){
min = dataMsg
}
})
avg = sum / data.length
avg = parseFloat(avg.toFixed(2))
this.option.series[0].data = echartsData
this.option.series[0].markLine.data[0].yAxis = avg
this.option.series[0].markLine.lineStyle.color = this.dataConfig[this.type].color
this.option.series[0].markLine.label.color = this.dataConfig[this.type].color
this.option.title = {
text :min + '-' + max,
subtext: '毫摩尔/升',
left: 'center'
};
this.dataConfig.bodyTemperature.title = min + '-' + max
break;
case 'bloodGlucose':
data.map((v,i) => {
let timeArr = v.hour_minute.split(':');
let floatData = this.makeFloatHoursMinutes(timeArr[0],timeArr[1])
echartsData.push({value:[floatData,v.data_msg],itemStyle: {color: this.dataConfig[this.type].color}})
sum += v.data_msg
if(max == 0 || max < v.data_msg){
max = v.data_msg
}
if(min == 0 || max > v.data_msg){
min = v.data_msg
}
})
avg = sum / data.length
avg = parseFloat(avg.toFixed(2))
this.option.series[0].data = echartsData
this.option.series[0].markLine.data[0].yAxis = avg
this.option.series[0].markLine.lineStyle.color = this.dataConfig[this.type].color
this.option.series[0].markLine.label.color = this.dataConfig[this.type].color
this.option.title = {
text :min + '-' + max,
subtext: '毫摩尔/升',
left: 'center'
};
this.dataConfig.bloodGlucose.title = min + '-' + max
break;
data.map((v,i) => {
let dataMsg = v.data_msg;
let timeArr = v.hour_minute.split(':');
for(let i = 0;i<5;i++){
let real_data = dataMsg[i]
if(real_data <= 0){
break;
}
len += 1;
let floatData = this.makeFloatHoursMinutes(timeArr[0],parseInt( timeArr[1]) + i)
echartsData.push({value:[floatData,real_data],itemStyle: {color: this.dataConfig[this.type].color}})
sum += real_data
if(max == 0 || max < real_data){
max = real_data
}
if(min == 0 || max > real_data){
min = real_data
}
}
})
avg = sum / len
avg = parseFloat(avg.toFixed(2))
this.option.series[0].data = echartsData
this.option.series[0].markLine.data[0].yAxis = avg
this.option.series[0].markLine.lineStyle.color = this.dataConfig[this.type].color
this.option.series[0].markLine.label.color = this.dataConfig[this.type].color
this.option.title = {
text :min + '-' + max,
subtext: '%',
left: 'center'
};
this.dataConfig.bloodGlucose.title = min + '-' + max
this.option.yAxis.axisLabel.formatter = '{value}%';
this.option.yAxis.splitNumber = 3;
this.option.yAxis.min = 95;
this.option.yAxis.max = 100;
break;
case 'pulseReat':
data.map((v,i) => {
let dataMsg = v.data_msg;
let timeArr = v.hour_minute.split(':');
for(let i = 0;i<1;i++){
let real_data = dataMsg[i]
if(real_data <= 0){
break;
}
len += 1;
let floatData = this.makeFloatHoursMinutes(timeArr[0],parseInt( timeArr[1]) + i)
echartsData.push({value:[floatData,real_data],itemStyle: {color: this.dataConfig[this.type].color}})
sum += real_data
if(max == 0 || max < real_data){
max = real_data
}
if(min == 0 || max > real_data){
min = real_data
}
}
})
avg = sum / len
avg = parseFloat(avg.toFixed(2))
this.option.series[0].data = echartsData
this.option.series[0].markLine.data[0].yAxis = avg
this.option.series[0].markLine.lineStyle.color = this.dataConfig[this.type].color
this.option.series[0].markLine.label.color = this.dataConfig[this.type].color
this.option.title = {
text :min + '-' + max,
subtext: '次/分',
left: 'center'
};
this.dataConfig.bloodGlucose.title = min + '-' + max
// this.option.yAxis.axisLabel.formatter = '{value}%';
this.option.yAxis.splitNumber = 3;
this.option.yAxis.min = 30;
this.option.yAxis.max = 90;
break;
case 'bloodLiquid':
data.map((v,i) => {
let dataMsg = v.data_msg;
let real_data = dataMsg.uricAcidVal/10
let timeArr = v.hour_minute.split(':');
let floatData = this.makeFloatHoursMinutes(timeArr[0],timeArr[1])
echartsData.push({value:[floatData,real_data],itemStyle: {color: this.dataConfig[this.type].color}})
sum += real_data
if(max == 0 || max < real_data){
max = real_data
}
if(min == 0 || max > real_data){
min = real_data
}
len += 1;
})
avg = sum / len
avg = parseFloat(avg.toFixed(2))
this.option.series[0].data = echartsData
this.option.series[0].markLine.data[0].yAxis = avg
this.option.series[0].markLine.lineStyle.color = this.dataConfig[this.type].color
this.option.series[0].markLine.label.color = this.dataConfig[this.type].color
// this.option.series[0].type = 'this.dataConfig[this.type].color'
this.option.title = {
text :min + '-' + max,
subtext: '微摩尔/升',
left: 'center',
textStyle:{
fontWeight:"lighter",
fontSize:24
}
};
this.dataConfig.bloodGlucose.title = min + '-' + max
this.option.yAxis.axisLabel.formatter = function(v,i){
return v;
}
this.option.yAxis.splitNumber = 3;
this.option.yAxis.min = 0;
this.option.yAxis.max = 330;
break;
}
return this.option;
}
}
}
</script>
<style scoped="scss">
.body-style {
background-color: #f6f6f6;
}
.box-rds {
background-color: #fff;
border-radius: 40rpx;
padding: 30rpx;
margin: 20rpx;
}
.title{
background-color: #fff;
.title-data{
font-size: 60rpx;
font-weight: bold;
margin-right: 10rpx;
}
}
.flx{
display: flex;
}
.jc-end{
justify-content: end;
}
.jc-start{
justify-content: end;
}
.ac{
align-items: center;
}
.jc{
justify-content: center;
}
.jcsb{
justify-content: space-between;
}
.fd_row{
flex-direction: row;
}
</style>