349 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			349 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
<template>
 | 
						|
  <div>
 | 
						|
    <div class="containerTop">
 | 
						|
      <bmSearchBar @getSearch="getSearch" @handleExport="handleExport" />
 | 
						|
    </div>
 | 
						|
    <div class="containerBottom">
 | 
						|
      <div class="smallTitle">标准组件良率</div>
 | 
						|
      <bm-line-bar
 | 
						|
        :chartHeight="chartHeight"
 | 
						|
        :legendList="legendList"
 | 
						|
        :chartMsg="chartMsg"
 | 
						|
        :chartId="chartId"
 | 
						|
        :chartNum="chartNum"
 | 
						|
      />
 | 
						|
      <base-table
 | 
						|
        :table-props="tableProps"
 | 
						|
        :page="listQuery.current"
 | 
						|
        :limit="listQuery.size"
 | 
						|
        :table-data="tableData"
 | 
						|
        :max-height="tableH"
 | 
						|
      />
 | 
						|
    </div>
 | 
						|
  </div>
 | 
						|
</template>
 | 
						|
 | 
						|
<script>
 | 
						|
import bmSearchBar from "../components/bmSearchBar.vue";
 | 
						|
import BmLineBar from "../components/bmLineBar.vue";
 | 
						|
import {
 | 
						|
  componentyieldRatePage,
 | 
						|
  componentyieldRateExport,
 | 
						|
} from "@/api/report/benchmarking.js";
 | 
						|
import moment from "moment";
 | 
						|
