Browse Source

feat: 预测预警联调

sunxiao 9 months ago
parent
commit
16c6413378

File diff suppressed because it is too large
+ 623 - 33
package-lock.json


+ 1 - 0
package.json

@@ -12,6 +12,7 @@
     "type-check": "vue-tsc --build --force"
   },
   "dependencies": {
+    "@antv/g2plot": "^2.4.31",
     "@iktakahiro/markdown-it-katex": "^4.0.1",
     "@vueuse/core": "^10.9.0",
     "axios": "^1.6.8",

+ 14 - 9
src/components/RecodeSquareCardItem/index.vue

@@ -38,7 +38,7 @@ const warningType = computed(() => {
       label: '预警中',
       cls: 'tips_warning'
     },
-    '0': {
+    '2': {
       label: '已完成',
       cls: 'tips_success'
     },
@@ -51,6 +51,11 @@ const warningType = computed(() => {
       return waterEnum[item.status + ''];
     case 2:
       return earlyEnum[item.status + ''];
+    default:
+      return {
+        label: '未知',
+        cls: 'tips_close'
+      }
   }
 })
 
@@ -67,17 +72,17 @@ const dataSources = computed(() => {
   if (item.type == 1) {
     return [
       { label: '报警时间', value: item.time },
-      { label: '报警值', value: item.warningVal, type: 'wraning' },
+      { label: '报警值', value: Number(item?.warningVal?.toFixed(2)), type: 'wraning' },
       { label: '报警次数', value: item.counts },
     ]
   }
-  if (item.type == 3) {
+  if (item.type == 2) {
     return [
       { label: '预警时间', value: item.time },
-      { label: '超标时间', value: item.warningVal },
-      { label: '现在值', value: item.counts },
-      { label: '预测值', value: item.counts, type: 'wraning' },
-      { label: '设计值', value: item.counts }
+      { label: '超标时间', value: item.time },
+      { label: '现在值', value: Number(item?.warningVal?.toFixed(2)) ?? '' },
+      { label: '预测值', value: Number(item?.forecastVal?.toFixed(2)) ?? '', type: 'wraning' },
+      { label: '设计值', value: item.designVal }
     ]
   }
 });
@@ -90,8 +95,8 @@ const handleEmitParent = () => {
 
 <template>
   <div class="warning-item-inner">
-    <div :class="['tips', warningType.cls]">
-      <span>{{ warningType.label }}</span>
+    <div :class="['tips', warningType?.cls]">
+      <span>{{ warningType?.label }}</span>
     </div>
     <dl class="warning-info">
       <dt>

+ 1 - 1
src/router/index.js

@@ -51,7 +51,7 @@ const constantRouterMap = [
         name: 'ForecastView',
         component: () => import('@/views/analyse/ForecastView.vue'),
         meta: {
-          title: '预测警'
+          title: '预测警'
         }
       },
       {

+ 117 - 12
src/views/analyse/ForecastView.vue

@@ -1,18 +1,19 @@
 <script setup>
-import { ref } from 'vue';
+import { onMounted, ref } from 'vue';
 import { useRouter } from 'vue-router';
 import { NTabs, NTab } from 'naive-ui';
+import * as G2Plot from '@antv/g2plot';
 import { useChatStore } from '@/stores/modules/chatStore';
 import { BaseTable, ChatWelcome, RecodeSquareCardItem, TheSubMenu, TheChatView } from "@/components";
 import { ChatBaseCard, ChatAnswer } from '@/components/Chat';
-import { format, truncateDecimals } from "@/utils/format";
+import { formatToData } from "@/utils/format";
 import { waterApi } from '@/api/water';
-import {useInfinite, useRecommend, useScroll} from '@/composables'
+import { useInfinite, useRecommend, useScroll } from '@/composables'
 import { columns } from './config';
 
-const { recommendList } = useRecommend({ type: 2 });
+const { recommendList } = useRecommend({ type: 3 });
 const { scrollRef, scrollToTop } = useScroll();
-const { recordList, isFetching, onScrolltolower, onRestore } = useInfinite('/front/bigModel/warning/pageList', { type: 1, warningStatus: 0 });
+const { recordList, isFetching, onScrolltolower, onRestore } = useInfinite('/front/bigModel/warning/pageList', { type: 2, warningStatus: 0 });
 
 const router = useRouter();
 const chatStore = useChatStore();
@@ -20,6 +21,8 @@ const chatStore = useChatStore();
 const answerResult = ref("");
 const textDataSources = ref(null);
 
+const chart = ref({});
+
 // 进出水数据
 const jsTableData = ref([]);
 const csTableData = ref([]);
@@ -30,10 +33,108 @@ const onChangeTabs = warningStatus => {
   textDataSources.value = '';
   onRestore({ warningStatus })
 }
+
+// 打开详情
+const handleOpenContent = async ({ id, reason: title }) => {
+  const { data } = await waterApi.getWaringDetails(id);
+  const showVal = JSON.parse(data.showVal);
+  const { basic, jsData, csData, chartsData } = showVal;
+  console.log(chartsData);
+  answerResult.value = data.answer;
+
+  basic.title = title
+  textDataSources.value = formatToData(basic, '预测值');
+
+  jsTableData.value = [jsData];
+  csTableData.value = [csData];
+
+
+  scrollToTop();
+}
+
+// 创建图表
+const initLineChat = () => {
+  // chart.value = new Chart({
+  //   container: 'chart',
+  //   autoFit: true,
+  //   width: 500,
+  //   height: 300,
+  // })
+  // 准备数据
+  const data =
+    [
+      {
+        "time": "13",
+        "val": 11.063026
+      },
+      {
+        "time": "13",
+        "val": 11.063026
+      },
+      {
+        "time": "13",
+        "val": 11.063026
+      },
+      {
+        "time": "13",
+        "val": 11.063026
+      },
+      {
+        "time": "13",
+        "val": 11.063026
+      },
+      {
+        "time": "13",
+        "val": 11.063026
+      },
+      {
+        "time": "17",
+        "val": 7.52
+      },
+      {
+        "time": "18",
+        "val": 7.8
+      },
+      {
+        "time": "19",
+        "val": 8.44
+      }
+    ]
+
+  const lineChart = new G2Plot.Line('chartContainer', {
+    data,
+    xField: 'time', // 对应你的 x 轴字段
+    yField: 'val', // 对应你的 y 轴字段
+    animation: {
+      appear: {
+        animation: 'path-in',
+        duration: 5000,
+      },
+    },
+  });
+
+  lineChart.render();
+
+}
+
+// 欢迎 - 问答
+const handleWelcomeRecommend = question => {
+  chatStore.setChatQuestion(question);
+  router.push('/answer');
+}
+
+onMounted(() => {
+  // const chart = new Chart({
+  //   container: 'chartContainer',
+  // });
+  initLineChat();
+})
 </script>
 
 <template>
   <section class="flex items-start h-full" id="warning">
+
+
     <TheSubMenu title="预测预警" @scrollToLower="onScrolltolower" :loading="isFetching">
       <template #top>
         <div class="border-[#DAE5ED]">
@@ -54,16 +155,13 @@ const onChangeTabs = warningStatus => {
       <ChatWelcome title="您好,我是LibraAI工艺管控助手" card-title="常见处理方案:" :sub-title="[
         '报警分析功能具备实时监测与预警机制,检测到异常情况推送相关工作人员确保问题及时处理',
         '报警时间为每小时警报,请大家及时处理'
-      ]"
-        v-if="!textDataSources"
-        :card-content="recommendList"
-        @on-click="handleWelcomeRecommend"
-      />
-      <ChatBaseCard v-if="textDataSources">
+      ]" v-if="!textDataSources" :card-content="recommendList" @on-click="handleWelcomeRecommend" />
+      <ChatBaseCard v-show="textDataSources">
         <div class="waring-answer-wrapper">
           <dl class="message-inner warning-info_medium ">
             <dt class="mb-[2px] font-bold text-[#1A2029]">{{ textDataSources?.title }}</dt>
-            <dd v-for="item, index in textDataSources?.list" :key="index"><span :class="{'text-[#F44C49]': item.isWarning}">{{ item.label }}: {{ item.value }}</span></dd>
+            <dd v-for="item, index in textDataSources?.list" :key="index"><span
+                :class="{ 'text-[#F44C49]': item.isWarning }">{{ item.label }}: {{ item.value }}</span></dd>
           </dl>
           <div class="table-inner">
             <div class="warning-table mb-[8px]">
@@ -84,7 +182,14 @@ const onChangeTabs = warningStatus => {
             </div>
           </div>
         </div>
+
+        <div div class="pt-[40px] pb-[20px]" id="chartContainer"></div>
+
       </ChatBaseCard>
+
+      <ChatAnswer :loading="false" :delay-loading="false" :toggleVisibleIcons="false" :content="answerResult"
+        v-if="answerResult" />
+
     </TheChatView>
   </section>
 </template>

+ 2 - 13
src/views/analyse/PymolView.vue

@@ -32,27 +32,16 @@ const onChangeTabs = warningStatus => {
 }
 
 // 打开详情
-const handleOpenContent = async ({ id, category }) => {
+const handleOpenContent = async ({ id, reason:title }) => {
   const { data } = await waterApi.getWaringDetails(id);
   const showVal = JSON.parse(data.showVal);
   const { basic, jsData, csData } = showVal;
 
-  const textWhiteList = [
-    { label: '报警时间', realKey: '报警时间', value: '', isWarning: false },
-    { label: '报警值',   realKey: '报警值', value: 'mg/L', isWarning: true },
-    { label: '管控值',   realKey: '管控值', value: 'mg/L', isWarning: false },
-    { label: '标准值',   realKey: '标准值', value: 'mg/L', isWarning: false },
-    // { label: '报警级别', realKey: '告警级别', value: '', isWarning: false },
-    { label: '报警次数', realKey: '报警次数', value: '', isWarning: false },
-    { label: '状态',     realKey: '状态', value: '', isWarning: false }
-  ]
-
   answerResult.value = data.answer;
 
+  basic.title = title
   textDataSources.value = formatToData(basic, '报警值');
 
-  // textDataSources.value = format.textSorting(basic, textWhiteList);
-
   jsTableData.value = [jsData];
   csTableData.value = [csData];
 

File diff suppressed because it is too large
+ 615 - 20
yarn.lock


Some files were not shown because too many files changed in this diff