yuyu
2023-08-18 4af9a5d043aa4e29f43b8f8e2a21e41d6827ab6f
8.18 合格率统计
已修改6个文件
348 ■■■■■ 文件已修改
.env.development 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.production 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.staging 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/index.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/experiment/passRateStatistics/index.vue 327 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.development
@@ -2,4 +2,4 @@
ENV = 'development'
# base api
VUE_APP_BASE_API = 'http://localhost:1234/'
VUE_APP_BASE_API = 'http://192.168.110.87:1234/'
.env.production
@@ -3,5 +3,5 @@
# base api
# VUE_APP_BASE_API = '/prod-api'
VUE_APP_BASE_API = 'http://localhost:1234/'
VUE_APP_BASE_API = 'http://192.168.110.87:1234/'
.env.staging
@@ -5,6 +5,6 @@
# base api
# VUE_APP_BASE_API = '/stage-api'
VUE_APP_BASE_API = 'http://localhost:1234/'
VUE_APP_BASE_API = 'http://192.168.110.87:1234/'
package.json
@@ -18,6 +18,7 @@
    "amfe-flexible": "^2.2.1",
    "axios": "0.18.1",
    "core-js": "3.6.5",
    "echarts": "^5.4.3",
    "element-ui": "2.13.2",
    "js-cookie": "2.2.0",
    "normalize.css": "7.0.0",
src/layout/index.vue
@@ -8,8 +8,12 @@
      </div>
      <div class="clearFixed" />
      <!-- 清除定位的影响 -->
      <div class="breadcrumb">
      <Breadcrumb class="breadcrumb-container" ref="breadcrumb" />
      </div>
      <div class="app-main">
      <app-main ref="main" @triggerCombackBtn="triggerCombackBtn"/>
      </div>
    </div>
  </div>
