xusl hace 1 año
padre
commit
23f6b9e00f

+ 48 - 0
ipfcst/ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/AccuracyPassRateDayOne.java

@@ -0,0 +1,48 @@
+package com.jiayue.ipfcst.common.data.entity;
+
+import com.jiayue.ipfcst.common.data.abst.AbstractBaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.hibernate.annotations.GenericGenerator;
+import org.springframework.core.annotation.Order;
+
+import javax.persistence.*;
+
+/**
+ * 准确率合格率
+ *
+ * @author zcl
+ * @version 1.0
+ * @since 2022/7/19 15:15
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Entity
+public class AccuracyPassRateDayOne extends AbstractBaseEntity {
+    @Id
+    @Order(1)
+    @GeneratedValue(strategy = GenerationType.AUTO, generator = "myid")
+    @GenericGenerator(name = "myid", strategy = "com.jiayue.ipfcst.common.data.entity.id.CustomIDGenerator")
+    private Integer id;
+
+    //时间
+    @Column
+    private Long time;
+
+    //短期准确率
+    @Column
+    private String shortTermAccuracy;
+
+    //短期合格率
+    @Column
+    private String shortTermPassRate;
+
+    //超短期准确率
+    @Column
+    private String ultraShortTermAccuracy;
+
+    //超短期合格率
+    @Column
+    private String ultraShortTermPassRate;
+
+}

+ 48 - 0
ipfcst/ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/AccuracyPassRateOne.java

@@ -0,0 +1,48 @@
+package com.jiayue.ipfcst.common.data.entity;
+
+import com.jiayue.ipfcst.common.data.abst.AbstractBaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.hibernate.annotations.GenericGenerator;
+import org.springframework.core.annotation.Order;
+
+import javax.persistence.*;
+
+/**
+ * 准确率合格率
+ *
+ * @author yh
+ * @version 1.0
+ * @since 2020/7/8 10:56
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Entity
+public class AccuracyPassRateOne extends AbstractBaseEntity {
+    @Id
+    @Order(1)
+    @GeneratedValue(strategy = GenerationType.AUTO, generator = "myid")
+    @GenericGenerator(name = "myid", strategy = "com.jiayue.ipfcst.common.data.entity.id.CustomIDGenerator")
+    private Integer id;
+
+    //时间
+    @Column
+    private Long time;
+
+    //短期准确率
+    @Column
+    private String shortTermAccuracy;
+
+    //短期合格率
+    @Column
+    private String shortTermPassRate;
+
+    //超短期准确率
+    @Column
+    private String ultraShortTermAccuracy;
+
+    //超短期合格率
+    @Column
+    private String ultraShortTermPassRate;
+
+}

+ 25 - 0
ipfcst/ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/repository/AccuracyPassRateDayOneRepository.java

@@ -0,0 +1,25 @@
+package com.jiayue.ipfcst.common.data.repository;
+
+
+import com.jiayue.ipfcst.common.data.entity.AccuracyPassRateDayOne;
+
+import java.util.List;
+
+/**
+ * 准确合格率仓储(日)
+ *
+ * @author zcl
+ * @version 1.0
+ * @since 2022/7/19 15:15
+ */
+public interface AccuracyPassRateDayOneRepository extends BaseRepository<AccuracyPassRateDayOne, Integer> {
+
+    /**
+     *
+     * @param time
+     * @return
+     */
+    List<AccuracyPassRateDayOne> findByTime(Long time);
+
+    List<AccuracyPassRateDayOne> findByTimeBetween(Long startTime, Long endTime);
+}

+ 24 - 0
ipfcst/ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/repository/AccuracyPassRateOneRepository.java

@@ -0,0 +1,24 @@
+package com.jiayue.ipfcst.common.data.repository;
+
+import com.jiayue.ipfcst.common.data.entity.AccuracyPassRateOne;
+
+import java.util.List;
+
+/**
+ * 准确合格率仓储
+ *
+ * @author yh
+ * @version 1.0
+ * @since 2019/8/5 9:15
+ */
+public interface AccuracyPassRateOneRepository extends BaseRepository<AccuracyPassRateOne, Integer> {
+
+    /**
+     *
+     * @param time
+     * @return
+     */
+    List<AccuracyPassRateOne> findByTime(Long time);
+
+    List<AccuracyPassRateOne> findByTimeBetween(Long startTime,Long endTime);
+}

+ 20 - 6
ipfcst/ipfcst-reportquery/src/main/frontend/router/modules/statisticsQuery.js

@@ -23,21 +23,35 @@ const statisticsQueryRouter = {
       path: 'accuracyPassRate',
       component: () => import('@/views/statisticsQuery/accuracyPassRate'),
       name: 'accuracyPassRate',
-      meta: { title: '准确率统计查询', noCache: true },
+      meta: { title: '光伏准确率统计查询', noCache: true },
       sign: 'currency'
     },
     {
-      path: 'accuracyPassRateDay',
-      component: () => import('@/views/statisticsQuery/accuracyPassRateDay'),
-      name: 'accuracyPassRateDay',
-      meta: { title: '准确率统计查询', noCache: true },
+      path: 'accuracyPassRateOne',
+      component: () => import('@/views/statisticsQuery/accuracyPassRateOne'),
+      name: 'accuracyPassRateOne',
+      meta: { title: '风电准确率统计查询', noCache: true },
       sign: 'currency'
     },
+    // {
+    //   path: 'accuracyPassRateDay',
+    //   component: () => import('@/views/statisticsQuery/accuracyPassRateDay'),
+    //   name: 'accuracyPassRateDay',
+    //   meta: { title: '准确率日统计查询', noCache: true },
+    //   sign: 'currency'
+    // },
     {
       path: 'accuracyPassRateMonth',
       component: () => import('@/views/statisticsQuery/accuracyPassRateMonth'),
       name: 'accuracyPassRateMonth',
-      meta: { title: '准确率月统计查询', noCache: true },
+      meta: { title: '光伏准确率月统计查询', noCache: true },
+      sign: 'currency'
+    },
+    {
+      path: 'accuracyPassRateMonthOne',
+      component: () => import('@/views/statisticsQuery/accuracyPassRateMonthOne'),
+      name: 'accuracyPassRateMonthOne',
+      meta: { title: '风电准确率月统计查询', noCache: true },
       sign: 'currency'
     },
     // {

+ 1106 - 0
ipfcst/ipfcst-reportquery/src/main/frontend/views/statisticsQuery/accuracyPassRateMonthOne/index.vue