export default {
 | 
						|
  name: "SCYieldBM",
 | 
						|
  data() {
 | 
						|
    return {
 | 
						|
      factoryList: [
 | 
						|
        { id: 0, name: "瑞昌" },
 | 
						|
        { id: 1, name: "邯郸" },
 | 
						|
      ],
 | 
						|
      tableProps: [],
 | 
						|
      tableProps1: [
 | 
						|
        {
 | 
						|
          prop: "factory",
 | 
						|
          label: "工厂名称",
 | 
						|
          filter: (val) => this.factoryList[val].name,
 | 
						|
          minWidth: 150,
 | 
						|
          showOverflowtooltip: true,
 | 
						|
        },
 | 
						|
        {
 | 
						|
          prop: "item",
 | 
						|
          label: "科目",
 | 
						|
          minWidth: 120,
 | 
						|
          showOverflowtooltip: true,
 | 
						|
        },
 | 
						|
        {
 | 
						|
          prop: "unit",
 | 
						|
          label: "单位",
 | 
						|
          minWidth: 80,
 | 
						|
          showOverflowtooltip: true,
 | 
						|
        },
 | 
						|
      ],
 | 
						|
      listQuery: {
 | 
						|
        current: 1,
 | 
						|
        size: 100,
 | 
						|
      },
 | 
						|
      tableData: [],
 | 
						|
      chartHeight: this.tableHeight(269) / 2,
 | 
						|
      tableH: this.tableHeight(269) / 2,
 | 
						|
      legendList: [
 | 
						|
        { id: 1, name: "", type: 2, color: "#FFCE6A" },
 | 
						|
        { id: 2, name: "", type: 1, color: "#8EF0AB" },
 | 
						|
        { id: 3, name: "", type: 1, color: "#288AFF" },
 | 
						|
      ],
 | 
						|
      chartMsg: {
 | 
						|
        color: ["#FFCE6A", "#8EF0AB", "#288AFF"],
 | 
						|
        xData: [],
 | 
						|
        yName: "单位/%",
 | 
						|
        series: [
 | 
						|
          {
 | 
						|
            name: "1",
 | 
						|
            data: [],
 | 
						|
            type: "line",
 | 
						|
            symbol: "circle",
 | 
						|
            symbolSize: 6,
 | 
						|
            label: {
 | 
						|
              show: true,
 | 
						|
              color: "#FFAE17",
 | 
						|
              formatter: function (params) {
 | 
						|
                return params.value.toFixed(2) + "%";
 | 
						|
              },
 | 
						|
            },
 | 
						|
          },
 | 
						|
          {
 | 
						|
            name: "2",
 | 
						|
            data: [],
 | 
						|
            type: "bar",
 | 
						|
              barWidth: 16,
 | 
						|
            label: {
 | 
						|
              show: true,
 | 
						|
              position: [-18, -16],
 | 
						|
              color: "#68C483",
 | 
						|
              formatter: function (params) {
 | 
						|
                return params.value.toFixed(2) + "%";
 | 
						|
              },
 | 
						|
            },
 | 
						|
          },
 | 
						|
          {
 | 
						|
            name: "3",
 | 
						|
            data: [],
 | 
						|
            type: "bar",
 | 
						|
              barWidth: 16,
 | 
						|
            label: {
 | 
						|
              show: true,
 | 
						|
              position: [0, -16],
 | 
						|
              color: "#288AFF",
 | 
						|
              formatter: function (params) {
 | 
						|
                return params.value.toFixed(2) + "%";
 | 
						|
              },
 | 
						|
            },
 | 
						|
          },
 | 
						|
        ],
 | 
						|
      },
 | 
						|
      chartId: "scYieldBMChart",
 | 
						|
      chartNum: 1,
 | 
						|
    };
 | 
						|
  },
 | 
						|
  components: {
 | 
						|
    bmSearchBar,
 | 
						|
    BmLineBar,
 | 
						|
  },
 | 
						|
  computed: {
 | 
						|
    isOpen() {
 | 
						|
      return this.$store.getters.sidebar.opened;
 | 
						|
    },
 | 
						|
  },
 | 
						|
  watch: {
 | 
						|
    // 监听左侧菜单栏是否展开
 | 
						|
    isOpen(val) {
 | 
						|
      if (this.$route.name === "SCYieldBM") {
 | 
						|
        this.chartNum++;
 | 
						|
      }
 | 
						|
    },
 | 
						|
  },
 | 
						|
  created() {
 | 
						|
    this.tableH = this.tableHeight(269) / 2;
 | 
						|
    this.chartHeight = this.tableHeight(269) / 2;
 | 
						|
    window.addEventListener("resize", this._setTableHeight);
 | 
						|
  },
 | 
						|
  mounted() {
 | 
						|
    this.tableProp = this.tableProp1;
 | 
						|
    this.listQuery.type = 2;
 | 
						|
    this.listQuery.startDate = moment().format("yyyy-MM-DD");
 | 
						|
    this.listQuery.factory = [];
 | 
						|
    this.getList();
 | 
						|
  },
 | 
						|
  destroyed() {
 | 
						|
    window.removeEventListener("resize", this._setTableHeight);
 | 
						|
  },
 | 
						|
  activated() {
 | 
						|
    // 图重新加载,为了防止窗口变化后尺寸图显示不佳,数据不更新
 | 
						|
    if (this.$route.name === "SCYieldBM") {
 | 
						|
      this.chartNum++;
 | 
						|
    }
 | 
						|
  },
 | 
						|
  methods: {
 | 
						|
    _setTableHeight() {
 | 
						|
      this.tableH = this.tableHeight(269) / 2;
 | 
						|
      this.chartHeight = this.tableHeight(269) / 2;
 | 
						|
      if (this.$route.name === "SCYieldBM") {
 | 
						|
        this.chartNum++;
 | 
						|
      }
 | 
						|
    },
 | 
						|
    getSearch(val) {
 | 
						|
      this.listQuery.type = val.type;
 | 
						|
      this.listQuery.startDate = val.startDate;
 | 
						|
      this.listQuery.factory = val.factory;
 | 
						|
      this.getList();
 | 
						|
    },
 | 
						|
    getList() {
 | 
						|
      this.tableProps = [];
 | 
						|
      componentyieldRatePage({ ...this.listQuery }).then((res) => {
 | 
						|
        if (res.data && res.data.records.length > 0) {
 | 
						|
          let msg = res.data.records[0];
 | 
						|
          let arr = [
 | 
						|
            {
 | 
						|
              prop: "yoy",
 | 
						|
              label: msg.yoyColumn,
 | 
						|
              filter: (val) => (val || val === 0 ? val : "-"),
 | 
						|
              minWidth: 150,
 | 
						|
            },
 | 
						|
            {
 | 
						|
              prop: "queryValue",
 | 
						|
              label: msg.queryColumn,
 | 
						|
              filter: (val) => (val || val === 0 ? val : "-"),
 | 
						|
              minWidth: 150,
 | 
						|
            },
 | 
						|
            {
 | 
						|
              prop: "target",
 | 
						|
              label: msg.targetColumn,
 | 
						|
              filter: (val) => (val || val === 0 ? val : "-"),
 | 
						|
              minWidth: 150,
 | 
						|
            },
 | 
						|
          ];
 | 
						|
          this.tableProps = this.tableProps1.concat(arr);
 | 
						|
          this.tableData = res.data.records;
 | 
						|
          // 设置图例
 | 
						|
          this.legendList[0].name = msg.targetColumn;
 | 
						|
          this.legendList[1].name = msg.yoyColumn;
 | 
						|
          this.legendList[2].name = msg.queryColumn;
 | 
						|
          this.chartMsg.series[0].name = msg.targetColumn;
 | 
						|
          this.chartMsg.series[1].name = msg.yoyColumn;
 | 
						|
          this.chartMsg.series[2].name = msg.queryColumn;
 | 
						|
          // 设置chartMsg的series的数据
 | 
						|
          this.setChartMsg(res.data.records);
 | 
						|
        } else {
 | 
						|
          // 重置
 | 
						|
          this.resetMsg();
 | 
						|
        }
 | 
						|
      });
 | 
						|
    },
 | 
						|
    setChartMsg(val) {
 | 
						|
      let xData = [];
 | 
						|
      let lineData = [];
 | 
						|
      let barData1 = [];
 | 
						|
      let barData2 = [];
 | 
						|
      for (let i = 0; i < val.length; i++) {
 | 
						|
        this.factoryList.map((item) => {
 | 
						|
          if (item.id === val[i].factory) {
 | 
						|
            xData.push(item.name);
 | 
						|
          }
 | 
						|
        });
 | 
						|
        lineData.push({
 | 
						|
          name: "%",
 | 
						|
          value: val[i].target || 0,
 | 
						|
        });
 | 
						|
        barData1.push({ name: "%", value: val[i].yoy || 0 });
 | 
						|
        barData2.push({
 | 
						|
          name: "%",
 | 
						|
          value: val[i].queryValue || 0,
 | 
						|
        });
 | 
						|
      }
 | 
						|
      this.chartMsg.xData = xData;
 | 
						|
      this.chartMsg.series[0].data = lineData;
 | 
						|
      this.chartMsg.series[1].data = barData1;
 | 
						|
      this.chartMsg.series[2].data = barData2;
 | 
						|
      this.chartMsg.xData = xData;
 | 
						|
    },
 | 
						|
    resetMsg() {
 | 
						|
      this.tableProps = this.tableProps1;
 | 
						|
      this.tableData = [];
 | 
						|
      this.chartMsg = {
 | 
						|
        color: ["#FFCE6A", "#8EF0AB", "#288AFF"],
 | 
						|
        xData: [],
 | 
						|
        yName: "单位/%",
 | 
						|
        series: [
 | 
						|
          {
 | 
						|
            name: "1",
 | 
						|
            data: [],
 | 
						|
            type: "line",
 | 
						|
            symbol: "circle",
 | 
						|
            symbolSize: 6,
 | 
						|
            label: {
 | 
						|
              show: true,
 | 
						|
              color: "#FFAE17",
 | 
						|
              formatter: function (params) {
 | 
						|
                return params.value.toFixed(2) + "%";
 | 
						|
              },
 | 
						|
            },
 | 
						|
          },
 | 
						|
          {
 | 
						|
            name: "2",
 | 
						|
            data: [],
 | 
						|
            type: "bar",
 | 
						|
              barWidth: 16,
 | 
						|
            label: {
 | 
						|
              show: true,
 | 
						|
              position: [-18, -16],
 | 
						|
              color: "#68C483",
 | 
						|
              formatter: function (params) {
 | 
						|
                return params.value.toFixed(2) + "%";
 | 
						|
              },
 | 
						|
            },
 | 
						|
          },
 | 
						|
          {
 | 
						|
            name: "3",
 | 
						|
            data: [],
 | 
						|
            type: "bar",
 | 
						|
              barWidth: 16,
 | 
						|
            label: {
 | 
						|
              show: true,
 | 
						|
              position: [0, -16],
 | 
						|
              color: "#288AFF",
 | 
						|
              formatter: function (params) {
 | 
						|
                return params.value.toFixed(2) + "%";
 | 
						|
              },
 | 
						|
            },
 | 
						|
          },
 | 
						|
        ],
 | 
						|
      };
 | 
						|
    },
 | 
						|
    handleExport(val) {
 | 
						|
      this.listQuery.type = val.type;
 | 
						|
      this.listQuery.startDate = val.startDate;
 | 
						|
      this.listQuery.factory = val.factory;
 | 
						|
      let fileName = "标准组件良率对标.xls";
 | 
						|
      componentyieldRateExport({ ...this.listQuery })
 | 
						|
        .then((response) => {
 | 
						|
          this.$download.excel(response, fileName);
 | 
						|
          this.$message.success("导出成功");
 | 
						|
        })
 | 
						|
        .catch(() => {});
 | 
						|
    },
 | 
						|
  },
 | 
						|
};
 | 
						|
</script>
 | 
						|
 | 
						|
<style lang="scss" scoped>
 | 
						|
.containerTop {
 | 
						|
  height: 64px;
 | 
						|
}
 | 
						|
.containerTop,
 | 
						|
.containerBottom {
 | 
						|
  position: relative;
 | 
						|
  background-color: #fff;
 | 
						|
  border-radius: 8px;
 | 
						|
  padding: 16px;
 | 
						|
}
 | 
						|
.containerBottom {
 | 
						|
  height: calc(100vh - 201px);
 | 
						|
  margin-top: 8px;
 | 
						|
  .smallTitle {
 | 
						|
    font-size: 16px;
 | 
						|
    color: #000;
 | 
						|
    margin-bottom: 15px;
 | 
						|
  }
 | 
						|
  .smallTitle::before {
 | 
						|
    display: inline-block;
 | 
						|
    width: 4px;
 | 
						|
    height: 16px;
 | 
						|
    background: #0b58ff;
 | 
						|
    content: "";
 | 
						|
    margin-right: 8px;
 | 
						|
    vertical-align: -3px;
 | 
						|
  }
 | 
						|
}
 | 
						|
</style>
 |