gaoluyang
23 小时以前 e0cb2008ffb01348b54a7370180a100f3c975877
src/views/reportAnalysis/qualityAnalysis/components/center-bottom.vue
@@ -1,18 +1,23 @@
<template>
  <div>
    <PanelHeader title="工单执行效率分析" />
    <div class="chart-header">
      <div class="chart-header-title">
        <PanelHeader title="完成检验数" />
      </div>
      <div class="warn-range" @click="handleRangeClick">近7天</div>
    </div>
    <div class="main-panel panel-item-customers">
      <Echarts
          ref="chart"
          :chartStyle="chartStyle"
          :grid="grid"
          :legend="barLegend"
          :series="chartSeries"
          :tooltip="tooltip"
          :xAxis="xAxis1"
          :yAxis="yAxis1"
          :options="{ backgroundColor: 'transparent', textStyle: { color: '#B8C8E0' } }"
          style="height: 260px"
        ref="chart"
        :chartStyle="chartStyle"
        :grid="grid"
        :legend="barLegend"
        :series="chartSeries"
        :tooltip="tooltip"
        :xAxis="xAxis1"
        :yAxis="yAxis1"
        :options="{ backgroundColor: 'transparent', textStyle: { color: '#B8C8E0' } }"
        style="height: 260px"
      />
    </div>
  </div>
@@ -20,13 +25,13 @@
<script setup>
import { ref, onMounted } from 'vue'
import { qualityStatistics } from '@/api/viewIndex.js'
import { completedInspectionCount } from '@/api/viewIndex.js'
import PanelHeader from './PanelHeader.vue'
import Echarts from '@/components/Echarts/echarts.vue'
const chartStyle = {
  width: '100%',
  height: '135%',
  height: '140%',
}
const grid = { left: '3%', right: '4%', bottom: '3%', top: '10%', containLabel: true }
@@ -34,13 +39,12 @@
const barLegend = {
  show: true,
  textStyle: { color: '#B8C8E0' },
  data: ['开工', '完成'],
  data: ['合格', '不合格', '合格率'],
}
// 柱状图:开工、完成;折线图:良品率(颜色 rgba(90, 216, 166, 1))
const chartSeries = ref([
  {
    name: '开工',
    name: '合格',
    type: 'bar',
    barWidth: 20,
    barGap: '40%',
@@ -61,7 +65,7 @@
    data: [],
  },
  {
    name: '完成',
    name: '不合格',
    type: 'bar',
    barGap: '40%',
    barWidth: 20,
@@ -81,6 +85,18 @@
    },
    data: [],
  },
  {
    name: '合格率',
    type: 'line',
    yAxisIndex: 1,
    showSymbol: true,
    symbol: 'circle',
    symbolSize: 8,
    lineStyle: { color: 'rgba(90, 216, 166, 1)', width: 2 },
    itemStyle: { color: 'rgba(90, 216, 166, 1)' },
    data: [],
    emphasis: { focus: 'series' },
  },
])
const tooltip = {
@@ -89,7 +105,7 @@
  formatter(params) {
    let result = params[0].axisValueLabel + '<br/>'
    params.forEach((item) => {
      const unit = item.seriesName === '近7天'
      const unit = item.seriesName === '合格率' ? '%' : '件'
      result += `<div>${item.marker} ${item.seriesName}: ${item.value}${unit}</div>`
    })
    return result
@@ -99,11 +115,12 @@
const xAxis1 = ref([
  { type: 'category', axisTick: { show: false }, axisLabel: { color: '#B8C8E0' }, data: [] },
])
const yAxis1 = [
  { type: 'value', name: '件', axisLabel: { color: '#B8C8E0' }, nameTextStyle: { color: '#B8C8E0' } },
  {
    type: 'value',
    name: '近7天',
    name: '合格率(%)',
    min: 0,
    max: 100,
    axisLabel: { color: '#B8C8E0', formatter: '{value}%' },
@@ -113,26 +130,28 @@
]
const fetchData = () => {
  qualityStatistics()
      .then((res) => {
        if (!res?.data?.item || !Array.isArray(res.data.item)) return
        const items = res.data.item
        xAxis1.value[0].data = items.map((d) => d.date)
        // 开工:过程检验数
        chartSeries.value[0].data = items.map((d) => Number(d.processNum) || 0)
        // 完成:出厂数
        chartSeries.value[1].data = items.map((d) => Number(d.factoryNum) || 0)
        // 良品率:出厂数/过程数*100(无单独接口时用此占位)
        chartSeries.value[2].data = items.map((d) => {
          const processNum = Number(d.processNum) || 0
          const factoryNum = Number(d.factoryNum) || 0
          if (processNum <= 0) return 0
          return Math.min(100, Math.round((factoryNum / processNum) * 100))
        })
      })
      .catch((err) => {
        console.error('获取开工与良品率数据失败:', err)
      })
  completedInspectionCount()
    .then((res) => {
      if (res?.code === 200 && Array.isArray(res?.data)) {
        const items = res.data
        // 更新X轴日期数据
        xAxis1.value[0].data = items.map((d) => d.dateStr || '')
        // 更新合格数(黄色柱状图)
        chartSeries.value[0].data = items.map((d) => Number(d.qualifiedCount) || 0)
        // 更新不合格数(紫色柱状图)
        chartSeries.value[1].data = items.map((d) => Number(d.unqualifiedCount) || 0)
        // 更新合格率(蓝色折线图)
        chartSeries.value[2].data = items.map((d) => Number(d.passRate) || 0)
      }
    })
    .catch((err) => {
      console.error('获取完成检验数数据失败:', err)
    })
}
const handleRangeClick = () => {
  // 先按截图做静态"近7天",后续有真实筛选需求再接入
  fetchData()
}
onMounted(() => {
@@ -141,6 +160,42 @@
</script>
<style scoped>
.chart-header {
  position: relative;
  display: flex;
  align-items: center;
  width: 100%;
}
.chart-header-title {
  flex: 1;
  min-width: 0;
  width: 100%;
}
.warn-range {
  position: absolute;
  right: 0;
  top: 0;
  height: 32px;
  padding: 0 14px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 4px;
  color: #ffffff;
  font-weight: 600;
  font-size: 14px;
  background: linear-gradient(180deg, rgba(51, 120, 255, 1) 0%, rgba(0, 164, 237, 1) 100%);
  border: 1px solid rgba(78, 228, 255, 0.25);
  cursor: pointer;
  z-index: 10;
}
.warn-range:hover {
  background: linear-gradient(180deg, rgba(51, 140, 255, 1) 0%, rgba(0, 184, 237, 1) 100%);
}
.main-panel {
  display: flex;
  flex-direction: column;
@@ -151,6 +206,6 @@
  border: 1px solid #1a58b0;
  padding: 18px;
  width: 100%;
  height: 449px;
  height: 436px;
}
</style>