</template>
@@ -78,10 +82,20 @@
      box-shadow: 0 0 0.857143rem rgba(0,0,0,.12);
    }
    .main-container{
      position: relative;
      background:  #f0f2f5;
      .clearFixed{
        height: 50px;
      }
      .breadcrumb{
        position: fixed;
        left: 0.57rem !important;
        width: 93.8%;
        z-index: 999;
      }
      .app-main{
        margin-top: 4vh;
      }
    }
  }
  .drawer-bg {
src/views/experiment/passRateStatistics/index.vue
@@ -1,13 +1,336 @@
<template>
  <div>合格率统计</div>
  <div class="content-main">
    <div class="top-bar">
      <el-form ref="form" :inline="true" :rules="rules" :model="searchData" label-position="top">
              <el-form-item label="检测日期:" class="sermargin" prop="date">
                <el-date-picker
                  v-model="searchData.date"
                  type="daterange"
                  range-separator="至"
                  start-placeholder="开始日期"
                  end-placeholder="结束日期">
                </el-date-picker>
              </el-form-item>
              <el-form-item label="检验类型:" class="sermargin" prop="type">
                <el-select v-model="searchData.type" placeholder="全部">
                  <el-option
                    v-for="item in options"
                    :key="item.value"
                    :label="item.label"
                    :value="item.value">
                  </el-option>
                </el-select>
              </el-form-item>
              <el-form-item label="物料分组:">
                <el-button type="primary" icon="el-icon-plus" class="chooseMaterialBtn" >选择物料分组</el-button>
              </el-form-item>
              <div class="rightBtn">
                <el-form-item>
                  <el-button type="primary" plain size="mini">清空</el-button>
                  <el-button type="primary" @click="search" size="mini">查询</el-button>
                </el-form-item>
              </div>
              </el-form>
    </div>
    <div class="chart-content">
      <div class="qualified-wrapper">
        <div style="margin-left: 20px;padding:20px 0px;font-size:18px">检测批次合格率统计</div>
        <div class="qualified" ref="qualified"></div>
      </div>
      <div class="unqualified">
          <div class="firstBox-wrapper" >
            <div style="margin-left: 20px;padding:20px 0px;font-size:18px">供应商不合格次数统计</div>
            <div class="firstBox" ref="unqualified_provider"></div>
          </div>
        <div class="secondBox-wrapper" >
          <div class="secondBox_header">
            <div style="font-size:18px">不合格项目统计</div>
            <el-radio-group v-model="type">
              <el-radio-button v-for="item in radiooptions" :key="item.value" :label="item.value" >{{ item.label }}</el-radio-button>
            </el-radio-group>
          </div>
          <div class="secondBox" ref="unqualified_project"></div>
        </div>
      </div>
    </div>
    <div class="bottom">
      <el-button type="primary" size="mini" >数据导出</el-button>
    </div>
  </div>
</template>
<script>
import * as echarts from 'echarts'
export default {
  data(){
    return {
      searchData:{
        date: [],
        type: 0,
        group: ''
      },
      options:[
        {
          label: '采购入库',
          value: 0
        },
        {
          label: 'xxxx',
          value: 1
        }
      ],
      radiooptions:[
        {
          label: '环形饼图',
          value: 0
        },
        {
          label: '帕累托图',
          value: 1
        }
      ],
      type: 0,
      rules: {
        date: [{required: true, message: '请输入账号', trigger: 'blur'}],
        type: [{required: true, message: '请输入名字', trigger: 'blur'}]
      }
    }
  },
  mounted() {
    const chartDom_qualified = this.$refs.qualified;
    const chartDom_unqualified_provider = this.$refs.unqualified_provider;
    const chartDom_unqualified_project = this.$refs.unqualified_project;
    const myChart1 = echarts.init(chartDom_qualified);
    const myChart2 = echarts.init(chartDom_unqualified_provider);
    const myChart3 = echarts.init(chartDom_unqualified_project);
    const option_qualified = {
      tooltip: {
        trigger: 'axis',
        axisPointer: { // 坐标轴指示器,坐标轴触发有效
          type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
        }
      },
      legend: {
        data: ['数据1', '数据2', '数据3']
      },
      xAxis: [
        {
          type: 'category',
          data: ['第一批', '第二批', '第三批', '第四批']
        }
      ],
      yAxis: [
        {
          type: 'value',
          axisLabel: {
            formatter: '{value}'
          }
        }
      ],
      series: [
        {
          name: '数据1',
          type: 'bar',
          data: [7245, 3475, 1237, 3456]
        },
        {
          name: '数据2',
          type: 'bar',
          data: [9965, 9075, 4875, 8687]
        },
        {
          name: '数据3',
          type: 'line',
          yAxisIndex: 0,
          symbolSize: 3, // 折线节点的大小
          symbol: 'circle', // 折线节点的形状
          smooth: false, // 平滑曲线
          data: [1465, 6437, 3257, 6537]
        }
      ]
    };
    const option_unqualified1 ={
      tooltip: {
        trigger: 'axis',
        axisPointer: { // 坐标轴指示器,坐标轴触发有效
          type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
        },
        formatter: function(params) {
          let tooltip = params[0].name + '<br/>';
          params.forEach(function(item) {
            tooltip += item.marker + ' ' + item.seriesName + ': ' + item.value.toFixed(2) + '%<br/>'; // 将数据保留两位小数并转为百分比形式
          });
          return tooltip;
        }
      },
      legend: {
        data: ['合格数量', '不合格数量']
      },
      xAxis: {
        data: ['供应商1', '供应商2', '供应商3', '供应商4']
      },
      yAxis: [
          {
            type: 'value',
            axisLabel: {
              formatter: '{value}%'
            }
          }
        ],
      series: [
        {
          name: '合格数量',
          data: [52, 46, 39, 66],
          type: 'bar',
          stack: 'x'
        },
        {
          name: '不合格数量',
          data: [47, 53, 60, 33],
          type: 'bar',
          stack: 'x'
        }
      ]
    };
    const option_unqualified2 = {
      legend: {
        orient: 'vertical',
        x: 'left',
        data: ['绝缘偏心率', '试验结果', '导体屏蔽最大值']
      },
      title: {
        text: '',
        left: 'center',
        top: 'center'
      },
      series: [
        {
          type: 'pie',
          data: [
            {
              value: 40,
              name: '绝缘偏心率'
            },
            {
              value: 20,
              name: '试验结果'
            },
            {
              value: 40,
              name: '导体屏蔽最大值'
            }
          ],
          radius: ['40%', '70%'],
          label: {
            show: true,
            formatter: '{b}: {c}'
          },
        }
      ]
    }
    myChart1.setOption(option_qualified);
    myChart2.setOption(option_unqualified1);
    if(this.type === 0){
      myChart3.setOption(option_unqualified2);
    }
    if(this.type === 1){
      myChart3.setOption(option_unqualified2);
    }
  }
}
</script>
<style lang="scss" scoped>
.content-main{
  height: 100%;
  .top-bar{
    position: fixed;
    width: 93.8%;
    top: 0;
    left:0;
    z-index: 999;
    margin-top: 0.48rem;
    margin-left: 0.56rem;
    background-color: #fff;
    display: flex;
    justify-content: space-between;
    padding: 5px 24px 0px 24px;
    .el-form{
      width: 100%;
      .chooseMaterialBtn{
        background-color: #fff;
        border-color: rgba(192,196,204,0.5);
        color: gray;
        width: 220px;
      }
    }
    .sermargin{
      margin-right: 60px;
    }
    .rightBtn{
      display:flex;
      justify-content:end;
      margin-right: 20px;
      margin-top: -30px;
      margin-bottom: -10px;
    }
  }
  .chart-content{
    margin: 0px -15px;
    overflow-y:auto;
    margin-bottom: 60px;
    .qualified-wrapper{
      margin-top: 14vh;
      background-color: #fff;
      width: 100%;
      height:50vh;
    }
    .qualified{
      width: 100%;
      height: 400px;
    }
    .unqualified{
      margin-top: 10px;
      height: 50vh;
      display:flex;
      justify-content: space-between;
      .firstBox-wrapper{
        background-color: #fff;
        width:49%;
        .firstBox{
          width: 100%;
          height: 40vh;
        }
      }
      .secondBox-wrapper{
        background-color:#fff;
        width:49%;
        .secondBox_header{
          display:flex;
          justify-content: space-between;
          margin: 20px 20px;
        }
        .secondBox{
          width: 100%;
          height: 40vh;
        }
      }
    }
  }
  .bottom{
    position: fixed;
    width: 95%;
    bottom: 0rem !important;
    left: 0.6rem !important;
    margin: 0px -15px;
    padding: 20px 40px;
    z-index: 999;
    display:flex;
    justify-content: end;
    background-color: #fff;
  }
}
</style>