@@ -0,0 +1,1106 @@
+<template>
+  <div class="chart-container" >
+    <div class="filter">
+      <div class="startTime">
+        <span class="timeText">起始时间</span>
+
+        <el-date-picker
+          v-model="startTime"
+          :clearable="false"
+          type="month"
+          value-format="timestamp"
+          placeholder="选择日期">
+        </el-date-picker>
+      </div>
+      <div class="endTime">
+        <span class="timeText">截止时间</span>
+
+        <el-date-picker
+          v-model="endTime"
+          :clearable="false"
+          type="month"
+          value-format="timestamp"
+          placeholder="选择日期">
+        </el-date-picker>
+      </div>
+      <div class="timeQuery">
+        <el-button  size="small" :loading="loading"  @click="dateQuery">查询</el-button>
+      </div>
+      <div class="timeQuery">
+        <el-button  size="small" :loading="loading"  @click="dialogVisible = true">显示设置</el-button>
+      </div>
+      <div class="toolbar"> <vxe-toolbar ref="accuracyPassRateToolBar"  export></vxe-toolbar></div>
+    </div>
+
+    <el-dialog
+      title="选择数据类型"
+      :visible.sync="dialogVisible"
+      :before-close="this.cancelDisplay"
+      width="50%">
+      <div class="drag-box-item">
+        <div class="item-title">隐藏</div>
+        <draggable class="list-group" :list="listh" group="people">
+          <transition-group id="done" tag="div" class="item-ul">
+            <div
+              v-for="(element, index) in listh"
+              :key="element.value"
+              class="drag-list"
+            >
+              {{ element.key }}
+            </div>
+          </transition-group>
+        </draggable>
+
+      </div>
+      <div class="drag-box-item">
+        <div class="item-title">展示</div>
+
+        <draggable class="list-group" :list="lists" group="people">
+          <transition-group id="wdtodo" tag="div" class="item-ul">
+            <div
+              v-for="(element, index) in lists"
+              :key="element.value"
+              class="drag-list"
+            >
+              {{ element.key }}
+            </div>
+          </transition-group>
+        </draggable>
+      </div>
+      <span slot="footer" class="dialog-footer">
+    <el-button @click="this.cancelDisplay" style="color: #1f2d3d">取 消</el-button>
+    <el-button type="primary" style="color: #1f2d3d" @click="this.changeDisplay">确 定</el-button>
+  </span>
+    </el-dialog>
+
+    <div style="width: 100%;height: 90%">
+      <div class="tableContent">
+        <vxe-grid
+          id="accuracyPassRateTable"
+          ref="accuracyPassRateRef"
+          border
+          export-config
+          :loading="loading"
+          @sort-change="sortChangeEvent"
+          :auto-resize="true"
+          highlight-hover-row
+          :header-cell-style="styleStr"
+          max-height="90%"
+          :cell-style="styleTableStr"
+          align="center"
+          :data="this.tableData.slice((currentPage-1)*pageSize,currentPage*pageSize)"
+          :columns="tableColumn"/>
+
+        <div class="rtPageturning">
+          <vxe-pager
+            background
+            :loading="loading"
+            :current-page.sync="currentPage"
+            :page-size.sync="pageSize"
+            :total="total"
+            @page-change="handlePageChange"
+            :layouts="['PrevJump', 'PrevPage', 'JumpNumber', 'NextPage', 'NextJump', 'Sizes', 'FullJump', 'Total']">
+          </vxe-pager>
+        </div>
+      </div>
+      <div style="display: flex;justify-content:space-around;width: 100%;height: 50%">
+        <div class="accuracyPassRate one"  id="rtChats"/>
+        <div class="accuracyPassRate two"  id="statisticsChats"/>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+
+import resize from '../../../components/Charts/mixins/resize'
+import draggable from 'vuedraggable'
+import echarts from "echarts";
+export default {
+  name: 'accuracyPassRate',
+  components: {draggable},
+  mixins: [resize],
+  data(){
+    return{
+      styleStr:{},
+      styleTableStr:{},
+      lineColor:'',
+      queryStartTime:'',
+      queryEndTime:'',
+      startTime:'',
+      endTime:this.getEndTimesMonthDate(),
+      rtStartTime:'',
+      rtEndTime:this.getEndTimesMonthDate(),
+      loading:true,
+      displayConfig:{
+        id:"",
+        displayCode:"accuracyPassRate",
+        showCode:"",
+        hiddenCode:""
+      },
+      showCode:[],
+      tableColumn: [],
+      total:0,
+      sortOrder:'asc',
+      pageSize: 10,
+      currentPage: 1,
+      dialogVisible:false,
+      listh: [],
+      lists: [],
+      listhquery: [],
+      listsquery: [],
+      tableData:[],
+      rpDrawData:{},
+      stDrawData:{},
+      dqAccuracyAVG:"--- ",
+      cdqAccuracyAVG:"--- ",
+      dqRateValueAVG:"--- ",
+      cdqRateValueAVG:"--- ",
+      chart1:null,
+      chart2:null
+    }
+  },
+  created () {
+    if(sessionStorage.getItem('styleSwitch') === 'blue'){
+      this.styleStr = {background:'black',color:'white',border:'white'}
+      this.styleTableStr = {background:'black',color:'white'}
+      this.lineColor = 'white'
+    }else{
+      this.lineColor = '#3b3b3b'
+    }
+    this.$nextTick(() => {
+      // 手动将表格和工具栏进行关联
+      this.$refs.accuracyPassRateRef.connect(this.$refs.accuracyPassRateToolBar)
+    })
+  },
+  mounted() {
+    this.init()
+    window.addEventListener("resize", this.handleResize);
+    window.addEventListener("transitionend", this.handleResize);
+  },
+  destroyListener() {
+    window.removeEventListener('resize', this.handleResize)
+    window.removeEventListener('transitionend', this.handleResize)
+  },
+  methods:{
+    handleResize(){
+      this.chart.resize()
+      this.chart2.resize()
+    },
+    getStartTimesMonthDate(Time = new Date()) {
+      let year = Time.getFullYear();
+      let month = Time.getMonth();
+      if (month == 0) {
+        month = 12;
+        year = year - 1;
+      }
+      if (month < 10) {
+        month = '0' + month;
+      }
+      let myDate = new Date(year, month, 0);
+      return myDate.getTime()+86400000
+    },
+    getEndTimesMonthDate(Time = new Date()) {
+      let year = Time.getFullYear();
+      let month = Time.getMonth()+1;
+      if (month == 0) {
+        month = 12;
+        year = year - 1;
+      }
+      if (month < 10) {
+        month = '0' + month;
+      }
+      let myDate = new Date(year, month, 0);
+      return myDate.getTime()+86399999
+    },
+    init(){
+
+      this.startTime=this.getStartTimesMonthDate()
+      this.rtStartTime=this.getStartTimesMonthDate()
+      this.queryStartTime = this.startTime
+      this.queryEndTime = this.endTime
+      this.loading = true
+      this.getShowCode()
+
+    },
+    dateQuery(){
+      this.loading = true
+      if(this.endTime<this.startTime){
+        this.$message.error("开始时间不能大于结束时间")
+        this.startTime = this.queryStartTime
+        this.endTime = this.queryEndTime
+        this.loading = false
+        return
+      }
+      this.queryStartTime = this.startTime
+      this.queryEndTime = this.endTime
+      this.getTable()
+      this.getRealTimeDraw()
+    },
+    getShowCode(){
+      this.$axios.get('displayConfig/'+this.displayConfig.displayCode).then((res) => {
+        if(res.data != null){
+          this.displayConfig = res.data
+          var showCodes = this.displayConfig.showCode.split(",");
+          var hiddenCodes = this.displayConfig.hiddenCode.split(",");
+          for (let i = 0; i <showCodes.length ; i++) {
+            if(showCodes[i] == "shortTermAccuracy" ){
+              this.lists.push({key:'短期准确率',value:'shortTermAccuracy'})
+              this.listsquery.push({key:'短期准确率',value:'shortTermAccuracy'})
+            }
+            if(showCodes[i] == "shortTermPassRate" ){
+              this.lists.push({key:'短期合格率',value:'shortTermPassRate'})
+              this.listsquery.push({key:'短期合格率',value:'shortTermPassRate'})
+            }
+            if(showCodes[i] == "ultraShortTermAccuracy" ){
+              this.lists.push({key:'超短期准确率',value:'ultraShortTermAccuracy'})
+              this.listsquery.push({key:'超短期准确率',value:'ultraShortTermAccuracy'})
+            }
+            if(showCodes[i] == "ultraShortTermPassRate" ){
+              this.lists.push({key:'超短期合格率',value:'ultraShortTermPassRate'})
+              this.listsquery.push({key:'超短期合格率',value:'ultraShortTermPassRate'})
+            }
+          }
+
+          for (let i = 0; i <hiddenCodes.length ; i++) {
+            if(hiddenCodes[i] == "shortTermAccuracy" ){
+              this.listh.push({key:'短期准确率',value:'shortTermAccuracy'})
+              this.listhquery.push({key:'短期准确率',value:'shortTermAccuracy'})
+            }
+            if(hiddenCodes[i] == "shortTermPassRate" ){
+              this.listh.push({key:'短期合格率',value:'shortTermPassRate'})
+              this.listhquery.push({key:'短期合格率',value:'shortTermPassRate'})
+            }
+            if(hiddenCodes[i] == "ultraShortTermAccuracy" ){
+              this.listh.push({key:'超短期准确率',value:'ultraShortTermAccuracy'})
+              this.listhquery.push({key:'超短期准确率',value:'ultraShortTermAccuracy'})
+            }
+            if(hiddenCodes[i] == "ultraShortTermPassRate" ){
+              this.listh.push({key:'超短期合格率',value:'ultraShortTermPassRate'})
+              this.listhquery.push({key:'超短期合格率',value:'ultraShortTermPassRate'})
+            }
+          }
+
+          this.getTable()
+          this.getRealTimeDraw()
+        }else{
+          this.displayConfig.showCode="shortTermAccuracy,shortTermPassRate,ultraShortTermAccuracy,ultraShortTermPassRate"
+          this.displayConfig.hiddenCode=""
+          this.displayConfig.displayCode="accuracyPassRate"
+
+
+          this.lists.push({key:'短期准确率',value:'shortTermAccuracy'})
+          this.lists.push({key:'短期合格率',value:'shortTermPassRate'})
+          this.lists.push({key:'超短期准确率',value:'ultraShortTermAccuracy'})
+          this.lists.push({key:'超短期合格率',value:'ultraShortTermPassRate'})
+
+
+          this.$axios.post('/displayConfig',this.displayConfig).then((res) => {
+            this.$message.success('展示设置成功')
+            this.displayConfig = res.data
+          }).catch((error) => {
+            this.$message.error('展示设置出错' + error)
+          })
+          this.getTable()
+          this.getRealTimeDraw()
+        }
+        this.loading = false
+      }).catch((error) => {
+        this.loading = false
+        this.$message.error('查询准确率table出错' + error)
+      })
+    },
+
+    changeDisplay() {
+      this.displayConfig.showCode = ""
+      this.displayConfig.hiddenCode = ""
+      this.listsquery = []
+      this.listhquery = []
+      for (var i = 0; i < this.listh.length; i++) {
+        this.listhquery.push(this.listh[i])
+      }
+      for (var i = 0; i < this.lists.length; i++) {
+        this.listsquery.push(this.lists[i])
+      }
+      for (var i = 0; i < this.listsquery.length; i++) {
+        this.displayConfig.showCode += this.listsquery[i].value + ","
+      }
+      for (var i = 0; i < this.listhquery.length; i++) {
+        this.displayConfig.hiddenCode += this.listhquery[i].value + ","
+      }
+      this.$axios.post('displayConfig/', this.displayConfig).then((res) => {
+        this.displayConfig = res.data
+        this.$message.success('展示设置成功')
+        this.dialogVisible = false
+      }).catch((error) => {
+        this.$message.error('展示设置出错' + error)
+      })
+
+      this.getTable()
+      this.getRealTimeDraw()
+    },
+
+    cancelDisplay(){
+      this.lists=[]
+      this.listh=[]
+      for(var i = 0;i<this.listhquery.length;i++){
+        this.listh.push(this.listhquery[i])
+      }
+      for(var i = 0;i<this.listsquery.length;i++){
+        this.lists.push(this.listsquery[i])
+      }
+      this.dialogVisible = false
+    },
+
+    getTable(){
+      let showCode;
+      if(this.displayConfig.showCode == null || this.displayConfig.showCode==""){
+        showCode = "null";
+      }else{
+        showCode = this.displayConfig.showCode;
+      }
+      this.$axios.get('/accuracyPassRateOne/tableMonth/'+this.queryStartTime+'/'+this.queryEndTime+'/'+ showCode +'/'+this.sortOrder).then((res) => {
+        this.tableData = res.data.content
+        this.total = this.tableData.length
+        this.currentPage = 1
+
+        this.stDrawData = res.data.charts
+
+        for(var key in this.stDrawData){
+          if(key != "times" && key !="accuracyRate"){
+            var sum = 0;
+            var total =0;
+            for (let i = 0; i < this.stDrawData[key].length; i++) {
+              if(this.stDrawData[key][i]!=null){
+                this.stDrawData[key][i] = parseFloat(this.stDrawData[key][i])
+                sum+=this.stDrawData[key][i]
+                total+=1;
+              }
+            }
+            if(key =='shortTermAccuracy' && total!=0 ){
+              this.dqAccuracyAVG = (sum/total).toFixed(2)+" "
+            }
+            if(key =='shortTermPassRate' && total!=0 ){
+              this.dqRateValueAVG =(sum/total).toFixed(2)+" "
+            }
+            if(key =='ultraShortTermAccuracy' && total!=0 ){
+              this.cdqAccuracyAVG = (sum/total).toFixed(2)+" "
+            }
+            if(key =='ultraShortTermPassRate' && total!=0 ){
+              this.cdqRateValueAVG = (sum/total).toFixed(2)+" "
+            }
+          }
+        }
+
+        this.statisticsDraw(this.stDrawData)
+        // 表分页格数据总条数
+
+        this.tableColumn = [
+          { field: 'time', title: '时间', width:200},
+        ]
+        for(let i = 0;i<this.listsquery.length;i++){
+          var colunm = {
+            field:this.listsquery[i].value , title: this.listsquery[i].key
+          }
+          this.tableColumn.push(colunm)
+        }
+
+        this.loading = false
+      }).catch((error) => {
+        this.loading = false
+        this.$message.error('查询准确率table出错' + error)
+      })
+
+
+
+
+    },
+    getRealTimeDraw(){
+      let showCode;
+      if(this.displayConfig.showCode == null || this.displayConfig.showCode==""){
+        showCode = "null";
+      }else{
+        showCode = this.displayConfig.showCode;
+      }
+      this.$axios.get('/accuracyPassRateOne/realTimeCharts/'+this.rtStartTime+'/'+this.rtEndTime+'/'+showCode).then((res) => {
+        this.rpDrawData = res.data
+        for(var key in this.rpDrawData){
+          if(key != "times" && key !="accuracyRate"){
+            for (let i = 0; i < this.rpDrawData[key].length; i++) {
+              if(this.rpDrawData[key][i]!=null){
+                this.rpDrawData[key][i] = parseFloat(this.rpDrawData[key][i])
+              }
+            }
+          }
+        }
+        this.realTimeDraw(this.rpDrawData)
+      })
+    },
+    handlePageChange ({ currentPage, pageSize }) {
+      this.currentPage = currentPage
+      this.pageSize = pageSize
+      this.startTime = this.queryStartTime
+      this.endTime = this.queryEndTime
+
+    },
+
+    realTimeDraw(data) {
+      var lastindex = data.times.length-1
+      this.chart = echarts.init(document.getElementById('rtChats'))
+      var option = {
+        title: {
+          text: '实时 ',
+          subtext: data.times[0]+'-'+data.times[lastindex],
+          textStyle: {
+            fontWeight: 'normal',
+            fontSize: 16,
+            color: this.lineColor
+          },
+          left: '1%'
+        },
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            lineStyle: {
+              color: '#57617B'
+            }
+          }
+        },
+        legend: {
+          top: 20,
+          icon: 'rect',
+          itemWidth: 14,
+          itemHeight: 5,
+          itemGap: 13,
+          data: [],
+          right: '4%',
+          textStyle: {
+            fontSize: 12,
+            color: this.lineColor
+          }
+        },
+        dataZoom: [{
+          show: true,
+          realtime: true,
+          start: 0,
+          end: 100,
+          left: "15%",
+          right: "15%",
+          textStyle: {
+            color: this.lineColor
+          }
+        },
+          {
+            type: 'inside'
+          }],
+        grid: {
+          top: 100,
+          left: '2%',
+          right: '5%',
+          bottom: '10%',
+          containLabel: true
+        },
+        xAxis: {
+          type: 'category',
+          boundaryGap: false,
+          data: data.times,
+          axisLine: {
+            lineStyle: {
+              color: this.lineColor
+            }
+          }
+        },
+        yAxis: {
+          type: 'value',
+          name: '(%)',
+          max: 100,
+          min: 0,
+          axisLine: {
+            lineStyle: {
+              color: this.lineColor
+            }
+          },
+          axisLabel: {
+            margin: 10,
+            textStyle: {
+              fontSize: 14
+            }
+          },
+          splitLine: {
+            lineStyle: {
+              color: '#57617B'
+            }
+          }
+        },
+        series: []
+      };
+      var optionTitleText = "";
+      if(data.shortTermAccuracy != undefined){
+        optionTitleText+='短期准确率:'+(data.shortTermAccuracy[lastindex] == null ? "--- ":data.shortTermAccuracy[lastindex]+" ")
+        option.series.push({
+          name: '短期准确率',
+          type: 'line',
+          showSymbol: false,
+          // areaStyle: {
+          //   normal: {
+          //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+          //       offset: 0,
+          //       color: 'rgba(50,194,219, 0.3)'
+          //     }, {
+          //       offset: 0.8,
+          //       color: 'rgba(219, 50, 51, 0)'
+          //     }], false),
+          //     shadowColor: 'rgba(0, 0, 0, 0.1)',
+          //     shadowBlur: 10
+          //   }
+          // },
+          itemStyle: {
+            normal: {
+
+              color: '#cccc99',
+              borderColor: 'rgba(50,194,219,0.2)',
+              borderWidth: 12
+            }
+          },
+          markLine: {
+            silent: true,
+            itemStyle:{
+              normal:{
+                show:true,
+                color:'red'
+              }
+            },
+            data: [{
+              label: {
+                position: 'end',
+                formatter: "准确率"
+              },
+              yAxis: data.accuracyRate.split(',')[0]
+            },
+              {
+                label:{
+                  position:'end',
+                  formatter:"合格率"
+                },
+                yAxis: data.accuracyRate.split(',')[1]
+              }]
+          },
+          data: data.shortTermAccuracy
+        })
+        option.legend.data.push('短期准确率')
+      }
+      if(data.shortTermPassRate != undefined){
+        optionTitleText+= '短期合格率:'+(data.shortTermPassRate[lastindex] == null ? "--- ":data.shortTermPassRate[lastindex]+" ")
+        option.series.push({
+          name: '短期合格率',
+          type: 'line',
+          showSymbol: false,
+          // areaStyle: {
+          //   normal: {
+          //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+          //       offset: 0,
+          //       color: 'rgba(50,194,219, 0.3)'
+          //     }, {
+          //       offset: 0.8,
+          //       color: 'rgba(219, 50, 51, 0)'
+          //     }], false),
+          //     shadowColor: 'rgba(0, 0, 0, 0.1)',
+          //     shadowBlur: 10
+          //   }
+          // },
+          itemStyle: {
+            normal: {
+
+              color: '#ff6b6b',
+              borderColor: 'rgba(50,194,219,0.2)',
+              borderWidth: 12
+            }
+          },
+          markLine: {
+            silent: true,
+            itemStyle:{
+              normal:{
+                show:true,
+                color:'red'
+              }
+            },
+            data: [{
+              label:{
+                position:'end',
+                formatter:"准确率"
+              },
+              yAxis: data.accuracyRate.split(',')[0]
+            },
+              {
+                label:{
+                  position:'end',
+                  formatter:"合格率"
+                },
+                yAxis: data.accuracyRate.split(',')[1]
+              }]
+          },
+          data: data.shortTermPassRate
+        })
+        option.legend.data.push('短期合格率')
+      }
+      if(data.ultraShortTermAccuracy != undefined){
+        optionTitleText+= '超短期准确率:'+(data.ultraShortTermAccuracy[lastindex]==null ? "--- " : data.ultraShortTermAccuracy[lastindex]+" " )
+        option.series.push({
+          name: '超短期准确率',
+          type: 'line',
+          showSymbol: false,
+          // areaStyle: {
+          //   normal: {
+          //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+          //       offset: 0,
+          //       color: 'rgba(50,194,219, 0.3)'
+          //     }, {
+          //       offset: 0.8,
+          //       color: 'rgba(219, 50, 51, 0)'
+          //     }], false),
+          //     shadowColor: 'rgba(0, 0, 0, 0.1)',
+          //     shadowBlur: 10
+          //   }
+          // },
+          itemStyle: {
+            normal: {
+
+              color: '#669966',
+              borderColor: 'rgba(50,194,219,0.2)',
+              borderWidth: 12
+            }
+          },
+          markLine: {
+            silent: true,
+            itemStyle:{
+              normal:{
+                show:true,
+                color:'red'
+              }
+            },
+            data: [{
+              label:{
+                position:'end',
+                formatter:"准确率"
+              },
+              yAxis: data.accuracyRate.split(',')[0]
+            },
+              {
+                label:{
+                  position:'end',
+                  formatter:"合格率"
+                },
+                yAxis: data.accuracyRate.split(',')[1]
+              }]
+          },
+          data: data.ultraShortTermAccuracy
+        })
+        option.legend.data.push('超短期准确率')
+      }
+      if(data.ultraShortTermPassRate != undefined){
+        optionTitleText+= '超短期合格率:'+(data.ultraShortTermPassRate[lastindex] == null ? "--- ":data.ultraShortTermPassRate[lastindex]+" ")
+        option.series.push({
+          name: '超短期合格率',
+          type: 'line',
+          showSymbol: false,
+          // areaStyle: {
+          //   normal: {
+          //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+          //       offset: 0,
+          //       color: 'rgba(50,194,219, 0.3)'
+          //     }, {
+          //       offset: 0.8,
+          //       color: 'rgba(219, 50, 51, 0)'
+          //     }], false),
+          //     shadowColor: 'rgba(0, 0, 0, 0.1)',
+          //     shadowBlur: 10
+          //   }
+          // },
+          itemStyle: {
+            normal: {
+
+              color: '#66CC66',
+              borderColor: 'rgba(50,194,219,0.2)',
+              borderWidth: 12
+            }
+          },
+          markLine: {
+            silent: true,
+            itemStyle:{
+              normal:{
+                show:true,
+                color:'red'
+              }
+            },
+            data: [{
+              label:{
+                position:'end',
+                formatter:"准确率"
+              },
+              yAxis: data.accuracyRate.split(',')[0]
+            },
+              {
+                label:{
+                  position:'end',
+                  formatter:"合格率"
+                },
+                yAxis: data.accuracyRate.split(',')[1]
+              }]
+          },
+          data: data.ultraShortTermPassRate
+        })
+        option.legend.data.push('超短期合格率')
+      }
+      option.title.text ="实时 "+optionTitleText
+      this.chart.setOption(option, true)
+      /*window.onresize = chart.resize()*/
+    },
+    statisticsDraw(data) {
+      var lastindex = data.times.length-1
+      this.chart2 = echarts.init(document.getElementById('statisticsChats'))
+      var option = {
+        title: {
+          text: '统计 ',
+          subtext: data.times[0]+'-'+data.times[lastindex],
+          textStyle: {
+            fontWeight: 'normal',
+            fontSize: 16,
+            color: this.lineColor
+          },
+          left: '1%'
+        },
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            lineStyle: {
+              color: '#57617B'
+            }
+          }
+        },
+        legend: {
+          top: 20,
+          icon: 'rect',
+          itemWidth: 14,
+          itemHeight: 5,
+          itemGap: 13,
+          data: [],
+          right: '4%',
+          textStyle: {
+            fontSize: 12,
+            color: this.lineColor
+          }
+        },
+        dataZoom: [{
+          show: true,
+          realtime: true,
+          start: 0,
+          end: 100,
+          left: "15%",
+          right: "15%",
+          textStyle: {
+            color: this.lineColor
+          }
+        },
+          {
+            type: 'inside'
+          }],
+        grid: {
+          top: 100,
+          left: '2%',
+          right: '5%',
+          bottom: '10%',
+          containLabel: true
+        },
+        xAxis: {
+          type: 'category',
+          boundaryGap: false,
+          data: data.times,
+          axisLine: {
+            lineStyle: {
+              color: this.lineColor
+            }
+          }
+        },
+        yAxis: {
+          type: 'value',
+          name: '(%)',
+          max: 100,
+          min: 0,
+          axisLine: {
+            lineStyle: {
+              color: this.lineColor
+            }
+          },
+          axisLabel: {
+            margin: 10,
+            textStyle: {
+              fontSize: 14
+            }
+          },
+          splitLine: {
+            lineStyle: {
+              color: '#57617B'
+            }
+          }
+        },
+        series: []
+      };
+      var optionTitleText = "";
+      if(data.shortTermAccuracy != undefined){
+        optionTitleText+="短期准确率:"+this.dqAccuracyAVG
+        option.series.push({
+          name: '短期准确率',
+          type: 'line',
+          showSymbol: false,
+          itemStyle: {
+            normal: {
+              color: '#cccc99',
+              borderColor: 'rgba(50,194,219,0.2)',
+              borderWidth: 12
+            }
+          },
+          markLine: {
+            silent: true,
+            itemStyle:{
+              normal:{
+                show:true,
+                color:'red'
+              }
+            },
+            data: [{
+              label:{
+                position:'end',
+                formatter:"准确率"
+              },
+              yAxis: data.accuracyRate.split(',')[0]
+            },
+              {
+                label:{
+                  position:'end',
+                  formatter:"合格率"
+                },
+                yAxis: data.accuracyRate.split(',')[1]
+              }]
+          },
+          data: data.shortTermAccuracy
+        })
+        option.legend.data.push('短期准确率')
+      }
+      if(data.shortTermPassRate != undefined){
+        optionTitleText+="短期合格率:"+this.dqRateValueAVG
+        option.series.push({
+          name: '短期合格率',
+          type: 'line',
+          showSymbol: false,
+
+          itemStyle: {
+            normal: {
+
+              color: '#ff6b6b',
+              borderColor: 'rgba(50,194,219,0.2)',
+              borderWidth: 12
+            }
+          },
+          markLine: {
+            silent: true,
+            itemStyle:{
+              normal:{
+                show:true,
+                color:'red'
+              }
+            },
+            data: [{
+              label:{
+                position:'end',
+                formatter:"准确率"
+              },
+              yAxis: data.accuracyRate.split(',')[0]
+            },
+              {
+                label:{
+                  position:'end',
+                  formatter:"合格率"
+                },
+                yAxis: data.accuracyRate.split(',')[1]
+              }]
+          },
+          data: data.shortTermPassRate
+        })
+        option.legend.data.push('短期合格率')
+      }
+      if(data.ultraShortTermAccuracy != undefined){
+        optionTitleText+="超短期准确率:"+this.cdqAccuracyAVG
+        option.series.push({
+          name: '超短期准确率',
+          type: 'line',
+          showSymbol: false,
+          itemStyle: {
+            normal: {
+
+              color: '#669966',
+              borderColor: 'rgba(50,194,219,0.2)',
+              borderWidth: 12
+            }
+          },
+          markLine: {
+            silent: true,
+            itemStyle:{
+              normal:{
+                show:true,
+                color:'red'
+              }
+            },
+            data: [{
+              label:{
+                position:'end',
+                formatter:"准确率"
+              },
+              yAxis: data.accuracyRate.split(',')[0]
+            },
+              {
+                label:{
+                  position:'end',
+                  formatter:"合格率"
+                },
+                yAxis: data.accuracyRate.split(',')[1]
+              }]
+          },
+          data: data.ultraShortTermAccuracy
+        })
+        option.legend.data.push('超短期准确率')
+      }
+      if(data.ultraShortTermPassRate != undefined){
+        optionTitleText+="超短期合格率:"+this.cdqRateValueAVG
+        option.series.push({
+          name: '超短期合格率',
+          type: 'line',
+          showSymbol: false,
+          itemStyle: {
+            normal: {
+
+              color: '#66CC66',
+              borderColor: 'rgba(50,194,219,0.2)',
+              borderWidth: 12
+            }
+          },
+          markLine: {
+            silent: true,
+            itemStyle:{
+              normal:{
+                show:true,
+                color:'red'
+              }
+            },
+            data: [{
+              label:{
+                position:'end',
+                formatter:"准确率"
+              },
+              yAxis: data.accuracyRate.split(',')[0]
+            },
+              {
+                label:{
+                  position:'end',
+                  formatter:"合格率"
+                },
+                yAxis: data.accuracyRate.split(',')[1]
+              }]
+          },
+          data: data.ultraShortTermPassRate
+        })
+        option.legend.data.push('超短期合格率')
+      }
+      option.title.text ="统计 平均/"+optionTitleText
+      this.chart2.setOption(option, true)
+    },
+
+    sortChangeEvent ({ column, property, order }) {
+      if(order == null){
+        order = 'asc'
+      }
+      this.currentPage = 1
+      this.sortOrder = order
+      this.loading = true
+      this.getTable()
+    },
+
+    checkColumnMethod ({ column }) {
+      if (column.property === 'preTime') {
+        return false
+      }
+      return true
+    }
+
+  }
+}
+</script>
+
+<style scoped>
+
+
+
+.tableContent {
+  /*width: 100%;*/
+  height: 40%;
+}
+
+
+.drag-box-item {
+  /*margin:10px;*/
+  flex: 1;
+  height: 220px;
+  max-width: 100%;
+  min-width: 100%;
+  background-color: #eff1f5;
+  margin-right: 16px;
+  border-radius: 6px;
+  border: 1px #e1e4e8 solid;
+}
+
+.item-title {
+  padding: 8px 8px 8px 12px;
+  font-size: 14px;
+  line-height: 1.5;
+  color: #24292e;
+  font-weight: 600;
+}
+
+.item-ul {
+  padding: 0 8px 8px;
+  height: 200px;
+  overflow-y: scroll;
+}
+
+.item-ul::-webkit-scrollbar {
+  width: 0;
+}
+
+.drag-list {
+  width: 14%;
+  float: left;
+  border: 1px #e1e4e8 solid;
+  padding: 10px;
+  /*margin: 5px 0 10px;*/
+  list-style: none;
+  background-color: #fff;
+  border-radius: 6px;
+  cursor: pointer;
+  -webkit-transition: border .3s ease-in;
+  transition: border .3s ease-in;
+}
+
+.drag-list:hover {
+  border: 1px solid #20a0ff;
+}
+
+.inputNum {
+  height: 50px;
+  text-align: right;
+}
+.accuracyPassRate{
+  width: 49%;
+  height: 100%;
+  margin-top: 20px;
+}
+</style>
+

