From a77c8f80470ed47568cbd90d066ebf0a84d302d9 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 03 三月 2025 13:38:49 +0800
Subject: [PATCH] 项检分析搬迁

---
 src/views/statisticalCharts/itemInspectionAnalysis/index.vue      |  535 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/views/statisticalCharts/qualificationRateStatistics/index.vue |    8 
 src/api/statisticalCharts/dataAnalysis.js                         |   44 ++++
 3 files changed, 581 insertions(+), 6 deletions(-)

diff --git a/src/api/statisticalCharts/dataAnalysis.js b/src/api/statisticalCharts/dataAnalysis.js
index 30a6fc8..0775c06 100644
--- a/src/api/statisticalCharts/dataAnalysis.js
+++ b/src/api/statisticalCharts/dataAnalysis.js
@@ -18,16 +18,56 @@
   });
 }
 //鏈湀妫�楠岀被鍨嬫暟閲�
-export function getOrderTypeCookie(query) {
+export function getOrderTypeCookie() {
   return request({
     url: "/dataAnalysis/getOrderTypeCookie",
     method: "get",
   });
 }
 //鏈湀妫�楠岀被鍨嬫暟閲�
-export function getRawUpMonth(query) {
+export function getRawUpMonth() {
   return request({
     url: "/dataAnalysis/getRawUpMonth",
     method: "get",
   });
 }
+//鏌ヨ鍘熸潗鏂欓」妫�鍒嗘瀽
+export function getRawProductAnalysis(query) {
+  return request({
+    url: "/dataAnalysis/getRawProductAnalysis",
+    method: "post",
+    data: query,
+  });
+}
+//鏌ヨ鍘熸潗鏂欓」妫�鍒嗘瀽鍚堟牸鐜�
+export function getRawProductAnalysisRawPass(query) {
+  return request({
+    url: "/dataAnalysis/getRawProductAnalysisRawPass",
+    method: "post",
+    data: query,
+  });
+}
+//鏌ヨ鍘熸潗鏂欓」妫�鍒嗘瀽鍒楄〃
+export function getRawProductAnalysisAllList(query) {
+  return request({
+    url: "/dataAnalysis/getRawProductAnalysisAllList",
+    method: "post",
+    data: query,
+  });
+}
+//鏌ヨ妫�楠岄」
+export function getRawItemNames(query) {
+  return request({
+    url: "/dataAnalysis/getRawItemNames",
+    method: "get",
+    params: query,
+  });
+}
+//鏌ヨ鍘熸潗鏂欓」妫�鍜屽巶瀹舵暟鎹姣�
+export function getRawSupplierCompare(query) {
+  return request({
+    url: "/dataAnalysis/getRawSupplierCompare",
+    method: "post",
+    data: query,
+  });
+}
diff --git a/src/views/statisticalCharts/itemInspectionAnalysis/index.vue b/src/views/statisticalCharts/itemInspectionAnalysis/index.vue
new file mode 100644
index 0000000..29616cd
--- /dev/null
+++ b/src/views/statisticalCharts/itemInspectionAnalysis/index.vue
@@ -0,0 +1,535 @@
+<template>
+  <div class="app-container">
+    <div v-if="!isShowDataCom">
+      <el-form ref="entity" size="small" :inline="true">
+        <el-form-item style="width: 16%;">
+          <el-date-picker
+            v-model="datePicker"
+            end-placeholder="缁撴潫鏃ユ湡"
+            format="yyyy-MM-dd"
+            placeholder="閫夋嫨鏃ユ湡"
+            range-separator="鑷�"
+            size="small"
+            start-placeholder="寮�濮嬫棩鏈�"
+            style="width: 100%;"
+            type="daterange"
+            value-format="yyyy-MM-dd">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="鏍峰搧鍚嶇О" prop="sampleName">
+          <el-input v-model="sampleName" clearable placeholder="璇疯緭鍏ユ牱鍝佸悕绉�" size="small"></el-input>
+        </el-form-item>
+        <el-form-item label="鍨嬪彿" prop="modelName">
+          <el-input v-model="modelName" clearable placeholder="璇疯緭鍏ュ瀷鍙�" size="small"></el-input>
+        </el-form-item>
+        <el-form-item label="渚涘簲鍟嗗悕绉�" prop="supplierName">
+          <el-input v-model="supplierName" clearable placeholder="璇疯緭鍏ヤ緵搴斿晢鍚嶇О" size="small"></el-input>
+        </el-form-item>
+        <el-form-item label="妫�楠岄」鍚嶇О" prop="supplierName">
+          <el-select v-model="itemNames" :loading="selectLoading" clearable multiple placeholder="璇烽�夋嫨"
+                     size="small" style="width: 90%;" @focus="getItemList">
+            <el-option
+              v-for="item in itemNamesList"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button size="small" type="primary" @click="changeData">鏌ヨ</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div v-if="!isShowDataCom" style="overflow-y: auto;height: calc(100% - 70px);overflow-x: hidden">
+      <el-row>
+        <el-col :span="24">
+          <div class="inspection-card">
+            <div style="display: flex;align-items: center;margin-bottom: 10px;justify-content: space-between;">
+              <div>鍘熸潗鏂欓」妫�鍒嗘瀽鍒楄〃</div>
+              <el-button size="small" type="primary" @click="openShowData">鏌ョ湅鏁版嵁鍒嗘瀽</el-button>
+            </div>
+            <lims-table :tableData="editTableData" :column="editColumn"
+                        height="400" key="tableData" :isSelection="true"
+                        :handleSelectionChange="handleSelectionChange"
+                        :tableLoading="editLoading"></lims-table>
+          </div>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="6" style="padding-top: 14px">
+          <div style="display: flex;margin-left: 10px;align-items: center">
+            <span style="width: 100px">鍒嗙粍绫诲瀷锛�</span>
+            <el-select v-model="groupType" clearable placeholder="璇烽�夋嫨"
+                       size="small"
+                       style="width: 90%;" @change="getBarInfo">
+              <el-option
+                v-for="item in groupTypeList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+              </el-option>
+            </el-select>
+          </div>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="24">
+          <div class="inspection-card">
+            <div class="title">妫�楠岄」鏁版嵁瀵规瘮</div>
+            <Echarts ref="chart"
+                     :chartStyle="chartStyle"
+                     :dataset="dataset"
+                     :grid="grid"
+                     :options="echartsOptions"
+                     :series="echartsSeries"
+                     :tooltip="tooltip"
+                     :xAxis="xAxis"
+                     :yAxis="yAxis"
+                     style="height: 40vh;"></Echarts>
+          </div>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="24">
+          <div class="inspection-card">
+            <div class="title">鍘熸潗鏂欓」妫�鍚堟牸鐜�</div>
+            <Echarts ref="chart"
+                     :chartStyle="chartStyle"
+                     :dataset="dataset1"
+                     :grid="grid"
+                     :options="echartsOptions1"
+                     :series="echartsSeries1"
+                     :tooltip="tooltip"
+                     :xAxis="xAxis"
+                     :yAxis="yAxis1"
+                     style="height: 40vh;"></Echarts>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+    <el-dialog :visible.sync="dataDialogVisible" title="鏁版嵁鏌ョ湅" width="80%">
+      <div v-if="dataDialogVisible" style="height: 70vh;overflow-y: auto;">
+        <lims-table :tableData="tableData" :column="column"
+                    @pagination="pagination" key="tableData"
+                    :page="page" :tableLoading="tableLoading"></lims-table>
+      </div>
+    </el-dialog>
+    <DataComparison v-if="isShowDataCom" :comparisonData="comparisonData"
+                    :selectRow="selectRow" @goBack="goBack"></DataComparison>
+  </div>
+</template>
+
+<script>
+import Echarts from "@/components/echarts/echarts.vue";
+import DataComparison from '@/components/echarts/DataComparison.vue'
+import limsTable from "@/components/Table/lims-table.vue";
+import {
+  getRawItemNames,
+  getRawProductAnalysis,
+  getRawProductAnalysisAllList,
+  getRawProductAnalysisRawPass, getRawSupplierCompare
+} from "@/api/statisticalCharts/dataAnalysis";
+import {selectSampleAndProductByOrderId} from "@/api/business/rawMaterialOrder";
+
+export default {
+  name: "ItemInspectionAnalysis",
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {limsTable, Echarts, DataComparison},
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      selectChangeRows: [], // 閫変腑鐨勬暟鎹�
+      groupTypeList: [
+        {label: '鏍峰搧', value: '0'},
+        {label: '鍚屼竴鍘傚, 鍚屼竴鍨嬪彿, 涓嶅悓鎵规', value: '1'},
+        {label: '鍚屼竴鍨嬪彿, 涓嶅悓鍘傚', value: '2'},
+      ],
+      itemNames: [], // 妫�楠岄」鍚嶇О
+      itemNamesList: [],
+      selectLoading: false,
+      datePicker: [], // 鏃堕棿
+      groupType: '', // 鍒嗙粍
+      beginDate: '',
+      endDate: '',
+      sampleName: '', // 鏍峰搧鍚嶇О
+      modelName: '', // 鍨嬪彿
+      supplierName: '', // 渚涘簲鍟嗗悕绉�
+      grid: {
+        left: '3%',
+        right: '4%',
+        bottom: '3%',
+        containLabel: true
+      },
+      echartsOptions: {},
+      echartsOptions1: {},
+      dataset: {
+        dimensions: [],
+        source: [],
+      },
+      dataset1: {
+        dimensions: [],
+        source: [],
+      },
+      xAxis: [{ type: 'category' }],
+      yAxis: [{}],
+      yAxis1: [{
+        axisLabel: {
+          formatter: '{value} %'
+        }
+      }],
+      echartsSeries: [],
+      echartsSeries1: [],
+      tooltip: {},
+      chartStyle: {
+        width: '100%',
+        height: '96%' // 璁剧疆鍥捐〃瀹瑰櫒鐨勯珮搴�
+      },
+      editColumn: [
+        {
+          label: '鎵瑰彿',
+          minWidth: '120px',
+          prop: 'updateBatchNo'
+        }, {
+          label: '濮旀墭缂栧彿',
+          minWidth: '120px',
+          prop: 'entrustCode'
+        }, {
+          label: '闆朵欢鍙�',
+          minWidth: '120px',
+          prop: 'partNo'
+        }, {
+          label: '闆朵欢鎻忚堪',
+          minWidth: '120px',
+          prop: 'partDesc'
+        }, {
+          label: '渚涘簲鍟嗗悕绉�',
+          minWidth: '120px',
+          prop: 'supplierName',
+        }, {
+          dataType: 'tag',
+          label: '妫�楠岀姸鎬�',
+          prop: 'inspectStatus',
+          minWidth: '120px',
+          formatData: (params) => {
+            if (params == 0) {
+              return '妫�楠屼腑'
+            } else if (params == 1) {
+              return '鍚堟牸'
+            } else if (params == 2) {
+              return '涓嶅悎鏍�'
+            } else if (params == 3) {
+              return '鏈笅鍗�'
+            } else if (params == 4) {
+              return '璁╂鏀捐'
+            }
+          },
+          formatType: (params) => {
+            if (params == 1 || params == 4) {
+              return 'success'
+            } else if (params == 3) {
+              return 'warning'
+            } else if (params == 0 || params == 2) {
+              return 'danger'
+            }
+          }
+        }, {
+          label: '鏍峰搧鍚嶇О',
+          minWidth: '300px',
+          prop: 'sampleName'
+        }, {
+          label: '鏍峰搧鍨嬪彿',
+          minWidth: '300px',
+          prop: 'sampleModel'
+        },{
+          label: '涓嬪彂鏃堕棿',
+          minWidth: '120px',
+          prop: 'sendTime'
+        },{
+          label: '鎶佃揪鐨勯噰璐暟閲�',
+          minWidth: '130px',
+          prop: 'qtyArrived'
+        },{
+          label: '鍗曚綅',
+          minWidth: '120px',
+          prop: 'buyUnitMeas'
+        },
+        {
+          dataType: 'action',
+          width: '80px',
+          label: '鎿嶄綔',
+          fixed: 'right',
+          operation: [
+            {
+              name: '鏁版嵁鏌ョ湅',
+              type: 'text',
+              clickFun: (row) => {
+                this.handleDataLook(row);
+              },
+            },
+          ]
+        }
+      ],
+      editTableData: [],
+      editLoading: false,
+      dataDialogVisible: false,
+      tableData: [],
+      tableLoading: false,
+      column: [
+        {label: '鏍峰搧缂栧彿', prop: 'sampleCode'},
+        {label: '鏍峰搧鍚嶇О', prop: 'sample'},
+        {label: '妫�楠岄」鍒嗙被', prop: 'inspectionItemClass'},
+        {label: '妫�楠岄」', prop: 'inspectionItem'},
+        {label: '妫�楠屽瓙椤�', prop: 'inspectionItemSubclass'},
+        {label: '鍗曚綅', prop: 'unit'},
+        {label: '鏍峰搧鍨嬪彿', prop: 'model'},
+        {label: '鏉′欢', prop: 'radius'},
+        {label: '鐢电紗鏍囪瘑', prop: 'cableTag'},
+        {label: '璇曢獙瑕佹眰', prop: 'tell'},
+        {label: '妫�楠岀粨鏋�', prop: 'lastValue'},
+        {
+          dataType: 'tag',
+          label: '缁撴灉鍒ゅ畾',
+          prop: 'insResult',
+          formatData: (params) => {
+            if (params == 1) {
+              return '鍚堟牸'
+            } else if (params == 0) {
+              return '涓嶅悎鏍�'
+            } else if (params == 3) {
+              return '涓嶅垽瀹�'
+            } else {
+              return null
+            }
+          },
+          formatType: (params) => {
+            if (params == 1) {
+              return 'success'
+            } else if (params == 0) {
+              return 'danger'
+            } else if (params == 3) {
+              return ''
+            }  else {
+              return null
+            }
+          }
+        }
+      ],
+      page: {
+        total:0,
+        size:10,
+        current:1
+      },
+      currentRow: {},
+      isShowDataCom: false,
+      comparisonData: {},
+      selectRow: {},
+    }
+  },
+  mounted() {
+    // this.getBar()
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    getBarInfo (val) {
+      if (val === '1') {
+        if (!this.modelName || !this.supplierName) {
+          this.$message.warning('鍨嬪彿鎴栦緵搴斿晢涓嶈兘涓虹┖')
+          this.groupType = ''
+          return
+        }
+      } else if (val === '2') {
+        if (!this.modelName) {
+          this.$message.warning('鍨嬪彿涓嶈兘涓虹┖')
+          this.groupType = ''
+          return
+        }
+        if (this.supplierName) {
+          this.$message.warning('涓嶅彲閫変緵搴斿晢鍚嶇О')
+          this.groupType = ''
+          return
+        }
+      }
+      this.getBar()
+      this.getBar1()
+    },
+    // 鑾峰彇鍚堟牸鐜囧浘琛ㄦ暟鎹�
+    getBar() {
+      this.echartsSeries = []
+      const params = {
+        beginDate: this.beginDate,
+        endDate: this.endDate,
+        sampleName: this.sampleName,
+        modelName: this.modelName,
+        supplierName: this.supplierName,
+        itemNames: this.itemNames,
+        groupType: this.groupType,
+      }
+      getRawProductAnalysis(params).then((res) => {
+        if (res.data === null) {
+          this.$message.warning('鏆傛棤鏁版嵁')
+          return
+        }
+        for (let i = 0; i < res.data.itemNames.length; i++) {
+          this.echartsSeries.push({type: 'line', label: {
+              show: true,
+              position: 'top'
+            },})
+        }
+        this.dataset.dimensions = this.HaveJson(res.data.itemNames)
+        this.dataset.dimensions.unshift('product')
+        this.dataset.source = this.HaveJson(res.data.productList)
+
+      })
+    },
+    getBar1() {
+      this.echartsSeries1 = []
+      const params = {
+        beginDate: this.beginDate,
+        endDate: this.endDate,
+        sampleName: this.sampleName,
+        modelName: this.modelName,
+        supplierName: this.supplierName,
+        itemNames: this.itemNames,
+        groupType: this.groupType,
+      }
+      getRawProductAnalysisRawPass(params).then((res) => {
+        if (res.data === null) {
+          this.$message.warning('鏆傛棤鏁版嵁')
+          return
+        }
+        for (let i = 0; i < res.data.itemNames.length; i++) {
+          this.echartsSeries1.push({type: 'line',tooltip: {
+              valueFormatter: function (value) {
+                return value + '%';
+              }
+            },label: {
+              show: true,
+              position: 'top',
+              formatter: (params) => params.value[params.dimensionNames[params.encode.y[0]]] + '%'
+            },})
+        }
+        this.dataset1.dimensions = this.HaveJson(res.data.itemNames)
+        this.dataset1.dimensions.unshift('product')
+        this.dataset1.source = this.HaveJson(res.data.productList)
+
+      })
+    },
+    // 鏁版嵁鏌ョ湅
+    handleDataLook(row) {
+      this.dataDialogVisible = true;
+      this.currentRow = row
+      this.refreshTable(row)
+    },
+    // 鏌ヨ鍥炶皟
+    refreshTable(row) {
+      selectSampleAndProductByOrderId({id: row.id}).then(res => {
+        this.tableLoading = false
+        if (res.code === 200) {
+          this.tableData = res.data.records
+          this.page.total = res.data.total
+        }
+      }).catch(err => {
+        this.tableLoading = false
+      })
+    },
+    pagination (page) {
+      this.page.size = page.limit
+      this.refreshTable(this.currentRow)
+    },
+    changeData () {
+      if (this.datePicker !== null && this.datePicker.length > 0) {
+        this.beginDate = this.datePicker[0] + ' 00:00:00'
+        this.endDate = this.datePicker[1] + ' 23:59:59'
+      } else {
+        this.beginDate = ''
+        this.endDate = ''
+      }
+      this.getBar()
+      this.getBar1()
+      this.getTableData()
+    },
+    getTableData () {
+      this.editLoading = true
+      const params = {
+        beginDate: this.beginDate,
+        endDate: this.endDate,
+        sampleName: this.sampleName,
+        modelName: this.modelName,
+        supplierName: this.supplierName,
+        itemNames: this.itemNames,
+      }
+      getRawProductAnalysisAllList(params).then(res => {
+        this.editLoading = false
+        this.editTableData = res.data
+      }).catch(() => {
+        this.editLoading = false
+      })
+    },
+    // 鑾峰彇妫�楠岄」涓嬫媺妗�
+    getItemList () {
+      this.selectLoading = true
+      this.itemNamesList = []
+      const params = {
+        beginDate: this.beginDate,
+        endDate: this.endDate,
+        sampleName: this.sampleName,
+        modelName: this.modelName,
+        supplierName: this.supplierName,
+      }
+      getRawItemNames(params).then((res) => {
+        this.selectLoading = false
+        res.data.map(val => {
+          const obj = Object.assign({
+            label: val,
+            value: val,
+          })
+          this.itemNamesList.push(obj)
+        })
+      }).catch(() => {
+        this.selectLoading = false
+      })
+    },
+    goBack () {
+      this.isShowDataCom = false
+    },
+    openShowData () {
+      if (this.selectChangeRows.length !== 5) {
+        this.$message.warning('璇烽�夋嫨5鏉℃暟鎹�')
+        return
+      }
+      if (this.itemNames.length !== 1) {
+        this.$message.warning('鍙兘閫夋嫨1椤规楠岄」鍚嶇О')
+        return
+      }
+      let ids = []
+      let itemNames = []
+      this.selectChangeRows.forEach(item => {
+        ids.push(item.enterOrderId)
+      })
+      this.itemNames.forEach(item => {
+        itemNames.push(item)
+      })
+      const params = {
+        orderIds: ids,
+        itemNames: itemNames
+      }
+      getRawSupplierCompare(params).then(res => {
+        this.comparisonData = res.data
+        this.selectRow = params
+        this.isShowDataCom = true
+      })
+    },
+    handleSelectionChange (val) {
+      this.selectChangeRows = val
+    },
+  },
+}
+</script>
+
+<style scoped>
+.inspection-card{
+  width: 100%;
+  margin-top: 10px;
+}
+</style>
diff --git a/src/views/statisticalCharts/qualificationRateStatistics/index.vue b/src/views/statisticalCharts/qualificationRateStatistics/index.vue
index 5e7938f..4e8ae3c 100644
--- a/src/views/statisticalCharts/qualificationRateStatistics/index.vue
+++ b/src/views/statisticalCharts/qualificationRateStatistics/index.vue
@@ -46,7 +46,7 @@
                    :legend="pieLegend"
                    :series="materialPieSeries"
                    :tooltip="pieTooltip"
-                   style="height: 34vh;"></Echarts>
+                   style="height: 36vh;"></Echarts>
         </div>
       </el-col>
       <el-col :span="8">
@@ -57,7 +57,7 @@
                    :legend="pieLegend"
                    :series="materialPieSeries1"
                    :tooltip="pieTooltip"
-                   style="height: 34vh;"></Echarts>
+                   style="height: 36vh;"></Echarts>
         </div>
       </el-col>
       <el-col :span="8">
@@ -72,7 +72,7 @@
                    :tooltip="tooltip"
                    :xAxis="xAxis1"
                    :yAxis="yAxis1"
-                   style="height: 34vh;"></Echarts>
+                   style="height: 36vh;"></Echarts>
         </div>
       </el-col>
     </el-row>
@@ -233,7 +233,7 @@
             },
           },
           labelLine: {
-            length: 30,
+            length: 20,
             length2: 40,
           },
           data: [

--
Gitblit v1.9.3