Browse Source

feat: 解决缓存,将日报单独拆分2个文件

sunxiao 4 days ago
parent
commit
644ddb3373
2 changed files with 294 additions and 6 deletions
  1. 10 6
      src/views/report/record/assay-record.vue
  2. 284 0
      src/views/report/record/detection-record.vue

+ 10 - 6
src/views/report/record/index.vue → src/views/report/record/assay-record.vue

@@ -1,9 +1,9 @@
 <!-- 用于动态设置 name -->
-<script>
+<!-- <script>
 export default {
   name: location.hash.includes('assay-record') ? "AssayRecord" : "DetectionRecord"
 }
-</script>
+</script> -->
 <script setup>
 import { getDeviceList, getDrawerData } from '@/api/report/lab';
 import { dayjs } from 'element-plus';
@@ -11,6 +11,10 @@ import { dayjs } from 'element-plus';
 const { proxy } = getCurrentInstance();
 const route = useRoute();
 
+defineOptions({
+  name: 'AssayRecord'
+})
+
 const queryParams = ref({ 
   deviceNo: '',
   pageNum: 1,
@@ -166,7 +170,7 @@ const handleExport = () => {
 }
 
 const test = (key, item) => {
-  
+
   let color = '#606266';
   
   // const whitelist = [
@@ -191,8 +195,8 @@ const test = (key, item) => {
     zlsyDeviationRate: 'zlsyRed'
   }
 
-  if ( fieldMapping[key] ) {
-    color = item[fieldMapping[key]] && 'red'
+  if ( fieldMapping[key] && item[fieldMapping[key]] ) {
+    color = 'red'
     //const n = item[key + 'Number'];
     // if ( (n || n == 0) && Math.abs( n ) > 0.1 ) {
     //   color = 'red'
@@ -203,7 +207,7 @@ const test = (key, item) => {
 }
 
 onMounted(async () => {
-  await getDeviceList({ type: route.query.t }).then(({ data }) => {
+  await getDeviceList({ type: 1 }).then(({ data }) => {
     const [ item ] = data;
     queryParams.value.deviceNo = item?.deviceNo;
     firstDeviceNo = item?.deviceNo;

+ 284 - 0
src/views/report/record/detection-record.vue

@@ -0,0 +1,284 @@
+<!-- 用于动态设置 name -->
+<!-- <script>
+export default {
+  name: location.hash.includes('assay-record') ? "AssayRecord" : "DetectionRecord"
+}
+</script> -->
+<script setup>
+import { getDeviceList, getDrawerData } from '@/api/report/lab';
+import { dayjs } from 'element-plus';
+
+const { proxy } = getCurrentInstance();
+const route = useRoute();
+
+defineOptions({
+  name: 'DetectionRecord'
+})
+
+const queryParams = ref({ 
+  deviceNo: '',
+  pageNum: 1,
+  pageSize: 10
+ });
+
+const datePieckerValue = ref([dayjs(new Date()).format('YYYY-MM-DD'), dayjs(new Date()).format('YYYY-MM-DD')]);
+
+let firstDeviceNo = '';
+
+const total = ref(0);
+const tableData = ref([]);
+const loading = ref(false);
+const options = ref([]);
+const columns = [
+  {
+    label: '基本资料',
+    children: [
+      { label: "化验开始时间", prop: 'assayTime', width: 180 },
+      // { label: "设备名称", prop: 'deviceName', width: 180 },
+      // { label: "设备名称", prop: 'deviceNo', width: 180 },
+      { label: "所属水厂", prop: 'worksName', width: 180 },
+      // { label: "样品名称", prop: 'assayTypeName', width: 180 }
+    ]
+  },
+  {
+    label: '高COD',
+    children: [
+      { label: "质控值", prop: 'highCodStandardVal', width: 100 },
+      { label: "化验值", prop: 'highCodResultConcentration', width: 100 },
+      { label: "偏差度", prop: 'highCodDeviationRate', width: 100 }
+    ]
+  },
+  {
+    label: '低COD',
+    children: [
+      { label: "质控值", prop: 'lowCodStandardVal', width: 100 },
+      { label: "化验值", prop: 'lowCodResultConcentration', width: 100 },
+      { label: "偏差度", prop: 'lowCodDeviationRate', width: 100 }
+    ]
+  },
+  {
+    label: '氨氮',
+    children: [
+      { label: "质控值", prop: 'anDanStandardVal', width: 100 },
+      { label: "化验值", prop: 'anDanResultConcentration', width: 100 },
+      { label: "偏差度", prop: 'anDanDeviationRate', width: 100 }
+    ]
+  },
+  {
+    label: '总氮',
+    children: [
+      { label: "质控值", prop: 'tnStandardVal', width: 100 },
+      { label: "化验值", prop: 'tnResultConcentration', width: 100 },
+      { label: "偏差度", prop: 'tnDeviationRate', width: 100 }
+    ]
+  },
+  {
+    label: '总磷',
+    children: [
+      { label: "质控值", prop: 'tpStandardVal', width: 100 },
+      { label: "化验值", prop: 'tpResultConcentration', width: 100 },
+      { label: "偏差度", prop: 'tpDeviationRate', width: 100 }
+    ]
+  },
+  {
+    label: '硝酸盐氮',
+    children: [
+      { label: "质控值", prop: 'xsydStandardVal', width: 100 },
+      { label: "化验值", prop: 'xsydResultConcentration', width: 100 },
+      { label: "偏差度", prop: 'xsydDeviationRate', width: 100 }
+    ]
+  },
+  {
+    label: '亚硝酸盐',
+    children: [
+      { label: "质控值", prop: 'yxsyStandardVal', width: 100 },
+      { label: "化验值", prop: 'yxsyResultConcentration', width: 100 },
+      { label: "偏差度", prop: 'yxsyDeviationRate', width: 100 }
+    ]
+  },
+  {
+    label: '正磷酸盐',
+    children: [
+      { label: "质控值", prop: 'zlsyStandardVal', width: 100 },
+      { label: "化验值", prop: 'zlsyResultConcentration', width: 100 },
+      { label: "偏差度", prop: 'zlsyDeviationRate', width: 100 }
+    ]
+  }
+]
+
+const finalyColumns = ref([]);
+
+const initPageData = async () => {
+
+  loading.value = true;
+
+  const [ timeBegin, timeEnd ] = datePieckerValue.value;
+  const { total: tableTotal, rows } = await getDrawerData({ ...queryParams.value, timeBegin, timeEnd, type: route.query.t });
+  
+  const arr = [];
+
+  for (let index = 1; index < columns.length; index++) {
+    const children = columns[index].children;
+    const tempArr = [];
+    for (let i = 1; i < children.length; i++) {
+      const item = children[i];
+      tempArr.push(item.prop);
+    }
+    arr.push( tempArr );
+  }
+  
+  const tempColumns = [];
+
+  arr.forEach((item, index) => {
+    const [k1] = item;
+    
+    const isExits = rows.some((val) => val[k1]);
+    if ( isExits ) {
+      tempColumns.push(columns[index + 1]);
+    }
+  })
+
+  finalyColumns.value = rows.length ? [columns[0]].concat(tempColumns) : [];
+
+  tableData.value = rows;
+  total.value = tableTotal;
+  loading.value = false;
+
+}
+
+// 查询
+const handleQuery = async() => {
+  initPageData();
+}
+
+// 重置
+const handleReset = () => {
+  datePieckerValue.value = [dayjs(new Date()).format('YYYY-MM-DD'), dayjs(new Date()).format('YYYY-MM-DD')];
+  queryParams.value.pageNum = 1;
+  queryParams.value.pageSize = 10;
+  queryParams.value.deviceNo = firstDeviceNo;
+  initPageData();
+}
+
+// 导出
+const handleExport = () => {
+  const [ timeBegin, timeEnd ] = datePieckerValue.value;
+  
+  proxy.getDownload("/business/exportAssayPageListByDeviceNoAndDate", {
+    timeBegin, timeEnd, deviceNo: queryParams.value.deviceNo, type: route.query.t
+  }, `${new Date().getTime()}.xlsx`);
+}
+
+const test = (key, item) => {
+
+  let color = '#606266';
+  
+  // const whitelist = [
+  //   'highCodDeviationRate',
+  //   'lowCodDeviationRate',
+  //   'anDanDeviationRate',
+  //   'tnDeviationRate',
+  //   'tpDeviationRate',
+  //   'xsydDeviationRate',
+  //   'yxsyDeviationRate',
+  //   'zlsyDeviationRate',
+  // ]
+
+  const fieldMapping = {
+    highCodDeviationRate: 'highCodRed',
+    lowCodDeviationRate: 'lowCodRed',
+    anDanDeviationRate: 'anDanRed',
+    tnDeviationRate: 'tnRed',
+    tpDeviationRate: 'tpRed',
+    xsydDeviationRate: 'xsydRed',
+    yxsyDeviationRate: 'yxsyRed',
+    zlsyDeviationRate: 'zlsyRed'
+  }
+
+  if ( fieldMapping[key] && item[fieldMapping[key]] ) {
+    color = 'red'
+    //const n = item[key + 'Number'];
+    // if ( (n || n == 0) && Math.abs( n ) > 0.1 ) {
+    //   color = 'red'
+    // }
+  }
+
+  return {color};
+}
+
+onMounted(async () => {
+  await getDeviceList({ type: 2 }).then(({ data }) => {
+    const [ item ] = data;
+    queryParams.value.deviceNo = item?.deviceNo;
+    firstDeviceNo = item?.deviceNo;
+    options.value = data
+  });
+  await initPageData();
+})
+</script>
+
+<template>
+  <div class="space-y-[10px]">
+    <el-card shadow="never" :body-style="{ border: '0px' }">
+      <template #header>
+        <p class="space-x-[10px]">
+          <span class="font-bold">数据筛选</span>
+        </p>
+      </template>
+      <el-row class="pt-[5px]" justify="space-between" :gutter="20">
+        <el-col :span="6">
+          <el-form-item label="设备名称">
+            <el-select v-model="queryParams.deviceNo" placeholder="请选择" filterable clearable>
+              <el-option v-for="item in options" :key="item.deviceNo" :label="item.deviceName" :value="item.deviceNo" />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item>
+            <template #label>
+              <span class="font-bold">化验日期</span>
+            </template>
+            <el-date-picker
+              :clearable="false"
+              v-model="datePieckerValue"
+              type="daterange"
+              range-separator="-"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              :editable="false"
+              value-format="YYYY-MM-DD"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="6" :offset="6">
+          <div class="flex justify-end">
+            <el-button type="primary" @click="handleQuery" :loading="loading">查询</el-button>
+            <el-button @click="handleReset" :loading="loading">重置</el-button>
+          </div>
+        </el-col>
+      </el-row>
+    </el-card>
+
+    <el-card shadow="never" :body-style="{ padding: '20px' }">
+      <div class="flex justify-between items-center mb-[10px]">
+        <h4 class="font-bold">化验记录</h4>
+        <el-button type="warning" plain icon="Download" @click="handleExport">导出</el-button>
+      </div>
+      <el-table :data="tableData" style="width: 100%" v-loading="loading">
+        <el-table-column :label="col.label" :min-width="col.width" :fixed="col.fixed" align="center" v-for="col in finalyColumns">
+          <el-table-column :prop="child.prop" :label="child.label" :min-width="child.width" v-for="child in col.children">
+            <template #default="scope">
+              <span :style="test(child.prop, scope.row)">{{ scope.row[child.prop] }}</span>
+            </template>
+          </el-table-column>
+        </el-table-column>
+      </el-table>
+      <div class="">
+        <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
+          v-model:limit="queryParams.pageSize" @pagination="initPageData" />
+      </div>
+    </el-card>
+  </div>
+</template>
+
+<style lang="less" scoped></style>