+ 1080 - 0
ipfcst/ipfcst-reportquery/src/main/frontend/views/statisticsQuery/accuracyPassRateOne/index.vue

@@ -0,0 +1,1080 @@
+<template>
+  <div class="chart-container" >
+    <div class="filter">
+      <div class="startTime">
+        <span class="timeText">起始时间</span>
+
+        <el-date-picker
+          v-model="startTime"
+          :clearable="false"
+          type="datetime"
+          value-format="timestamp"
+          placeholder="选择日期">
+        </el-date-picker>
+      </div>
+      <div class="endTime">
+        <span class="timeText">截止时间</span>
+
+        <el-date-picker
+          v-model="endTime"
+          :clearable="false"
+          type="datetime"
+          value-format="timestamp"
+          placeholder="选择日期">
+        </el-date-picker>
+      </div>
+      <div class="timeQuery">
+        <el-button  size="small" :loading="loading"  @click="dateQuery">查询</el-button>
+      </div>
+      <div class="timeQuery">
+        <el-button  size="small" :loading="loading"  @click="dialogVisible = true">显示设置</el-button>
+      </div>
+      <div class="toolbar"> <vxe-toolbar ref="accuracyPassRateToolBar"  export></vxe-toolbar></div>
+    </div>
+
+    <el-dialog
+      title="选择数据类型"
+      :visible.sync="dialogVisible"
+      :before-close="this.cancelDisplay"
+      width="50%">
+      <div class="drag-box-item">
+        <div class="item-title">隐藏</div>
+        <draggable class="list-group" :list="listh" group="people">
+          <transition-group id="done" tag="div" class="item-ul">
+            <div
+              v-for="(element, index) in listh"
+              :key="element.value"
+              class="drag-list"
+            >
+              {{ element.key }}
+            </div>
+          </transition-group>
+        </draggable>
+
+      </div>
+      <div class="drag-box-item">
+        <div class="item-title">展示</div>
+
+        <draggable class="list-group" :list="lists" group="people">
+          <transition-group id="wdtodo" tag="div" class="item-ul">
+            <div
+              v-for="(element, index) in lists"
+              :key="element.value"
+              class="drag-list"
+            >
+              {{ element.key }}
+            </div>
+          </transition-group>
+        </draggable>
+      </div>
+      <span slot="footer" class="dialog-footer">
+    <el-button @click="this.cancelDisplay" style="color: #1f2d3d">取 消</el-button>
+    <el-button type="primary" style="color: #1f2d3d" @click="this.changeDisplay">确 定</el-button>
+  </span>
+    </el-dialog>
+
+    <div style="width: 100%;height: 90%">
+      <div class="tableContent">
+        <vxe-grid
+          id="accuracyPassRateTable"
+          ref="accuracyPassRateRef"
+          border
+          export-config
+          :loading="loading"
+          @sort-change="sortChangeEvent"
+          :auto-resize="true"
+          highlight-hover-row
+          :header-cell-style="styleStr"
+          max-height="90%"
+          :cell-style="styleTableStr"
+          align="center"
+          :data="this.tableData.slice((currentPage-1)*pageSize,currentPage*pageSize)"
+          :columns="tableColumn"/>
+
+        <div class="rtPageturning">
+          <vxe-pager
+            background
+            :loading="loading"
+            :current-page.sync="currentPage"
+            :page-size.sync="pageSize"
+            :total="total"
+            @page-change="handlePageChange"
+            :layouts="['PrevJump', 'PrevPage', 'JumpNumber', 'NextPage', 'NextJump', 'Sizes', 'FullJump', 'Total']">
+          </vxe-pager>
+        </div>
+      </div>
+      <div style="display: flex;justify-content:space-around;width: 100%;height: 50%">
+        <div class="accuracyPassRate one"  id="rtChats"/>
+        <div class="accuracyPassRate two"  id="statisticsChats"/>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+
+  import resize from '../../../components/Charts/mixins/resize'
+  import draggable from 'vuedraggable'
+  import echarts from "echarts";
+  export default {
+    name: 'accuracyPassRate',
+    components: {draggable},
+    mixins: [resize],
+    data(){
+      return{
+        styleStr:{},
+        styleTableStr:{},
+        lineColor:'',
+        queryStartTime:'',
+        queryEndTime:'',
+        startTime:'',
+        endTime:new Date().getTime()-900000,
+        rtStartTime:'',
+        rtEndTime:new Date().getTime()-900000,
+        loading:true,
+        displayConfig:{
+          id:"",
+          displayCode:"accuracyPassRate",
+          showCode:"",
+          hiddenCode:""
+        },
+        showCode:[],
+        tableColumn: [],
+        total:0,
+        sortOrder:'asc',
+        pageSize: 10,
+        currentPage: 1,
+        dialogVisible:false,
+        listh: [],
+        lists: [],
+        listhquery: [],
+        listsquery: [],
+        tableData:[],
+        rpDrawData:{},
+        stDrawData:{},
+        dqAccuracyAVG:"--- ",
+        cdqAccuracyAVG:"--- ",
+        dqRateValueAVG:"--- ",
+        cdqRateValueAVG:"--- ",
+        chart1:null,
+        chart2:null
+      }
+    },
+    created () {
+      if(sessionStorage.getItem('styleSwitch') === 'blue'){
+        this.styleStr = {background:'black',color:'white',border:'white'}
+        this.styleTableStr = {background:'black',color:'white'}
+        this.lineColor = 'white'
+      }else{
+        this.lineColor = '#3b3b3b'
+      }
+      this.$nextTick(() => {
+        // 手动将表格和工具栏进行关联
+        this.$refs.accuracyPassRateRef.connect(this.$refs.accuracyPassRateToolBar)
+      })
+    },
+    mounted() {
+      this.init()
+      window.addEventListener("resize", this.handleResize);
+      window.addEventListener("transitionend", this.handleResize);
+    },
+    destroyListener() {
+      window.removeEventListener('resize', this.handleResize)
+      window.removeEventListener('transitionend', this.handleResize)
+    },
+    methods:{
+      handleResize(){
+        this.chart.resize()
+        this.chart2.resize()
+      },
+      init(){
+
+        this.startTime=new Date(new Date(this.endTime).toLocaleDateString()).getTime()
+        this.rtStartTime=new Date(new Date(this.rtEndTime).toLocaleDateString()).getTime()
+        this.queryStartTime = this.startTime
+        this.queryEndTime = this.endTime
+        this.loading = true
+        this.getShowCode()
+
+      },
+      dateQuery(){
+        this.loading = true
+        if(this.endTime<this.startTime){
+          this.$message.error("开始时间不能大于结束时间")
+          this.startTime = this.queryStartTime
+          this.endTime = this.queryEndTime
+          this.loading = false
+          return
+        }
+        if(this.endTime-this.startTime> 60 * 60 * 24 * 1000*31){
+          this.startTime = this.queryStartTime
+          this.endTime = this.queryEndTime
+          this.$message.error("只能最多查询31天的数据哦")
+          this.loading = false
+          return
+        }
+        this.queryStartTime = this.startTime
+        this.queryEndTime = this.endTime
+        this.getTable()
+        this.getRealTimeDraw()
+      },
+      getShowCode(){
+        this.$axios.get('displayConfig/'+this.displayConfig.displayCode).then((res) => {
+          if(res.data != null){
+            this.displayConfig = res.data
+            var showCodes = this.displayConfig.showCode.split(",");
+            var hiddenCodes = this.displayConfig.hiddenCode.split(",");
+            for (let i = 0; i <showCodes.length ; i++) {
+              if(showCodes[i] == "shortTermAccuracy" ){
+                this.lists.push({key:'短期准确率',value:'shortTermAccuracy'})
+                this.listsquery.push({key:'短期准确率',value:'shortTermAccuracy'})
+              }
+              if(showCodes[i] == "shortTermPassRate" ){
+                this.lists.push({key:'短期合格率',value:'shortTermPassRate'})
+                this.listsquery.push({key:'短期合格率',value:'shortTermPassRate'})
+              }
+              if(showCodes[i] == "ultraShortTermAccuracy" ){
+                this.lists.push({key:'超短期准确率',value:'ultraShortTermAccuracy'})
+                this.listsquery.push({key:'超短期准确率',value:'ultraShortTermAccuracy'})
+              }
+              if(showCodes[i] == "ultraShortTermPassRate" ){
+                this.lists.push({key:'超短期合格率',value:'ultraShortTermPassRate'})
+                this.listsquery.push({key:'超短期合格率',value:'ultraShortTermPassRate'})
+              }
+            }
+
+            for (let i = 0; i <hiddenCodes.length ; i++) {
+              if(hiddenCodes[i] == "shortTermAccuracy" ){
+                this.listh.push({key:'短期准确率',value:'shortTermAccuracy'})
+                this.listhquery.push({key:'短期准确率',value:'shortTermAccuracy'})
+              }
+              if(hiddenCodes[i] == "shortTermPassRate" ){
+                this.listh.push({key:'短期合格率',value:'shortTermPassRate'})
+                this.listhquery.push({key:'短期合格率',value:'shortTermPassRate'})
+              }
+              if(hiddenCodes[i] == "ultraShortTermAccuracy" ){
+                this.listh.push({key:'超短期准确率',value:'ultraShortTermAccuracy'})
+                this.listhquery.push({key:'超短期准确率',value:'ultraShortTermAccuracy'})
+              }
+              if(hiddenCodes[i] == "ultraShortTermPassRate" ){
+                this.listh.push({key:'超短期合格率',value:'ultraShortTermPassRate'})
+                this.listhquery.push({key:'超短期合格率',value:'ultraShortTermPassRate'})
+              }
+            }
+
+            this.getTable()
+            this.getRealTimeDraw()
+          }else{
+            this.displayConfig.showCode="shortTermAccuracy,shortTermPassRate,ultraShortTermAccuracy,ultraShortTermPassRate"
+            this.displayConfig.hiddenCode=""
+            this.displayConfig.displayCode="accuracyPassRate"
+
+
+            this.lists.push({key:'短期准确率',value:'shortTermAccuracy'})
+            this.lists.push({key:'短期合格率',value:'shortTermPassRate'})
+            this.lists.push({key:'超短期准确率',value:'ultraShortTermAccuracy'})
+            this.lists.push({key:'超短期合格率',value:'ultraShortTermPassRate'})
+
+
+            this.$axios.post('/displayConfig',this.displayConfig).then((res) => {
+              this.$message.success('展示设置成功')
+              this.displayConfig = res.data
+             }).catch((error) => {
+              this.$message.error('展示设置出错' + error)
+             })
+            this.getTable()
+            this.getRealTimeDraw()
+          }
+          this.loading = false
+        }).catch((error) => {
+          this.loading = false
+          this.$message.error('查询准确率table出错' + error)
+        })
+      },
+
+      changeDisplay() {
+        this.displayConfig.showCode = ""
+        this.displayConfig.hiddenCode = ""
+        this.listsquery = []
+        this.listhquery = []
+        for (var i = 0; i < this.listh.length; i++) {
+          this.listhquery.push(this.listh[i])
+        }
+        for (var i = 0; i < this.lists.length; i++) {
+          this.listsquery.push(this.lists[i])
+        }
+        for (var i = 0; i < this.listsquery.length; i++) {
+          this.displayConfig.showCode += this.listsquery[i].value + ","
+        }
+        for (var i = 0; i < this.listhquery.length; i++) {
+          this.displayConfig.hiddenCode += this.listhquery[i].value + ","
+        }
+        this.$axios.post('displayConfig/', this.displayConfig).then((res) => {
+          this.displayConfig = res.data
+          this.$message.success('展示设置成功')
+          this.dialogVisible = false
+        }).catch((error) => {
+          this.$message.error('展示设置出错' + error)
+        })
+
+        this.getTable()
+        this.getRealTimeDraw()
+      },
+
+      cancelDisplay(){
+        this.lists=[]
+        this.listh=[]
+        for(var i = 0;i<this.listhquery.length;i++){
+          this.listh.push(this.listhquery[i])
+        }
+        for(var i = 0;i<this.listsquery.length;i++){
+          this.lists.push(this.listsquery[i])
+        }
+        this.dialogVisible = false
+      },
+
+      getTable(){
+        let showCode;
+        if(this.displayConfig.showCode == null || this.displayConfig.showCode==""){
+          showCode = "null";
+        }else{
+          showCode = this.displayConfig.showCode;
+        }
+        this.$axios.get('/accuracyPassRateOne/table/'+this.queryStartTime+'/'+this.queryEndTime+'/'+showCode+'/'+this.sortOrder).then((res) => {
+          this.tableData = res.data.content
+          this.total = this.tableData.length
+          this.currentPage = 1
+
+          this.stDrawData = res.data.charts
+
+          for(var key in this.stDrawData){
+            if(key != "times" && key !="accuracyRate"){
+              var sum = 0;
+              var total =0;
+              for (let i = 0; i < this.stDrawData[key].length; i++) {
+                if(this.stDrawData[key][i]!=null){
+                  this.stDrawData[key][i] = parseFloat(this.stDrawData[key][i])
+                  sum+=this.stDrawData[key][i]
+                  total+=1;
+                }
+              }
+              if(key =='shortTermAccuracy' && total!=0 ){
+                this.dqAccuracyAVG = (sum/total).toFixed(2)+" "
+              }
+              if(key =='shortTermPassRate' && total!=0 ){
+                this.dqRateValueAVG =(sum/total).toFixed(2)+" "
+              }
+              if(key =='ultraShortTermAccuracy' && total!=0 ){
+                this.cdqAccuracyAVG = (sum/total).toFixed(2)+" "
+              }
+              if(key =='ultraShortTermPassRate' && total!=0 ){
+                this.cdqRateValueAVG = (sum/total).toFixed(2)+" "
+              }
+            }
+          }
+
+          this.statisticsDraw(this.stDrawData)
+          // 表分页格数据总条数
+
+          this.tableColumn = [
+            { field: 'time', title: '时间', width:200},
+          ]
+          for(let i = 0;i<this.listsquery.length;i++){
+            var colunm = {
+              field:this.listsquery[i].value , title: this.listsquery[i].key
+            }
+            this.tableColumn.push(colunm)
+          }
+
+          this.loading = false
+        }).catch((error) => {
+          this.loading = false
+          this.$message.error('查询准确率table出错' + error)
+        })
+      },
+      getRealTimeDraw(){
+        let showCode;
+        if(this.displayConfig.showCode == null || this.displayConfig.showCode==""){
+          showCode = "null";
+        }else{
+          showCode = this.displayConfig.showCode;
+        }
+        this.$axios.get('/accuracyPassRateOne/realTimeCharts/'+this.rtStartTime+'/'+this.rtEndTime+'/'+showCode).then((res) => {
+          this.rpDrawData = res.data
+          for(var key in this.rpDrawData){
+            if(key != "times" && key !="accuracyRate"){
+              for (let i = 0; i < this.rpDrawData[key].length; i++) {
+                if(this.rpDrawData[key][i]!=null){
+                  this.rpDrawData[key][i] = parseFloat(this.rpDrawData[key][i])
+                }
+              }
+            }
+        }
+          this.realTimeDraw(this.rpDrawData)
+        })
+      },
+      handlePageChange ({ currentPage, pageSize }) {
+        this.currentPage = currentPage
+        this.pageSize = pageSize
+        this.startTime = this.queryStartTime
+        this.endTime = this.queryEndTime
+
+      },
+
+      realTimeDraw(data) {
+        var lastindex = data.times.length-1
+        this.chart = echarts.init(document.getElementById('rtChats'))
+        var option = {
+          title: {
+            text: '实时 ',
+            subtext: data.times[0]+'-'+data.times[lastindex],
+            textStyle: {
+              fontWeight: 'normal',
+              fontSize: 16,
+              color: this.lineColor
+            },
+            left: '1%'
+          },
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: {
+              lineStyle: {
+                color: '#57617B'
+              }
+            }
+          },
+          legend: {
+            top: 20,
+            icon: 'rect',
+            itemWidth: 14,
+            itemHeight: 5,
+            itemGap: 13,
+            data: [],
+            right: '4%',
+            textStyle: {
+              fontSize: 12,
+              color: this.lineColor
+            }
+          },
+          dataZoom: [{
+            show: true,
+            realtime: true,
+            start: 0,
+            end: 100,
+            left: "15%",
+            right: "15%",
+            textStyle: {
+              color: this.lineColor
+            }
+          },
+            {
+              type: 'inside'
+            }],
+          grid: {
+            top: 100,
+            left: '2%',
+            right: '5%',
+            bottom: '10%',
+            containLabel: true
+          },
+          xAxis: {
+            type: 'category',
+            boundaryGap: false,
+            data: data.times,
+            axisLine: {
+              lineStyle: {
+                color: this.lineColor
+              }
+            }
+          },
+          yAxis: {
+            type: 'value',
+            name: '(%)',
+            max: 100,
+            min: 0,
+            axisLine: {
+              lineStyle: {
+                color: this.lineColor
+              }
+            },
+            axisLabel: {
+              margin: 10,
+              textStyle: {
+                fontSize: 14
+              }
+            },
+            splitLine: {
+              lineStyle: {
+                color: '#57617B'
+              }
+            }
+          },
+          series: []
+        };
+        var optionTitleText = "";
+        if(data.shortTermAccuracy != undefined){
+          optionTitleText+='短期准确率:'+(data.shortTermAccuracy[lastindex] == null ? "--- ":data.shortTermAccuracy[lastindex]+" ")
+          option.series.push({
+            name: '短期准确率',
+            type: 'line',
+            showSymbol: false,
+            // areaStyle: {
+            //   normal: {
+            //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+            //       offset: 0,
+            //       color: 'rgba(50,194,219, 0.3)'
+            //     }, {
+            //       offset: 0.8,
+            //       color: 'rgba(219, 50, 51, 0)'
+            //     }], false),
+            //     shadowColor: 'rgba(0, 0, 0, 0.1)',
+            //     shadowBlur: 10
+            //   }
+            // },
+            itemStyle: {
+              normal: {
+
+                color: '#cccc99',
+                borderColor: 'rgba(50,194,219,0.2)',
+                borderWidth: 12
+              }
+            },
+            markLine: {
+              silent: true,
+              itemStyle:{
+                normal:{
+                  show:true,
+                  color:'red'
+                }
+              },
+              data: [{
+                label: {
+                  position: 'end',
+                  formatter: "准确率"
+                },
+                yAxis: data.accuracyRate.split(',')[0]
+              },
+                {
+                  label:{
+                    position:'end',
+                    formatter:"合格率"
+                  },
+                  yAxis: data.accuracyRate.split(',')[1]
+                }]
+            },
+            data: data.shortTermAccuracy
+          })
+          option.legend.data.push('短期准确率')
+        }
+        if(data.shortTermPassRate != undefined){
+          optionTitleText+= '短期合格率:'+(data.shortTermPassRate[lastindex] == null ? "--- ":data.shortTermPassRate[lastindex]+" ")
+          option.series.push({
+            name: '短期合格率',
+            type: 'line',
+            showSymbol: false,
+            // areaStyle: {
+            //   normal: {
+            //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+            //       offset: 0,
+            //       color: 'rgba(50,194,219, 0.3)'
+            //     }, {
+            //       offset: 0.8,
+            //       color: 'rgba(219, 50, 51, 0)'
+            //     }], false),
+            //     shadowColor: 'rgba(0, 0, 0, 0.1)',
+            //     shadowBlur: 10
+            //   }
+            // },
+            itemStyle: {
+              normal: {
+
+                color: '#ff6b6b',
+                borderColor: 'rgba(50,194,219,0.2)',
+                borderWidth: 12
+              }
+            },
+            markLine: {
+              silent: true,
+              itemStyle:{
+                normal:{
+                  show:true,
+                  color:'red'
+                }
+              },
+              data: [{
+                label:{
+                  position:'end',
+                  formatter:"准确率"
+                },
+                yAxis: data.accuracyRate.split(',')[0]
+              },
+                {
+                  label:{
+                    position:'end',
+                    formatter:"合格率"
+                  },
+                  yAxis: data.accuracyRate.split(',')[1]
+                }]
+            },
+            data: data.shortTermPassRate
+          })
+          option.legend.data.push('短期合格率')
+        }
+        if(data.ultraShortTermAccuracy != undefined){
+          optionTitleText+= '超短期准确率:'+(data.ultraShortTermAccuracy[lastindex]==null ? "--- " : data.ultraShortTermAccuracy[lastindex]+" " )
+          option.series.push({
+            name: '超短期准确率',
+            type: 'line',
+            showSymbol: false,
+            // areaStyle: {
+            //   normal: {
+            //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+            //       offset: 0,
+            //       color: 'rgba(50,194,219, 0.3)'
+            //     }, {
+            //       offset: 0.8,
+            //       color: 'rgba(219, 50, 51, 0)'
+            //     }], false),
+            //     shadowColor: 'rgba(0, 0, 0, 0.1)',
+            //     shadowBlur: 10
+            //   }
+            // },
+            itemStyle: {
+              normal: {
+
+                color: '#669966',
+                borderColor: 'rgba(50,194,219,0.2)',
+                borderWidth: 12
+              }
+            },
+            markLine: {
+              silent: true,
+              itemStyle:{
+                normal:{
+                  show:true,
+                  color:'red'
+                }
+              },
+              data: [{
+                label:{
+                  position:'end',
+                  formatter:"准确率"
+                },
+                yAxis: data.accuracyRate.split(',')[0]
+              },
+                {
+                  label:{
+                    position:'end',
+                    formatter:"合格率"
+                  },
+                  yAxis: data.accuracyRate.split(',')[1]
+                }]
+            },
+            data: data.ultraShortTermAccuracy
+          })
+          option.legend.data.push('超短期准确率')
+        }
+        if(data.ultraShortTermPassRate != undefined){
+          optionTitleText+= '超短期合格率:'+(data.ultraShortTermPassRate[lastindex] == null ? "--- ":data.ultraShortTermPassRate[lastindex]+" ")
+          option.series.push({
+            name: '超短期合格率',
+            type: 'line',
+            showSymbol: false,
+            // areaStyle: {
+            //   normal: {
+            //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+            //       offset: 0,
+            //       color: 'rgba(50,194,219, 0.3)'
+            //     }, {
+            //       offset: 0.8,
+            //       color: 'rgba(219, 50, 51, 0)'
+            //     }], false),
+            //     shadowColor: 'rgba(0, 0, 0, 0.1)',
+            //     shadowBlur: 10
+            //   }
+            // },
+            itemStyle: {
+              normal: {
+
+                color: '#66CC66',
+                borderColor: 'rgba(50,194,219,0.2)',
+                borderWidth: 12
+              }
+            },
+            markLine: {
+              silent: true,
+              itemStyle:{
+                normal:{
+                  show:true,
+                  color:'red'
+                }
+              },
+              data: [{
+                label:{
+                  position:'end',
+                  formatter:"准确率"
+                },
+                yAxis: data.accuracyRate.split(',')[0]
+              },
+                {
+                  label:{
+                    position:'end',
+                    formatter:"合格率"
+                  },
+                  yAxis: data.accuracyRate.split(',')[1]
+                }]
+            },
+            data: data.ultraShortTermPassRate
+          })
+          option.legend.data.push('超短期合格率')
+        }
+        option.title.text ="实时 "+optionTitleText
+        this.chart.setOption(option, true)
+        /*window.onresize = chart.resize()*/
+      },
+      statisticsDraw(data) {
+        var lastindex = data.times.length-1
+        this.chart2 = echarts.init(document.getElementById('statisticsChats'))
+        var option = {
+          title: {
+            text: '统计 ',
+            subtext: data.times[0]+'-'+data.times[lastindex],
+            textStyle: {
+              fontWeight: 'normal',
+              fontSize: 16,
+              color: this.lineColor
+            },
+            left: '1%'
+          },
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: {
+              lineStyle: {
+                color: '#57617B'
+              }
+            }
+          },
+          legend: {
+            top: 20,
+            icon: 'rect',
+            itemWidth: 14,
+            itemHeight: 5,
+            itemGap: 13,
+            data: [],
+            right: '4%',
+            textStyle: {
+              fontSize: 12,
+              color: this.lineColor
+            }
+          },
+          dataZoom: [{
+            show: true,
+            realtime: true,
+            start: 0,
+            end: 100,
+            left: "15%",
+            right: "15%",
+            textStyle: {
+              color: this.lineColor
+            }
+          },
+            {
+              type: 'inside'
+            }],
+          grid: {
+            top: 100,
+            left: '2%',
+            right: '5%',
+            bottom: '10%',
+            containLabel: true
+          },
+          xAxis: {
+            type: 'category',
+            boundaryGap: false,
+            data: data.times,
+            axisLine: {
+              lineStyle: {
+                color: this.lineColor
+              }
+            }
+          },
+          yAxis: {
+            type: 'value',
+            name: '(%)',
+            max: 100,
+            min: 0,
+            axisLine: {
+              lineStyle: {
+                color: this.lineColor
+              }
+            },
+            axisLabel: {
+              margin: 10,
+              textStyle: {
+                fontSize: 14
+              }
+            },
+            splitLine: {
+              lineStyle: {
+                color: '#57617B'
+              }
+            }
+          },
+          series: []
+        };
+        var optionTitleText = "";
+        if(data.shortTermAccuracy != undefined){
+          optionTitleText+="短期准确率:"+this.dqAccuracyAVG
+          option.series.push({
+            name: '短期准确率',
+            type: 'line',
+            showSymbol: false,
+            itemStyle: {
+              normal: {
+                color: '#cccc99',
+                borderColor: 'rgba(50,194,219,0.2)',
+                borderWidth: 12
+              }
+            },
+            markLine: {
+              silent: true,
+              itemStyle:{
+                normal:{
+                  show:true,
+                  color:'red'
+                }
+              },
+              data: [{
+                label:{
+                  position:'end',
+                  formatter:"准确率"
+                },
+                yAxis: data.accuracyRate.split(',')[0]
+              },
+                {
+                  label:{
+                    position:'end',
+                    formatter:"合格率"
+                  },
+                  yAxis: data.accuracyRate.split(',')[1]
+                }]
+            },
+            data: data.shortTermAccuracy
+          })
+          option.legend.data.push('短期准确率')
+        }
+        if(data.shortTermPassRate != undefined){
+          optionTitleText+="短期合格率:"+this.dqRateValueAVG
+          option.series.push({
+            name: '短期合格率',
+            type: 'line',
+            showSymbol: false,
+
+            itemStyle: {
+              normal: {
+
+                color: '#ff6b6b',
+                borderColor: 'rgba(50,194,219,0.2)',
+                borderWidth: 12
+              }
+            },
+            markLine: {
+              silent: true,
+              itemStyle:{
+                normal:{
+                  show:true,
+                  color:'red'
+                }
+              },
+              data: [{
+                label:{
+                  position:'end',
+                  formatter:"准确率"
+                },
+                yAxis: data.accuracyRate.split(',')[0]
+              },
+                {
+                  label:{
+                    position:'end',
+                    formatter:"合格率"
+                  },
+                  yAxis: data.accuracyRate.split(',')[1]
+                }]
+            },
+            data: data.shortTermPassRate
+          })
+          option.legend.data.push('短期合格率')
+        }
+        if(data.ultraShortTermAccuracy != undefined){
+          optionTitleText+="超短期准确率:"+this.cdqAccuracyAVG
+          option.series.push({
+            name: '超短期准确率',
+            type: 'line',
+            showSymbol: false,
+            itemStyle: {
+              normal: {
+
+                color: '#669966',
+                borderColor: 'rgba(50,194,219,0.2)',
+                borderWidth: 12
+              }
+            },
+            markLine: {
+              silent: true,
+              itemStyle:{
+                normal:{
+                  show:true,
+                  color:'red'
+                }
+              },
+              data: [{
+                label:{
+                  position:'end',
+                  formatter:"准确率"
+                },
+                yAxis: data.accuracyRate.split(',')[0]
+              },
+                {
+                  label:{
+                    position:'end',
+                    formatter:"合格率"
+                  },
+                  yAxis: data.accuracyRate.split(',')[1]
+                }]
+            },
+            data: data.ultraShortTermAccuracy
+          })
+          option.legend.data.push('超短期准确率')
+        }
+        if(data.ultraShortTermPassRate != undefined){
+          optionTitleText+="超短期合格率:"+this.cdqRateValueAVG
+          option.series.push({
+            name: '超短期合格率',
+            type: 'line',
+            showSymbol: false,
+            itemStyle: {
+              normal: {
+
+                color: '#66CC66',
+                borderColor: 'rgba(50,194,219,0.2)',
+                borderWidth: 12
+              }
+            },
+            markLine: {
+              silent: true,
+              itemStyle:{
+                normal:{
+                  show:true,
+                  color:'red'
+                }
+              },
+              data: [{
+                label:{
+                  position:'end',
+                  formatter:"准确率"
+                },
+                yAxis: data.accuracyRate.split(',')[0]
+              },
+                {
+                  label:{
+                    position:'end',
+                    formatter:"合格率"
+                  },
+                  yAxis: data.accuracyRate.split(',')[1]
+                }]
+            },
+            data: data.ultraShortTermPassRate
+          })
+          option.legend.data.push('超短期合格率')
+        }
+        option.title.text ="统计 平均/"+optionTitleText
+        this.chart2.setOption(option, true)
+      },
+
+      sortChangeEvent ({ column, property, order }) {
+        if(order == null){
+          order = 'asc'
+        }
+        this.currentPage = 1
+        this.sortOrder = order
+        this.loading = true
+        this.getTable()
+      },
+
+      checkColumnMethod ({ column }) {
+        if (column.property === 'preTime') {
+          return false
+        }
+        return true
+      }
+
+    }
+  }
+</script>
+
+<style scoped>
+
+  .tableContent {
+    /*width: 100%;*/
+    height: 40%;
+  }
+
+  .drag-box-item {
+    /*margin:10px;*/
+    flex: 1;
+    height: 220px;
+    max-width: 100%;
+    min-width: 100%;
+    background-color: #eff1f5;
+    margin-right: 16px;
+    border-radius: 6px;
+    border: 1px #e1e4e8 solid;
+  }
+
+  .item-title {
+    padding: 8px 8px 8px 12px;
+    font-size: 14px;
+    line-height: 1.5;
+    color: #24292e;
+    font-weight: 600;
+  }
+
+  .item-ul {
+    padding: 0 8px 8px;
+    height: 200px;
+    overflow-y: scroll;
+  }
+
+  .item-ul::-webkit-scrollbar {
+    width: 0;
+  }
+
+  .drag-list {
+    width: 14%;
+    float: left;
+    border: 1px #e1e4e8 solid;
+    padding: 10px;
+    /*margin: 5px 0 10px;*/
+    list-style: none;
+    background-color: #fff;
+    border-radius: 6px;
+    cursor: pointer;
+    -webkit-transition: border .3s ease-in;
+    transition: border .3s ease-in;
+  }
+
+  .drag-list:hover {
+    border: 1px solid #20a0ff;
+  }
+
+  .inputNum {
+    height: 50px;
+    text-align: right;
+  }
+  .accuracyPassRate{
+    width: 49%;
+    height: 100%;
+    margin-top: 20px;
+  }
+</style>
+

