Browse Source

Merge branch 'master' of http://8.136.199.33:3000/eta_front/eta_mobile_front

Karsa 3 months ago
parent
commit
3262df8694
1 changed files with 144 additions and 8 deletions
  1. 144 8
      src/hooks/chart/render.js

+ 144 - 8
src/hooks/chart/render.js

@@ -1,7 +1,7 @@
 // 图渲染逻辑模块
 
 import {onMounted,ref,nextTick,reactive} from 'vue'
-import {chartDefaultOpts,scatterXAxis,basicYAxis,basicXAxis,leadUnitEnMap,relevanceUnitEnMap} from './config'
+import {chartDefaultOpts,scatterXAxis,basicYAxis,basicXAxis,leadUnitEnMap,relevanceUnitEnMap,seasonOptions} from './config'
 import Highcharts from 'highcharts/highstock';
 import HighchartsFormat from 'highcharts';
 import HighchartsMore from 'highcharts/highcharts-more';
@@ -823,7 +823,8 @@ function setSplineOpt(e){
 //季节图
 function setSeasonOpt(e){
     axisLimitState.leftIndex=0
-    axisLimitState.rightIndex=-1
+    const {RightAxis:SeasonRightConfig={}} = e.DataResp||{}
+    axisLimitState.rightIndex=SeasonRightConfig.IsShow?1:-1
     axisLimitState.rightTwoIndex=-1
 
      /* 主题样式*/
@@ -843,6 +844,7 @@ function setSeasonOpt(e){
     // 跟颜色对应
     chartTheme && (chartTheme.lineOptionList=chartTheme.lineOptionList.reverse().slice(-chartDataHandle.length))
     // if(calendarType==='公历'){
+        //常规左轴
         chartDataHandle.forEach((item,index)=>{
              //预测指标配置
             let predict_params =  data.EdbInfoCategoryType === 1 ? getSeasonPredictParams(item.CuttingDataTimestamp) : {};
@@ -875,15 +877,96 @@ function setSeasonOpt(e){
             series.push(seriesItem)
         })
     chartData.colors = colorsArr.slice(-chartDataHandle.length)
+
+    //同期上下限/均线/标准差
+    const {MaxMinLimits={},SamePeriodAverage={},SamePeriodStandardDeviation={}} = e.DataResp||{}
+    if(MaxMinLimits.IsShow&&MaxMinLimits.List&&MaxMinLimits.List.length){
+        let serieItem = {
+            type:'arearange',//上下限是一个范围
+            data:[],
+            name:MaxMinLimits.Legend||'同期上下限',
+            color:MaxMinLimits.Color||'#075EEE' ,
+            fillOpacity:parseRgbaColor(MaxMinLimits.Color||'')>0.75?0.75:parseRgbaColor(MaxMinLimits.Color||'') //透明度最高0.75 
+        }
+        MaxMinLimits.List.forEach(item=>{
+            serieItem.data.push([item.DataTimestamp,item.MinValue,item.MaxValue])
+        })
+        series.push(serieItem)
+    }
+    if(SamePeriodAverage.IsShow&&SamePeriodAverage.List){
+        let serieItem = {
+            type:'line',
+            data:[],
+            lineWidth:SamePeriodAverage.LineWidth,
+            dashStyle:SamePeriodAverage.LineType,
+            name:SamePeriodAverage.Legend||'同期均值',
+            color:SamePeriodAverage.Color||'#075EEE'
+        }
+        SamePeriodAverage.List.forEach(item=>{
+            serieItem.data.push([item.DataTimestamp,item.Value])
+        })
+        series.push(serieItem)
+    }
+    if(SamePeriodStandardDeviation.IsShow&&SamePeriodStandardDeviation.List){
+        let serieItem = {
+            type:'arearange',//标准差也是一个范围
+            data:[],
+            name:SamePeriodStandardDeviation.Legend||'同期标准差',
+            color:SamePeriodStandardDeviation.Color||'#075EEE',
+            fillOpacity:parseRgbaColor(SamePeriodStandardDeviation.Color||'')>0.75?0.75:parseRgbaColor(SamePeriodStandardDeviation.Color||'')
+        }
+        SamePeriodStandardDeviation.List.forEach(item=>{
+            serieItem.data.push([item.DataTimestamp,item.MinValue,item.MaxValue])
+        })
+        series.push(serieItem)
+    }
+    //右轴
+    if(SeasonRightConfig.IsShow){
+        //右轴的设置
+        let serieConfig = SeasonRightConfig.Style==='column'?{
+            //柱形
+            type:'column',
+            color:SeasonRightConfig.ChartColor
+        }:{
+            //标记点
+            type:'spline',
+            lineWidth:SeasonRightConfig.LineWidth,
+            dashStyle:SeasonRightConfig.LineStyle,
+            color:SeasonRightConfig.IsConnected?SeasonRightConfig.LineColor:'rgba(255, 255, 255, 0)',//没有连线颜色设置为透明
+            marker:{
+                enabled:true,
+                symbol:SeasonRightConfig.Shape,
+                fillColor:SeasonRightConfig.ChartColor,
+                radius:SeasonRightConfig.Size
+            },
+        }
+        let serieItem = {
+            ...serieConfig,
+            name:SeasonRightConfig.Legend||'',
+            data:[],
+            yAxis:1,
+        }
+        const DataList = (SeasonRightConfig.IndicatorType===1?SeasonRightConfig.EdbInfoList[0].DataList:e.EdbInfoList[1]?.DataList)||[]
+        DataList.forEach(item=>{
+            serieItem.data.push([item.DataTimestamp,item.Value])
+        })
+        series.push(serieItem)
+    }
+
     //获取上下限
-    let minLimit = 0,maxLimit = 0
-    //非ETA图库不使用自定义上下限
+    let minLimit = 0,maxLimit = 0,rightMin = 0,rightMax = 0
+    //非ETA图库不使用自定义上下限 非ETA图库的季节性图也不能设置右轴
     if(!useSelfLimit){
         minLimit = data.MinData
         maxLimit = data.MaxData
     }else{
         minLimit = axisLimitState.leftMin||0
         maxLimit = axisLimitState.leftMax||0
+        //右轴上下限设置
+        if(axisLimitState.rightIndex!==-1){
+            rightMin = axisLimitState.rightMin||0
+            rightMax = axisLimitState.rightMax||0
+        }
     }
     const textZh = data.ConvertUnit||data.Unit
     const textEn = data.ConvertEnUnit||data.UnitEn||data.ConvertUnit||data.Unit
@@ -932,7 +1015,41 @@ function setSeasonOpt(e){
         tickPixelInterval: 50,
         // chartEdbInfo:item//指标数据
     }]
-
+    //如果有右轴,yAxis加上右轴
+    if(SeasonRightConfig.IsShow){
+        const rightEdb = (SeasonRightConfig.IndicatorType===1?SeasonRightConfig.EdbInfoList[0]:e.EdbInfoList[1])||{Unit:''}
+        //左轴同比:text为空或% 右轴指标:取指标单位
+        if(SeasonRightConfig.IndicatorType===1){
+            rightEdb.Unit = SeasonRightConfig.NumFormat===1?'%':''
+        }else{
+            rightEdb.Unit = e.EdbInfoList[1]&&(e.EdbInfoList[1].ConvertUnit||e.EdbInfoList[1].Unit)||''
+        }
+        yAxis.push({
+            ...seasonOptions.yAxis,
+            opposite: true,//右轴
+            labels: {
+                align: 'center',
+                y:5,
+                style: {
+                  ...chartTheme&&chartTheme.yAxisOptions.style
+                }
+              },
+              title: {
+                text: rightEdb.Unit||'',
+                style:{
+                  ...chartTheme&&chartTheme.yAxisOptions.style
+                },
+                align: 'high',
+                rotation: 0,
+                y: -5,
+                x: 0,
+                textAlign: 'right',
+                reserveSpace: false,
+              },
+              max: Number(rightMax),
+              min: Number(rightMin),
+        })
+    }
     chartData.series=series
     chartData.yAxis=yAxis
     // chartData.rangeSelector=rangeSelector
@@ -2333,9 +2450,15 @@ function setRadarChart({DataResp,EdbInfoList,ChartInfo}) {
     }
 }
 
+
+//获取RGBA的透明度
+function parseRgbaColor(color='rgba(51, 51, 51, 1)'){
+    const arr = color.match(/(\d(\.\d+)?)+/g) || ['','','',1];
+    return parseFloat(arr[3]||1)
+}
 /* ----自定义上下限相关--- */
 /* 计算y轴上下限 */
-function calcYAxislimit(tableData=[],ChartInfo){
+function calcYAxislimit(tableData=[],ChartInfo,DataResp={}){
     //散点图单独处理
     if(ChartInfo.ChartType===5){
         if(tableData[1]){
@@ -2373,6 +2496,19 @@ function calcYAxislimit(tableData=[],ChartInfo){
         axisLimitState.rightTwoMin = Min
         axisLimitState.rightTwoMax = Max
     }
+    //季节性图-右轴单独处理
+    if(ChartInfo.ChartType===2){
+        if(DataResp.RightAxis&&DataResp.RightAxis.IsAdd&&DataResp.RightAxis.IsShow){
+            if(DataResp.RightAxis.IndicatorType===1){
+                axisLimitState.rightMin = DataResp.RightAxis.EdbInfoList[0].MinData||0
+                axisLimitState.rightMax = DataResp.RightAxis.EdbInfoList[0].MaxData||0
+            }else{
+                axisLimitState.rightMin = tableData[1].MinData||0
+                axisLimitState.rightMax = tableData[1].MaxData||0
+            }
+            
+        }
+    }
 }
 function calcLimit(arr) {
     return {
@@ -2381,7 +2517,7 @@ function calcLimit(arr) {
     }
 }
 //图表详情-设置图表上下限
-function setLimitData({EdbInfoList,ChartInfo}){
+function setLimitData({EdbInfoList,ChartInfo,DataResp}){
     const {
         //左右轴极值字段 
         LeftMin=0,LeftMax=0,
@@ -2400,7 +2536,7 @@ function setLimitData({EdbInfoList,ChartInfo}){
         checkLimit(EdbInfoList,ChartInfo)
         console.log('check',axisLimitState.leftMin,axisLimitState.leftMax)
     }else{
-        calcYAxislimit(EdbInfoList,ChartInfo)
+        calcYAxislimit(EdbInfoList,ChartInfo,DataResp?DataResp:{})
     }
 }
 function checkLimit(tableData=[],ChartInfo){