+ 175 - 0
ipfcst/ipfcst-reportquery/src/main/java/com/jiayue/ipfcst/controller/AccuracyPassRateOneController.java

@@ -0,0 +1,175 @@
+package com.jiayue.ipfcst.controller;
+
+import com.jiayue.ipfcst.common.core.web.vo.ResponseVO;
+import com.jiayue.ipfcst.service.AccuracyPassRateOneService;
+import com.jiayue.ipfcst.service.AccuracyPassRateService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 准确率合格率restful接口
+ *
+ * @author yh
+ * @version 1.0
+ * @since 2019/8/7 10:12
+ */
+@RestController
+@Slf4j
+@RequestMapping("accuracyPassRateOne")
+public class AccuracyPassRateOneController {
+  private final AccuracyPassRateOneService accuracyPassRateOneService;
+
+  @Autowired
+  public AccuracyPassRateOneController(AccuracyPassRateService accuracyPassRateService, AccuracyPassRateOneService accuracyPassRateOneService){
+    this.accuracyPassRateOneService = accuracyPassRateOneService;
+  }
+
+ /* *//**
+   * 根据时间查询准确合格率
+   * @param startTime 开始时间
+   * @param endTime 结束时间
+   * @param page 页码
+   * @param size 条数
+   * @param sortOrder 排序
+   * @return result
+   *//*
+  @GetMapping(value="accuracyPassRate/{startTime}/{endTime}/{page}/{size}")
+  public ResponseVO findByTimeBetweenAndNoForPaging(@PathVariable("startTime") Long startTime,
+                                       @PathVariable("endTime") Long endTime,
+                                       @PathVariable("page") Integer page,
+                                       @PathVariable("size") Integer size,
+                                       String sortOrder) {
+    Map<String,Object> map = new HashMap<>();
+    try{
+      map = accuracyPassRateService.findByTimeBetweenAndNoForPaging(startTime,endTime,page,size,sortOrder);
+      return ResponseVO.success(map);
+    }catch(Exception e){
+      e.printStackTrace();
+      log.error("查询准确合格率错误");
+      return ResponseVO.fail(e.toString());
+    }
+  }*/
+
+  /**
+   * 根据时间查询准确合格率
+   * @param startTime 开始时间
+   * @param endTime 结束时间
+   * @param sortOrder 排序
+   * @return result
+   */
+  @GetMapping(value="table/{startTime}/{endTime}/{showCode}/{sortOrder}")
+  public ResponseVO findByTimeBetween(@PathVariable("startTime") Long startTime,
+                                      @PathVariable("endTime") Long endTime,
+                                      @PathVariable("showCode") String showCode,
+                                      @PathVariable("sortOrder") String sortOrder) {
+    Map<String,Object> map = new HashMap<>();
+    try{
+      map = accuracyPassRateOneService.findByTimeBetweenTable(startTime,endTime,showCode,sortOrder);
+      return ResponseVO.success(map);
+
+    }catch(Exception e){
+      e.printStackTrace();
+      log.error("查询准确合格率错误");
+      return ResponseVO.fail(e.toString());
+    }
+  }
+
+  /**
+   * 根据时间查询日准确合格率(均方根误差)
+   * @param startTime 开始时间
+   * @param endTime 结束时间
+   * @param sortOrder 排序
+   * @author zcl
+   * @return result
+   */
+  @GetMapping(value="tableDay/{startTime}/{endTime}/{showCode}/{sortOrder}")
+  public ResponseVO findByTimeBetweenDay(@PathVariable("startTime") Long startTime,
+                                      @PathVariable("endTime") Long endTime,
+                                      @PathVariable("showCode") String showCode,
+                                      @PathVariable("sortOrder") String sortOrder) {
+    Map<String,Object> map = new HashMap<>();
+    try{
+      map = accuracyPassRateOneService.findByTimeBetweenTableDay(startTime,endTime,showCode,sortOrder);
+      return ResponseVO.success(map);
+
+    }catch(Exception e){
+      e.printStackTrace();
+      log.error("查询准确合格率错误");
+      return ResponseVO.fail(e.toString());
+    }
+  }
+
+  /**
+   * 根据时间查询月准确合格率
+   * @param startTime 开始时间
+   * @param endTime 结束时间
+   * @param sortOrder 排序
+   * @return result
+   */
+  @GetMapping(value="tableMonth/{startTime}/{endTime}/{showCode}/{sortOrder}")
+  public ResponseVO findByTimeBetweenMonth(@PathVariable("startTime") Long startTime,
+                                      @PathVariable("endTime") Long endTime,
+                                      @PathVariable("showCode") String showCode,
+                                      @PathVariable("sortOrder") String sortOrder) {
+    Map<String,Object> map = new HashMap<>();
+    try{
+      map = accuracyPassRateOneService.findByTimeBetweenTableMonth(startTime,endTime,showCode,sortOrder);
+      return ResponseVO.success(map);
+
+    }catch(Exception e){
+      e.printStackTrace();
+      log.error("查询准确合格率错误");
+      return ResponseVO.fail(e.toString());
+    }
+  }
+
+
+  /**
+   * 实时查询准确合格率(用于图表)
+   * @param startTime 开始时间 当天凌晨
+   * @param endTime 结束时间 当前时间
+   * @return result
+   */
+  @GetMapping(value="realTimeCharts/{startTime}/{endTime}/{showCode}")
+  public ResponseVO accuracyPassRateQueryForCharts(@PathVariable("startTime") Long startTime,
+                                                   @PathVariable("endTime") Long endTime,
+                                                   @PathVariable("showCode") String showCode) {
+    Map<String,Object> map = new HashMap<>();
+    try{
+      map = accuracyPassRateOneService.findByTimeBetweenForRealTimeCharts(startTime, endTime,showCode);
+      return ResponseVO.success(map);
+    }catch(Exception e){
+      e.printStackTrace();
+      return ResponseVO.fail(e.toString());
+    }
+  }
+
+  /**
+   * 实时查询日准确率(均方根误差、用于图表)
+   * @param startTime 开始时间 当天凌晨
+   * @param endTime 结束时间 当前时间
+   * @author zcl
+   * @return result
+   */
+  @GetMapping(value="realTimeChartsDay/{startTime}/{endTime}/{showCode}")
+  public ResponseVO accuracyPassRateQueryForChartsDay(@PathVariable("startTime") Long startTime,
+                                                   @PathVariable("endTime") Long endTime,
+                                                   @PathVariable("showCode") String showCode) {
+    Map<String,Object> findResultMap = new HashMap<>();
+    try{
+      findResultMap = accuracyPassRateOneService.findByTimeBetweenForRealTimeChartsDay(startTime, endTime,showCode);
+      return ResponseVO.success(findResultMap);
+    }catch(Exception e){
+      e.printStackTrace();
+      return ResponseVO.fail(e.toString());
+    }
+  }
+
+}

+ 922 - 0
ipfcst/ipfcst-reportquery/src/main/java/com/jiayue/ipfcst/service/AccuracyPassRateOneService.java

@@ -0,0 +1,922 @@
+package com.jiayue.ipfcst.service;
+
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import com.jiayue.ipfcst.common.data.entity.AccuracyPassRateDayOne;
+import com.jiayue.ipfcst.common.data.entity.AccuracyPassRateOne;
+import com.jiayue.ipfcst.common.data.repository.*;
+import com.jiayue.ipfcst.common.data.service.BaseService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.criteria.Predicate;
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 准确合格率业务层11
+ *
+ * @author yh
+ * @version 1.0
+ * @since 2019/8/5 16:02
+ */
+@Service
+@Slf4j
+public class AccuracyPassRateOneService extends BaseService {
+  private final AccuracyPassRateOneRepository accuracyPassRateOneRepository;
+  private final AccuracyPassRateDayOneRepository accuracyPassRateDayOneRepository;
+  private final DisplayConfigRepository displayConfigRepository;
+
+  @Autowired
+  public AccuracyPassRateOneService(AccuracyPassRateRepository accuracyPassRateRepository,
+                                    AccuracyPassRateDayRepository accuracyPassRateDayRepository,
+                                    AccuracyPassRateOneRepository accuracyPassRateOneRepository, AccuracyPassRateDayOneRepository accuracyPassRateDayOneRepository, DisplayConfigRepository displayConfigRepository) {
+    this.accuracyPassRateOneRepository = accuracyPassRateOneRepository;
+    this.accuracyPassRateDayOneRepository = accuracyPassRateDayOneRepository;
+    this.displayConfigRepository = displayConfigRepository;
+  }
+
+  /**
+   * 根据时间查询准确率合格率 yh
+   *
+   * @param startTime 开始时间
+   * @param endTime   结束时间
+   * @param page      页码
+   * @param size      条数
+   * @param sortOrder 排序
+   * @return
+   */
+  @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
+  public Map<String, Object> findByTimeBetweenAndNoForPaging(Long startTime, Long endTime,
+                                                             Integer page, Integer size,
+                                                             String sortOrder) {
+    Map<String, Object> map = new HashMap<>();
+    Sort sort = Sort.by(Sort.Direction.DESC, "time");
+    if (sortOrder.contains("asc")) {
+      sort = Sort.by(Sort.Direction.ASC, "time");
+    }
+    Specification<AccuracyPassRateOne> specification = this.specificationFindByTime(startTime, endTime);
+    Pageable pageable = PageRequest.of(page - 1, size, sort);
+    Page AccuracyPassRates = accuracyPassRateOneRepository.findAll(specification, pageable);
+    List<AccuracyPassRateOne> datas = new ArrayList<>();
+    datas = AccuracyPassRates.getContent();
+    map.put("content", datas);
+    map.put("count", AccuracyPassRates.getTotalElements());
+    return map;
+  }
+
+
+  /**
+   * 根据时间查询准确率合格率 yh
+   *
+   * @param startTime 开始时间
+   * @param endTime   结束时间
+   * @param sortOrder 排序
+   * @return
+   */
+  @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
+  public Map<String, Object> findByTimeBetweenTable(Long startTime, Long endTime,
+                                                    String showCode,
+                                                    String sortOrder) throws NoSuchFieldException, IllegalAccessException {
+    Map<String, Object> map = new HashMap<>();
+    List<AccuracyPassRateOne> byTimeBetween = new ArrayList<>();
+
+    long timeStep = 900000L;
+    if (startTime % timeStep != 0) {
+      startTime = startTime - (startTime % timeStep) + timeStep;
+    }
+    if (endTime % timeStep != 0) {
+      endTime = endTime - (endTime % timeStep);
+    }
+
+    byTimeBetween = accuracyPassRateOneRepository.findByTimeBetween(startTime, endTime);
+
+    List<AccuracyPassRateOne> allList = checkData(startTime, endTime, byTimeBetween, timeStep);
+
+    //DAY  按照一天1条显示 也就是每天23:45那条    TIME  按照15分钟一条展示
+    String sysParameter = super.getSysParameter("ACCURACY_RATE_SHOW", "day");
+
+    List<AccuracyPassRateOne> result = new ArrayList<>();
+    SimpleDateFormat sdf;
+    if (sysParameter.equals("day")) {
+
+      sdf = new SimpleDateFormat("yyyy-MM-dd");
+      String endTimeStr = sdf.format(DateUtil.date(endTime));
+      List<DateTime> dateTimes = DateUtil.rangeToList(new Date(startTime), new Date(endTime), DateField.DAY_OF_YEAR);
+      for (int i = 0; i < dateTimes.size(); i++) {
+        String format = sdf.format(dateTimes.get(i));
+        //如果是最后时间,就拿最后时间整15分钟的
+        if (format.equals(endTimeStr)) {
+          long finalNowTime = endTime;
+          List<AccuracyPassRateOne> collect = allList.stream().filter(a -> a.getTime() == finalNowTime).collect(Collectors.toList());
+          result.add(collect.get(0));
+        } else {
+          //如果不是 就拿这天23:45的
+          int year = dateTimes.get(i).getField(DateField.YEAR);
+          int month = dateTimes.get(i).getField(DateField.MONTH) + 1;
+          int day = dateTimes.get(i).getField(DateField.DAY_OF_MONTH);
+          long time = new GregorianCalendar(year, month - 1, day, 23, 45, 00).getTime().getTime();
+          List<AccuracyPassRateOne> collect = allList.stream().filter(a -> a.getTime() == time).collect(Collectors.toList());
+          result.add(collect.get(0));
+        }
+      }
+
+    } else {
+      sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+      result = allList;
+    }
+
+    if (sortOrder.contains("asc")) {
+      result.sort(Comparator.comparing(AccuracyPassRateOne::getTime));
+    } else {
+      result.sort(Comparator.comparing(AccuracyPassRateOne::getTime).reversed());
+    }
+
+    List<Map<String, Object>> resultList = new ArrayList<>();
+    String[] displayCode = showCode.split(",");
+
+    List<String> shortTermAccuracys = new ArrayList<>();
+    List<String> shortTermPassRate = new ArrayList<>();
+    List<String> ultraShortTermAccuracy = new ArrayList<>();
+    List<String> ultraShortTermPassRate = new ArrayList<>();
+    List<String> times = new ArrayList<>();
+    Map<String, Object> chartsMap = new HashMap<>();
+    String accuracyRate = super.getSysParameter("ACCURACY_RATE", "75,85");
+    chartsMap.put("accuracyRate", accuracyRate);
+    for (int i = 0; i < result.size(); i++) {
+      Map<String, Object> dtoM = new HashMap<>();
+      AccuracyPassRateOne apr = result.get(i);
+      dtoM.put("time", sdf.format(new Date(apr.getTime())));
+      times.add(sdf.format(new Date(apr.getTime())));
+  /*    Class c = apr.getClass();
+      Field f;*/
+      for (int j = 0; j < displayCode.length; j++) {
+
+        if (displayCode[j].equals("shortTermAccuracy")) {
+          dtoM.put(displayCode[j], apr.getShortTermAccuracy());
+          if (apr.getShortTermAccuracy() != null && apr.getShortTermAccuracy().equals("无可用数据计算")) {
+            shortTermAccuracys.add(null);
+          } else {
+            if(apr.getShortTermAccuracy() != null && !apr.getShortTermAccuracy().equals("不予考核")){
+              shortTermAccuracys.add(apr.getShortTermAccuracy());
+            }
+
+          }
+
+        }
+        if (displayCode[j].equals("shortTermPassRate")) {
+          dtoM.put(displayCode[j], apr.getShortTermPassRate());
+          if (apr.getShortTermPassRate() != null && apr.getShortTermPassRate().equals("无可用数据计算")) {
+            shortTermPassRate.add(null);
+          } else {
+            shortTermPassRate.add(apr.getShortTermPassRate());
+          }
+        }
+        if (displayCode[j].equals("ultraShortTermAccuracy")) {
+          dtoM.put(displayCode[j], apr.getUltraShortTermAccuracy());
+          if (apr.getUltraShortTermAccuracy() != null && apr.getUltraShortTermAccuracy().equals("无可用数据计算")) {
+            ultraShortTermAccuracy.add(null);
+          } else {
+            if(apr.getUltraShortTermAccuracy() != null && !apr.getUltraShortTermAccuracy().equals("不予考核")){
+              ultraShortTermAccuracy.add(apr.getUltraShortTermAccuracy());
+            }
+
+          }
+        }
+        if (displayCode[j].equals("ultraShortTermPassRate")) {
+          dtoM.put(displayCode[j], apr.getUltraShortTermPassRate());
+          if (apr.getUltraShortTermPassRate() != null && apr.getUltraShortTermPassRate().equals("无可用数据计算")) {
+            ultraShortTermPassRate.add(null);
+          } else {
+            ultraShortTermPassRate.add(apr.getUltraShortTermPassRate());
+          }
+        }
+
+       /* f = c.getDeclaredField(displayCode[j]);
+        f.setAccessible(true);
+        f.get(apr);
+        dtoM.put(displayCode[j], f.get(apr));*/
+      }
+      resultList.add(dtoM);
+    }
+
+    chartsMap.put("times", times);
+
+    for (int i = 0; i < displayCode.length; i++) {
+      if (displayCode[i].equals("shortTermAccuracy")) {
+        chartsMap.put(displayCode[i], shortTermAccuracys);
+      }
+      if (displayCode[i].equals("shortTermPassRate")) {
+        chartsMap.put(displayCode[i], shortTermPassRate);
+      }
+      if (displayCode[i].equals("ultraShortTermAccuracy")) {
+        chartsMap.put(displayCode[i], ultraShortTermAccuracy);
+      }
+      if (displayCode[i].equals("ultraShortTermPassRate")) {
+        chartsMap.put(displayCode[i], ultraShortTermPassRate);
+      }
+    }
+
+    map.put("content", resultList);
+    map.put("charts", chartsMap);
+
+    return map;
+  }
+
+  /**
+   * 根据时间查询日准确率合格率 yh(表格)
+   *
+   * @param startTime 开始时间
+   * @param endTime   结束时间
+   * @param sortOrder 排序
+   * @return
+   */
+  @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
+  public Map<String, Object> findByTimeBetweenTableDay(Long startTime, Long endTime,
+                                                       String showCode,
+                                                       String sortOrder) throws NoSuchFieldException, IllegalAccessException {
+    Map<String, Object> map = new HashMap<>();
+    List<AccuracyPassRateDayOne> byTimeBetween = new ArrayList<>();
+
+    long timeStep = 900000L;
+    if (startTime % timeStep != 0) {
+      startTime = startTime - (startTime % timeStep) + timeStep;
+    }
+    if (endTime % timeStep != 0) {
+      endTime = endTime - (endTime % timeStep);
+    }
+    // 根据时间,获取准确率数据
+    byTimeBetween = accuracyPassRateDayOneRepository.findByTimeBetween(startTime, endTime);
+    // 补全日数据
+    List<AccuracyPassRateDayOne> allList = checkDataDay(startTime, endTime, byTimeBetween);
+    //DAY  按照一天1条显示 也就是每天23:45那条    TIME  按照15分钟一条展示
+    String sysParameter = super.getSysParameter("ACCURACY_RATE_SHOW", "day");
+
+    List<AccuracyPassRateDayOne> accuracyPassRateDayList = new ArrayList<>();
+    SimpleDateFormat sdf;
+    if (sysParameter.equals("day")) {
+      accuracyPassRateDayList.addAll(allList);
+      sdf = new SimpleDateFormat("yyyy-MM-dd");
+//      String endTimeStr = sdf.format(DateUtil.date(endTime));
+//      List<DateTime> dateTimes = DateUtil.rangeToList(new Date(startTime), new Date(endTime), DateField.DAY_OF_YEAR);
+//      for (int i = 0; i < dateTimes.size(); i++) {
+//        String format = sdf.format(dateTimes.get(i));
+//        //如果是最后时间,就拿最后时间整15分钟的
+//        if (format.equals(endTimeStr)) {
+//          long finalNowTime = endTime;
+//          List<AccuracyPassRateDay> collect = allList.stream().filter(a -> a.getTime() == finalNowTime).collect(Collectors.toList());
+//          result.add(collect.get(0));
+//        } else {
+//          //如果不是 就拿这天23:45的
+//          int year = dateTimes.get(i).getField(DateField.YEAR);
+//          int month = dateTimes.get(i).getField(DateField.MONTH) + 1;
+//          int day = dateTimes.get(i).getField(DateField.DAY_OF_MONTH);
+//          long time = new GregorianCalendar(year, month - 1, day, 23, 45, 00).getTime().getTime();
+//          List<AccuracyPassRateDay> collect = allList.stream().filter(a -> a.getTime() == time).collect(Collectors.toList());
+//          result.add(collect.get(0));
+//        }
+//      }
+
+    } else {
+      sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+      accuracyPassRateDayList = allList;
+    }
+
+    if (sortOrder.contains("asc")) {
+      accuracyPassRateDayList.sort(Comparator.comparing(AccuracyPassRateDayOne::getTime));
+    } else {
+      accuracyPassRateDayList.sort(Comparator.comparing(AccuracyPassRateDayOne::getTime).reversed());
+    }
+
+    List<Map<String, Object>> resultList = new ArrayList<>();
+    String[] displayCode = showCode.split(",");
+
+    List<String> shortTermAccuracys = new ArrayList<>();
+    List<String> shortTermPassRate = new ArrayList<>();
+    List<String> ultraShortTermAccuracy = new ArrayList<>();
+    List<String> ultraShortTermPassRate = new ArrayList<>();
+    List<String> times = new ArrayList<>();
+    Map<String, Object> chartsMap = new HashMap<>();
+    String accuracyRate = super.getSysParameter("ACCURACY_RATE", "75,85");
+    chartsMap.put("accuracyRate", accuracyRate);
+    for (int i = 0; i < accuracyPassRateDayList.size(); i++) {
+      Map<String, Object> dtoM = new HashMap<>();
+      AccuracyPassRateDayOne apr = accuracyPassRateDayList.get(i);
+      dtoM.put("time", sdf.format(new Date(apr.getTime())));
+      times.add(sdf.format(new Date(apr.getTime())));
+  /*    Class c = apr.getClass();
+      Field f;*/
+      for (int j = 0; j < displayCode.length; j++) {
+
+        if (displayCode[j].equals("shortTermAccuracy")) {
+          dtoM.put(displayCode[j], apr.getShortTermAccuracy());
+          if (apr.getShortTermAccuracy() != null && apr.getShortTermAccuracy().equals("无可用数据计算")) {
+            shortTermAccuracys.add(null);
+          } else {
+            if (apr.getShortTermAccuracy() != null && !apr.getShortTermAccuracy().equals("不予考核")) {
+              shortTermAccuracys.add(apr.getShortTermAccuracy());
+            }
+          }
+        }
+        if (displayCode[j].equals("shortTermPassRate")) {
+          dtoM.put(displayCode[j], apr.getShortTermPassRate());
+          if (apr.getShortTermPassRate() != null && apr.getShortTermPassRate().equals("无可用数据计算")) {
+            shortTermPassRate.add(null);
+          } else {
+            shortTermPassRate.add(apr.getShortTermPassRate());
+          }
+        }
+        if (displayCode[j].equals("ultraShortTermAccuracy")) {
+          dtoM.put(displayCode[j], apr.getUltraShortTermAccuracy());
+          if (apr.getUltraShortTermAccuracy() != null && apr.getUltraShortTermAccuracy().equals("无可用数据计算")) {
+            ultraShortTermAccuracy.add(null);
+          } else {
+            if (apr.getShortTermAccuracy() != null && !apr.getUltraShortTermAccuracy().equals("不予考核")) {
+              ultraShortTermAccuracy.add(apr.getUltraShortTermAccuracy());
+            }
+          }
+        }
+        if (displayCode[j].equals("ultraShortTermPassRate")) {
+          dtoM.put(displayCode[j], apr.getUltraShortTermPassRate());
+          if (apr.getUltraShortTermPassRate() != null && apr.getUltraShortTermPassRate().equals("无可用数据计算")) {
+            ultraShortTermPassRate.add(null);
+          } else {
+            ultraShortTermPassRate.add(apr.getUltraShortTermPassRate());
+          }
+        }
+      }
+      resultList.add(dtoM);
+    }
+
+    chartsMap.put("times", times);
+
+    for (int i = 0; i < displayCode.length; i++) {
+      if (displayCode[i].equals("shortTermAccuracy")) {
+        chartsMap.put(displayCode[i], shortTermAccuracys);
+      }
+      if (displayCode[i].equals("shortTermPassRate")) {
+        chartsMap.put(displayCode[i], shortTermPassRate);
+      }
+      if (displayCode[i].equals("ultraShortTermAccuracy")) {
+        chartsMap.put(displayCode[i], ultraShortTermAccuracy);
+      }
+      if (displayCode[i].equals("ultraShortTermPassRate")) {
+        chartsMap.put(displayCode[i], ultraShortTermPassRate);
+      }
+    }
+
+    map.put("content", resultList);
+    map.put("charts", chartsMap);
+
+    return map;
+  }
+
+
+  /**
+   * 根据时间查询月准确率合格率
+   *
+   * @param startTime 开始时间
+   * @param endTime   结束时间
+   * @param sortOrder 排序
+   * @return
+   */
+  @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
+  public Map<String, Object> findByTimeBetweenTableMonth(Long startTime, Long endTime,
+                                                         String showCode,
+                                                         String sortOrder) throws NoSuchFieldException, IllegalAccessException {
+    Map<String, Object> map = new HashMap<>();
+    List<AccuracyPassRateOne> allList = new ArrayList<>();
+
+    long timeStep = 900000L;
+    if (startTime % timeStep != 0) {
+      startTime = startTime - (startTime % timeStep) + timeStep;
+    }
+    if (endTime % timeStep != 0) {
+      endTime = endTime - (endTime % timeStep);
+    }
+
+    allList = accuracyPassRateOneRepository.findByTimeBetween(startTime, endTime);
+
+
+
+    List<AccuracyPassRateOne> result = new ArrayList<>();
+    SimpleDateFormat sdf;
+
+    sdf = new SimpleDateFormat("yyyy-MM");
+    DecimalFormat df = new DecimalFormat("0.00");
+
+    List<DateTime> dateTimes = DateUtil.rangeToList(new Date(startTime), new Date(endTime), DateField.MONTH);
+    for (int i = 0; i < dateTimes.size(); i++) {
+      String format = sdf.format(dateTimes.get(i));
+      List<AccuracyPassRateOne> collect = allList.stream().filter(s -> sdf.format(s.getTime()).equals(format)).collect(Collectors.toList());
+
+      List<Double> shortTermAccuracyList = new ArrayList<>();
+      List<Double> shortTermPassRateList = new ArrayList<>();
+      List<Double> ultraShortTermAccuracyList = new ArrayList<>();
+      List<Double> ultraShortTermPassRateList = new ArrayList<>();
+
+      for (AccuracyPassRateOne accuracyPassRate : collect) {
+        if(accuracyPassRate.getShortTermAccuracy() != null ){
+          if (accuracyPassRate.getShortTermAccuracy().indexOf("%") >= 0) {
+            try {
+              shortTermAccuracyList.add(Double.parseDouble(accuracyPassRate.getShortTermAccuracy().split("%")[0]));
+            } catch (Exception e) {
+              e.printStackTrace();
+            }
+          }
+        }
+        if(accuracyPassRate.getShortTermPassRate() != null ){
+          if (accuracyPassRate.getShortTermPassRate().indexOf("%") >= 0) {
+            try {
+              shortTermPassRateList.add(Double.parseDouble(accuracyPassRate.getShortTermPassRate().split("%")[0]));
+            } catch (Exception e) {
+              e.printStackTrace();
+            }
+
+          }
+        }
+        if(accuracyPassRate.getUltraShortTermAccuracy() !=null ){
+          if (accuracyPassRate.getUltraShortTermAccuracy().indexOf("%") >= 0) {
+            try {
+              ultraShortTermAccuracyList.add(Double.parseDouble(accuracyPassRate.getUltraShortTermAccuracy().split("%")[0]));
+            } catch (Exception e) {
+              e.printStackTrace();
+            }
+
+          }
+        }
+        if(accuracyPassRate.getUltraShortTermPassRate()!=null){
+          if (accuracyPassRate.getUltraShortTermPassRate().indexOf("%") >= 0) {
+            try {
+              ultraShortTermPassRateList.add(Double.parseDouble(accuracyPassRate.getUltraShortTermPassRate().split("%")[0]));
+            } catch (Exception e) {
+              e.printStackTrace();
+            }
+          }
+
+        }
+        }
+
+
+      AccuracyPassRateOne newAccuracyPassRate = new AccuracyPassRateOne();
+      if(shortTermAccuracyList.size()>0){
+        double shortTermAccuracyAvg = shortTermAccuracyList.stream().mapToDouble(d -> d.doubleValue()).average().getAsDouble();
+        newAccuracyPassRate.setShortTermAccuracy(df.format(shortTermAccuracyAvg) + "%");
+      }else {
+        newAccuracyPassRate.setShortTermAccuracy("无可用数据");
+      }
+      if(shortTermPassRateList.size()>0){
+        double shortTermPassRateAvg = shortTermPassRateList.stream().mapToDouble(d -> d.doubleValue()).average().getAsDouble();
+        newAccuracyPassRate.setShortTermPassRate(df.format(shortTermPassRateAvg) + "%");
+      }else {
+        newAccuracyPassRate.setShortTermPassRate("无可用数据");
+      }
+      if(ultraShortTermAccuracyList.size()>0){
+        double ultraShortTermAccuracyAvg = ultraShortTermAccuracyList.stream().mapToDouble(d -> d.doubleValue()).average().getAsDouble();
+        newAccuracyPassRate.setUltraShortTermAccuracy(df.format(ultraShortTermAccuracyAvg) + "%");
+      }else {
+        newAccuracyPassRate.setUltraShortTermAccuracy("无可用数据");
+      }
+      if(ultraShortTermPassRateList.size()>0){
+        double ultraShortTermPassRateAvg = ultraShortTermPassRateList.stream().mapToDouble(d -> d.doubleValue()).average().getAsDouble();
+        newAccuracyPassRate.setUltraShortTermPassRate(df.format(ultraShortTermPassRateAvg) + "%");
+      }else {
+        newAccuracyPassRate.setUltraShortTermPassRate("无可用数据");
+      }
+      newAccuracyPassRate.setTime(dateTimes.get(i).getTime());
+
+      result.add(newAccuracyPassRate);
+    }
+
+    if (sortOrder.contains("asc")) {
+      result.sort(Comparator.comparing(AccuracyPassRateOne::getTime));
+    } else {
+      result.sort(Comparator.comparing(AccuracyPassRateOne::getTime).reversed());
+    }
+
+    List<Map<String, Object>> resultList = new ArrayList<>();
+    String[] displayCode = showCode.split(",");
+
+    List<String> shortTermAccuracys = new ArrayList<>();
+    List<String> shortTermPassRate = new ArrayList<>();
+    List<String> ultraShortTermAccuracy = new ArrayList<>();
+    List<String> ultraShortTermPassRate = new ArrayList<>();
+    List<String> times = new ArrayList<>();
+    Map<String, Object> chartsMap = new HashMap<>();
+    String accuracyRate = super.getSysParameter("ACCURACY_RATE", "75,85");
+    chartsMap.put("accuracyRate", accuracyRate);
+    for (int i = 0; i < result.size(); i++) {
+      Map<String, Object> dtoM = new HashMap<>();
+      AccuracyPassRateOne apr = result.get(i);
+      dtoM.put("time", sdf.format(new Date(apr.getTime())));
+      times.add(sdf.format(new Date(apr.getTime())));
+  /*    Class c = apr.getClass();
+      Field f;*/
+      for (int j = 0; j < displayCode.length; j++) {
+
+        if (displayCode[j].equals("shortTermAccuracy")) {
+          dtoM.put(displayCode[j], apr.getShortTermAccuracy());
+          if (apr.getShortTermAccuracy() != null && apr.getShortTermAccuracy().equals("无可用数据计算")) {
+            shortTermAccuracys.add(null);
+          } else {
+            shortTermAccuracys.add(apr.getShortTermAccuracy());
+          }
+
+        }
+        if (displayCode[j].equals("shortTermPassRate")) {
+          dtoM.put(displayCode[j], apr.getShortTermPassRate());
+          if (apr.getShortTermPassRate() != null && apr.getShortTermPassRate().equals("无可用数据计算")) {
+            shortTermPassRate.add(null);
+          } else {
+            shortTermPassRate.add(apr.getShortTermPassRate());
+          }
+        }
+        if (displayCode[j].equals("ultraShortTermAccuracy")) {
+          dtoM.put(displayCode[j], apr.getUltraShortTermAccuracy());
+          if (apr.getUltraShortTermAccuracy() != null && apr.getUltraShortTermAccuracy().equals("无可用数据计算")) {
+            ultraShortTermAccuracy.add(null);
+          } else {
+            ultraShortTermAccuracy.add(apr.getUltraShortTermAccuracy());
+          }
+        }
+        if (displayCode[j].equals("ultraShortTermPassRate")) {
+          dtoM.put(displayCode[j], apr.getUltraShortTermPassRate());
+          if (apr.getUltraShortTermPassRate() != null && apr.getUltraShortTermPassRate().equals("无可用数据计算")) {
+            ultraShortTermPassRate.add(null);
+          } else {
+            ultraShortTermPassRate.add(apr.getUltraShortTermPassRate());
+          }
+        }
+
+       /* f = c.getDeclaredField(displayCode[j]);
+        f.setAccessible(true);
+        f.get(apr);
+        dtoM.put(displayCode[j], f.get(apr));*/
+      }
+      resultList.add(dtoM);
+    }
+
+    chartsMap.put("times", times);
+
+    for (int i = 0; i < displayCode.length; i++) {
+
+      if (displayCode[i].equals("shortTermAccuracy")) {
+
+        chartsMap.put(displayCode[i], shortTermAccuracys);
+      }
+
+      if (displayCode[i].equals("shortTermPassRate")) {
+
+        chartsMap.put(displayCode[i], shortTermPassRate);
+      }
+
+      if (displayCode[i].equals("ultraShortTermAccuracy")) {
+
+        chartsMap.put(displayCode[i], ultraShortTermAccuracy);
+      }
+
+      if (displayCode[i].equals("ultraShortTermPassRate")) {
+
+        chartsMap.put(displayCode[i], ultraShortTermPassRate);
+      }
+
+    }
+
+    map.put("content", resultList);
+    map.put("charts", chartsMap);
+
+    return map;
+  }
+
+
+  /**
+   * 当天实时准确率合格率 yh
+   *
+   * @param startTime 开始时间 当天凌晨
+   * @param endTime   结束时间 当前时间
+   * @param showCode  展示配置
+   * @return
+   */
+  @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
+  public Map<String, Object> findByTimeBetweenForRealTimeCharts(Long startTime, Long endTime, String showCode) {
+
+    long timeStep = 900000L;
+    if (startTime % timeStep != 0) {
+      startTime = startTime - (startTime % timeStep) + timeStep;
+    }
+
+    if (endTime % timeStep != 0) {
+      endTime = endTime - (endTime % timeStep);
+    }
+
+    List<AccuracyPassRateOne> byTimeBetween = accuracyPassRateOneRepository.findByTimeBetween(startTime, endTime);
+
+    String accuracyRate = super.getSysParameter("ACCURACY_RATE", "75,85");
+
+    List<AccuracyPassRateOne> allList = checkData(startTime, endTime, byTimeBetween, timeStep);
+    //过滤数据
+    exchangeValue(allList);
+
+    allList.sort(Comparator.comparing(AccuracyPassRateOne::getTime));
+
+    String[] displayCode = showCode.split(",");
+
+
+    Map<String, Object> map = new HashMap<>();
+
+    List<String> times = new ArrayList<>();
+    map.put("times", times);
+
+    map.put("accuracyRate", accuracyRate);
+
+    List<String> shortTermAccuracys = new ArrayList<>();
+    List<String> shortTermPassRate = new ArrayList<>();
+    List<String> ultraShortTermAccuracy = new ArrayList<>();
+    List<String> ultraShortTermPassRate = new ArrayList<>();
+
+    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+    for (int i = 0; i < allList.size(); i++) {
+      Long time = allList.get(i).getTime();
+      times.add(sdf.format(new Date(time)));
+
+      for (int j = 0; j < displayCode.length; j++) {
+
+        if (displayCode[j].equals("shortTermAccuracy")) {
+          String str = allList.get(i).getShortTermAccuracy();
+          shortTermAccuracys.add(str);
+        }
+
+        if (displayCode[j].equals("shortTermPassRate")) {
+          String str = allList.get(i).getShortTermPassRate();
+          shortTermPassRate.add(str);
+        }
+
+        if (displayCode[j].equals("ultraShortTermAccuracy")) {
+          String str = allList.get(i).getUltraShortTermAccuracy();
+          ultraShortTermAccuracy.add(str);
+        }
+
+        if (displayCode[j].equals("ultraShortTermPassRate")) {
+          String str = allList.get(i).getUltraShortTermPassRate();
+          ultraShortTermPassRate.add(str);
+        }
+      }
+
+    }
+
+    for (int i = 0; i < displayCode.length; i++) {
+
+
+      if (displayCode[i].equals("shortTermAccuracy")) {
+
+        map.put(displayCode[i], shortTermAccuracys);
+      }
+
+      if (displayCode[i].equals("shortTermPassRate")) {
+
+        map.put(displayCode[i], shortTermPassRate);
+      }
+
+      if (displayCode[i].equals("ultraShortTermAccuracy")) {
+
+        map.put(displayCode[i], ultraShortTermAccuracy);
+      }
+
+      if (displayCode[i].equals("ultraShortTermPassRate")) {
+
+        map.put(displayCode[i], ultraShortTermPassRate);
+      }
+
+    }
+
+    return map;
+  }
+
+
+  /**
+   * 日准确率合格率 yh(用于图表)
+   *
+   * @param startTime 开始时间 当天凌晨
+   * @param endTime   结束时间 当前时间
+   * @param showCode  展示配置
+   * @return
+   */
+  @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
+  public Map<String, Object> findByTimeBetweenForRealTimeChartsDay(Long startTime, Long endTime, String showCode) {
+    // 根据检索的时间段,查询准确率数据
+    List<AccuracyPassRateDayOne> byTimeBetween = accuracyPassRateDayOneRepository.findByTimeBetween(startTime, endTime);
+    // 设定默认准确率
+    String accuracyRate = super.getSysParameter("ACCURACY_RATE", "75,85");
+    // 补全时间段内数据
+    List<AccuracyPassRateDayOne> allList = checkDataDay(startTime, endTime, byTimeBetween);
+    //过滤数据
+    exchangeValueDay(allList);
+    // 根据时间排序
+    allList.sort(Comparator.comparing(AccuracyPassRateDayOne::getTime));
+
+    String[] displayCode = showCode.split(",");
+
+    Map<String, Object> resultMap = new HashMap<>();
+
+    List<String> times = new ArrayList<>();
+    resultMap.put("times", times);
+    resultMap.put("accuracyRate", accuracyRate);
+
+    List<String> shortTermAccuracys = new ArrayList<>();
+    List<String> shortTermPassRate = new ArrayList<>();
+    List<String> ultraShortTermAccuracy = new ArrayList<>();
+    List<String> ultraShortTermPassRate = new ArrayList<>();
+
+    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+    // 循环数据,并分别组建短期准确率、短期合格率、超短期准确率、超短期合格率
+    for (int i = 0; i < allList.size(); i++) {
+      times.add(sdf.format(new Date(allList.get(i).getTime())));
+      // 循环displayCode,并组建数据
+      for (int j = 0; j < displayCode.length; j++) {
+        // 如果是短期准确率
+        if (displayCode[j].equals("shortTermAccuracy")) {
+          shortTermAccuracys.add(allList.get(i).getShortTermAccuracy());
+        }
+        // 如果是短期合格率
+        if (displayCode[j].equals("shortTermPassRate")) {
+          shortTermPassRate.add(allList.get(i).getShortTermPassRate());
+        }
+        // 如果是超短期准确率
+        if (displayCode[j].equals("ultraShortTermAccuracy")) {
+          ultraShortTermAccuracy.add(allList.get(i).getUltraShortTermAccuracy());
+        }
+        // 如果是超短期合格率
+        if (displayCode[j].equals("ultraShortTermPassRate")) {
+          ultraShortTermPassRate.add(allList.get(i).getUltraShortTermPassRate());
+        }
+      }
+    }
+
+    // 循环displayCode,并将结果放入resultMap
+    for (int i = 0; i < displayCode.length; i++) {
+      if (displayCode[i].equals("shortTermAccuracy")) {
+        resultMap.put(displayCode[i], shortTermAccuracys);
+      }
+      if (displayCode[i].equals("shortTermPassRate")) {
+        resultMap.put(displayCode[i], shortTermPassRate);
+      }
+      if (displayCode[i].equals("ultraShortTermAccuracy")) {
+        resultMap.put(displayCode[i], ultraShortTermAccuracy);
+      }
+      if (displayCode[i].equals("ultraShortTermPassRate")) {
+        resultMap.put(displayCode[i], ultraShortTermPassRate);
+      }
+    }
+
+    return resultMap;
+  }
+
+  /**
+   * @param startTime     开始时间
+   * @param endTime       结束时间
+   * @param byTimeBetween 需要补全时间的数据
+   * @param timeStep      时间间隔
+   * @return 补全后数据
+   */
+  private List<AccuracyPassRateOne> checkData(Long startTime, Long endTime, List<AccuracyPassRateOne> byTimeBetween, long timeStep) {
+    List<AccuracyPassRateOne> rtList = new ArrayList<>();
+    //补全数据
+    for (long i = startTime; i <= endTime; i = i + timeStep) {
+      long finalI = i;
+      List<AccuracyPassRateOne> a = byTimeBetween.stream().filter(t -> t.getTime() == finalI).collect(Collectors.toList());
+      if (a != null && a.size() > 0) {
+        AccuracyPassRateOne aResult = a.get(0);
+        rtList.add(aResult);
+      } else {
+        AccuracyPassRateOne accuracyPassRate = new AccuracyPassRateOne();
+        accuracyPassRate.setTime(finalI);
+        rtList.add(accuracyPassRate);
+      }
+    }
+    return rtList;
+  }
+
+  /**
+   * @param startTime     开始时间
+   * @param endTime       结束时间
+   * @param byTimeBetween 需要补全时间的数据
+   * @return 补全后数据
+   */
+  private List<AccuracyPassRateDayOne> checkDataDay(Long startTime, Long endTime, List<AccuracyPassRateDayOne> byTimeBetween) {
+    List<AccuracyPassRateDayOne> resultList = new ArrayList<>();
+    // 根据时间段,将时间段以日期为单位转为list
+    List<DateTime> dateTimes = DateUtil.rangeToList(new Date(startTime), new Date(endTime), DateField.DAY_OF_YEAR);
+    //补全数据
+    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+    for (int i = 0; i < dateTimes.size(); i++) {
+      int finalI = i;
+      // 根据准确率数据中,是否包含时间段中的时间(格式化时间为yyyy-MM-dd并对比)
+      List<AccuracyPassRateDayOne> checkInclude = byTimeBetween.stream().filter(t -> sdf.format(DateUtil.date(t.getTime())).equals(sdf.format(dateTimes.get(finalI)))).sorted(Comparator.comparing(AccuracyPassRateDayOne::getId).reversed()).collect(Collectors.toList());
+      // 如果包含,则放入数据
+      if (checkInclude != null && checkInclude.size() > 0) {
+        // 获取最新一条
+        AccuracyPassRateDayOne aResult = checkInclude.get(0);
+        resultList.add(aResult);
+      // 如果不包含,则只插入时间
+      } else {
+        AccuracyPassRateDayOne accuracyPassRateDay = new AccuracyPassRateDayOne();
+        accuracyPassRateDay.setTime(dateTimes.get(finalI).getTime());
+        resultList.add(accuracyPassRateDay);
+      }
+    }
+    return resultList;
+  }
+
+
+
+  /**
+   * 查询条件 yh
+   *
+   * @param startTime 开始时间
+   * @param endTime   结束时间
+   * @return 过滤条件
+   */
+  Specification<AccuracyPassRateOne> specificationFindByTime(final Long startTime, final Long endTime) {
+    return (Specification<AccuracyPassRateOne>) (root, criteriaQuery, cb) -> {
+
+
+      List<Predicate> predicates = new ArrayList<>();
+      if (startTime != null) {
+        //大于或等于传入时间
+        predicates.add(cb.greaterThanOrEqualTo(root.get("time").as(Long.class), startTime));
+      }
+      if (endTime != null) {
+        //小于传入时间
+        predicates.add(cb.lessThan(root.get("time").as(Long.class), endTime));
+      }
+      //添加排序的功能
+      return cb.and(predicates.toArray(new Predicate[predicates.size()]));
+
+    };
+  }
+
+  /**
+   * 更换数据
+   *
+   * @param rateList 需要更换数据的集合
+   */
+  private void exchangeValue(List<AccuracyPassRateOne> rateList) {
+    for (int i = 0; i < rateList.size(); i++) {
+      String shortTermAccuracy = rateList.get(i).getShortTermAccuracy();
+      String ultraShortTermAccuracy = rateList.get(i).getUltraShortTermAccuracy();
+      String shortTermPassRate = rateList.get(i).getShortTermPassRate();
+      String ultraShortTermPassRate = rateList.get(i).getUltraShortTermPassRate();
+      if (shortTermAccuracy != null && shortTermAccuracy.equals("无可用数据计算")) {
+        rateList.get(i).setShortTermAccuracy(null);
+      }
+      if (ultraShortTermAccuracy != null && ultraShortTermAccuracy.equals("无可用数据计算")) {
+        rateList.get(i).setUltraShortTermAccuracy(null);
+      }
+      if (shortTermPassRate != null && shortTermPassRate.equals("无可用数据计算")) {
+        rateList.get(i).setShortTermPassRate(null);
+      }
+      if (ultraShortTermPassRate != null && ultraShortTermPassRate.equals("无可用数据计算")) {
+        rateList.get(i).setUltraShortTermPassRate(null);
+      }
+    }
+  }
+
+  /**
+   * 更换数据
+   *
+   * @param rateList 需要更换数据的集合
+   */
+  private void exchangeValueDay(List<AccuracyPassRateDayOne> rateList) {
+    for (int i = 0; i < rateList.size(); i++) {
+      String shortTermAccuracy = rateList.get(i).getShortTermAccuracy();
+      String ultraShortTermAccuracy = rateList.get(i).getUltraShortTermAccuracy();
+      String shortTermPassRate = rateList.get(i).getShortTermPassRate();
+      String ultraShortTermPassRate = rateList.get(i).getUltraShortTermPassRate();
+      if (shortTermAccuracy != null && shortTermAccuracy.equals("无可用数据计算")) {
+        rateList.get(i).setShortTermAccuracy(null);
+      }
+      if (ultraShortTermAccuracy != null && ultraShortTermAccuracy.equals("无可用数据计算")) {
+        rateList.get(i).setUltraShortTermAccuracy(null);
+      }
+      if (shortTermPassRate != null && shortTermPassRate.equals("无可用数据计算")) {
+        rateList.get(i).setShortTermPassRate(null);
+      }
+      if (ultraShortTermPassRate != null && ultraShortTermPassRate.equals("无可用数据计算")) {
+        rateList.get(i).setUltraShortTermPassRate(null);
+      }
+    }
+  }
+
+
+}