Przeglądaj źródła

feat: 锡林浩特问题整改

sunxiao 5 miesięcy temu
rodzic
commit
d6a8827c6b

+ 1 - 1
src/components/Layout/TheChatView.vue

@@ -108,7 +108,7 @@ defineExpose({ targetScrollDom });
     .control-main {
       // flex: 1;
       height: calc(100vh - 124px);
-      padding: 0 24px 0px 24px;
+      padding: 0 24px 20px 24px;
     }
 
     .chat-main {

+ 1 - 1
src/components/Layout/TheLogo.vue

@@ -21,7 +21,7 @@ const handleClick = () => router.push('/');
       <div class="w-[28px] h-[28px]">
         <SvgIcon name="common-logo" size="28"></SvgIcon>
       </div>
-      <span class="block w-[82px] font-[10px] text-left">人工智能运营体<br>锡林浩特水务集团</span>
+      <span class="block w-[114px] font-[10px] text-left">LibraAI智能体运营平台<br>锡林浩特水务集团</span>
     </div>
     <!-- 图标 -->
     <div class="icon-group flex items-center justify-center"  @click="changeCollapse" v-show="!subMenuCollapse">

+ 1 - 1
src/components/Layout/TheMenu.vue

@@ -32,7 +32,7 @@ function renderLabel (val, url) {
 
 const menuOptions = [
   {
-    label: () => renderLabel('数据分析'),
+    label: () => renderLabel('数据报表分析'),
     icon: renderIcon({ name: 'menu-xiht-analyse' }),
     key: '/'
   },

+ 1 - 1
src/router/index.js

@@ -23,7 +23,7 @@ const constantRouterMap = [
         name: "AnalyseView",
         component: () => import("@/views/xlht/AnalyseView.vue"),
         meta: {
-          title: "数据分析",
+          title: "数据报表分析",
         },
       },
       {

+ 83 - 30
src/views/control/MedicinalView.vue

@@ -1,5 +1,5 @@
 <script setup>
-import { ref, onMounted, computed, unref, watch } from 'vue';
+import { ref, onMounted, computed, unref, watch, h } from 'vue';
 import { NScrollbar, useMessage, NTabs, NTabPane, NSwitch, useNotification, NButton } from 'naive-ui';
 import { TheChatView } from '@/components';
 import { controlApi } from "@/api/control";
@@ -16,6 +16,7 @@ const message = useMessage();
 const isVisibleBtn = ref(true);
 const isVisibleUpdateInfo = ref(false);
 const systemStatus = ref(0);
+const zuTaiStatus = ref({});
 const minAndMaxValue = ref({});
 const resultNumberSet = ref({
   flowNum1: 0,
@@ -271,11 +272,11 @@ const handleMedicateAmount = () => {
         isVisibleUpdateInfo.value = true;
         // message.warning("北池有新的投放方案, 请查看");
       } else {
-        resultNumberSet.value.updateNum1 = dataSourceParams.value.medicineAmountOne;
+        // resultNumberSet.value.updateNum1 = dataSourceParams.value.medicineAmountOne;
         // isVisibleUpdateInfo.value = true;
       }
       // r1 != updateNum1 &&
-    } else if ( dataSourceParams.value.typeOne) {
+    } else if ( r1 != updateNum1 && dataSourceParams.value.typeOne ) {
       resultNumberSet.value.updateNum1 = r1;
       isVisibleUpdateInfo.value = true;
       dataSourceParams.value.tdbOne = tdb;
@@ -292,11 +293,11 @@ const handleMedicateAmount = () => {
         isVisibleUpdateInfo.value = true;
         // message.warning("南池有新的投放方案, 请查看");
       } else {
-        resultNumberSet.value.updateNum2 = dataSourceParams.value.medicineAmountTwo;
+        // resultNumberSet.value.updateNum2 = dataSourceParams.value.medicineAmountTwo;
         // isVisibleUpdateInfo.value = true;
       }
-      // r2 != updateNum2 &&
-    } else if ( dataSourceParams.value.typeTwo) {
+      // 
+    } else if ( r2 != updateNum2 && dataSourceParams.value.typeTwo) {
       resultNumberSet.value.updateNum2 = r2;
       isVisibleUpdateInfo.value = true;
       dataSourceParams.value.tdbTwo = tdb;
@@ -332,36 +333,53 @@ const waringTips = () => {
   const tipsEnum = {
     oneTips: {
       title: '反硝化异常报警',
-      content: '排查现场工况/调整控制参数,非碳源量的问题,请切手动控制',
+      content: '排查现场工况/调整控制参数,非碳源量的问题,建议切换手动控制',
     },
     twoTips: {
       title: '硝化异常报警',
-      content: '排查进水水质、曝气系统、活性污泥系统等,请切手动运行',
+      content: '排查进水水质、曝气系统、活性污泥系统等,请切手动运行',
     },
     threeTips: {
       title: '加药量偏移报警',
-      content: '排查现场碳源储罐液位、加药泵和流量计等,确保运行正常',
+      content: () => h('ul', [
+        h('li', {style: { fontWeight: 'bold' }}, '• 系统计算加药与现场实际流量计偏移过大'),
+        h('li', '请排查现场碳源储罐液位、加药泵和流量计等,确保运行正常'),
+      ])
     }
   }
   
   const result = {
-    oneTips: [],
     twoTips: [],
+    oneTips: [],
     threeTips: []
   }
+  
+  const qEnum = ['• 好氧池硝酸盐超管控值', '• 好氧池硝酸盐控制目标偏移过大']
 
+  const questionCollect = {
+    firstItem: [],
+    secondItem: [],
+  }
+  
   if ( isEmpty(hycXsyOne) && isEmpty(htfksdOne) && isEmpty(kzmbplbjz) ) {
-    if ( (hycXsyOne - htfksdOne) > kzmbplbjz || hycXsyOne > hycxsygkz) {
-      result.oneTips.push('北池');
+    if (( hycXsyOne - htfksdOne ) > kzmbplbjz ) {
+      questionCollect.firstItem.push('北池');
+    }
+    
+    if ( hycXsyOne > hycxsygkz ) {
+      questionCollect.secondItem.push('北池');
     }
   }
   
   if ( isEmpty(hycXsyTwo) && isEmpty(htfksdTwo) && isEmpty(kzmbplbjz) ) {
-    if ( (hycXsyTwo - htfksdTwo) > kzmbplbjz || hycXsyTwo > hycxsygkz) {
-      result.oneTips.push('南池');
+    if ( (hycXsyTwo - htfksdTwo) > kzmbplbjz ) {
+      questionCollect.firstItem.push('南池');
+    }
+    if ( hycXsyTwo > hycxsygkz ) {
+      questionCollect.secondItem.push('南池');
     }
   }
-  
+
   if ( isEmpty(hycXsyOne) && isEmpty(qycYxyOne) && isEmpty(qycAdOne) ) {
     if (qycYxyOne + qycAdOne - hycXsyOne > xhycbjz) {
       result.twoTips.push('北池');
@@ -386,7 +404,27 @@ const waringTips = () => {
     }
   }
   
+  const r = Object.entries(questionCollect).map(([ key, value ], index) => {
+    if ( !value.length ) return;
+    return qEnum[index] + "(" + value.join(' | ') + ")";
+  }).filter(Boolean);
+
+
   warningList.value = Object.entries(result).map(([key, value]) => {
+    if ( key === 'oneTips' ) {
+      if ( !r.length ) return;
+      const renderDomArr = r.map(text => h('li', {style: { fontWeight: 'bold' }}, text));
+      return {
+        title: tipsEnum[key].title,
+        content: () => h('ul', renderDomArr.concat(h('li', tipsEnum[key].content))),
+        duration: 30 * 1000,
+        keepAliveOnHover: true,
+        'container-style': {
+          width: '500px'
+        }
+      }
+    }
+
     if ( value.length ) {
       return {
         ...tipsEnum[key],
@@ -397,10 +435,11 @@ const waringTips = () => {
     }
   }).filter(Boolean);
 
+  console.log("warningList", warningList);
 }
 
 onMounted(async () => {
-  
+
   const { data: valSet } = await controlApi.getMinMaxVal();
   
   minAndMaxValue.value = valSet;
@@ -424,8 +463,9 @@ onMounted(async () => {
       addDifferenceOne,
       addDifferenceTwo
     } = data;
-
-    systemStatus.value = { activeTwo: addTypeOne, activeTwo: addTypeTwo };
+    
+    // 0 不可以  组态投放 1 可以   系统投放
+    zuTaiStatus.value = { activeTwo: addTypeOne, activeTwo: addTypeTwo };
 
     // 系数
     baseSourceParams.value = {
@@ -491,8 +531,9 @@ onMounted(async () => {
 
   // 获取是否允许投药开关 - 锡林浩特
   // controlApi.getSystemStatus().then(({ data }) => {
-  //   // 0不允许  1允许
-  //   systemStatus.value = { ...data };
+    // 0不允许  1允许
+    // 系统 未投放  系统 投放中
+    // systemStatus.value = { ...data };
   // });
 })
 
@@ -557,7 +598,8 @@ onMounted(async () => {
                             v-model:value1="dataSourceParams.hycXsyOne"
                             :btn-group="[
                               { label: '手动', value1: '', value2: '' },
-                              { label: '化验', value1: waterConfigParams.hyXsyHYOne }
+                              { label: '化验', value1: waterConfigParams.hyXsyHYOne },
+                              { label: '预测', value1: '', disabled: true }
                             ]"></BaseChooseItem>
                           <BaseChooseItem
                             tab-key="south" 
@@ -640,9 +682,9 @@ onMounted(async () => {
                       
                       <div class="w-full flex items-center justify-between" v-show="!dataSourceParams.typeOne">
                         <span>人工投放:</span>
-                        <div class="w-[200px]">
+                        <div class="w-[200px] flex items-center space-x-[8px]">
                           <BaseInput :isCloseIcon="false" v-model="dataSourceParams.medicineAmountOne"
-                            @on-blur="handleMedicateAmount">
+                            @on-blur="handleMedicateAmount" unit="L/h">
                           </BaseInput>
                         </div>
                       </div>
@@ -697,7 +739,8 @@ onMounted(async () => {
                             v-model:value1="dataSourceParams.hycXsyTwo"
                             :btn-group="[
                               { label: '手动', value1: '', value2: '' },
-                              { label: '化验', value1: waterConfigParams.hyXsyHYTwo }
+                              { label: '化验', value1: waterConfigParams.hyXsyHYTwo },
+                              { label: '预测', value1: '', disabled: true }
                             ]"></BaseChooseItem>
                           <BaseChooseItem
                             tab-key="south" 
@@ -780,9 +823,9 @@ onMounted(async () => {
                       
                       <div class="w-full flex items-center justify-between" v-show="!dataSourceParams.typeTwo">
                         <span>人工投放:</span>
-                        <div class="w-[200px]">
+                        <div class="w-[200px] flex items-center space-x-[8px  ]">
                           <BaseInput :isCloseIcon="false" v-model="dataSourceParams.medicineAmountTwo"
-                            @on-blur="handleMedicateAmount">
+                            @on-blur="handleMedicateAmount" unit="L/h">
                           </BaseInput>
                         </div>
                       </div>
@@ -795,20 +838,19 @@ onMounted(async () => {
           <div class="right-section">
             <BaseTitle title="智能投加计算结果" type="second">
               <template #right>
-                <NButton strong secondary type="warning" @click="onSystemWarning" v-show="warningList.length">查看系统警报</NButton>
+                <div class="warning-btn" @click="onSystemWarning" v-show="warningList.length">查看系统警报</div>
               </template>
             </BaseTitle>
             <div class="right-section-content">
               <TheResultPanel
                 :nums="resultNumberSet"
                 :minAndMaxNum="minAndMaxValue"
-                v-model:system="systemStatus"
+                v-model:system="zuTaiStatus"
                 v-model="isVisibleUpdateInfo"
-                @on-click="onFinalResult"
                 @on-update="onConfirmUpdate"
               >
               </TheResultPanel>
-              <TheEchartPanel v-model:change="isVisibleUpdateInfo"></TheEchartPanel>
+              <TheEchartPanel v-model:change="isVisibleUpdateInfo" :setVal="dataSourceParams.htfksdOne"></TheEchartPanel>
             </div>
           </div>
         </div>
@@ -921,6 +963,17 @@ onMounted(async () => {
   }
 }
 
+.warning-btn {
+  width: 116px;
+  height: 32px;
+  border-radius: 8px;
+  background: #FFF7F7;
+  line-height: 32px;
+  font-size: 14px;
+  text-align: center;
+  color: #FD5D4D;
+  cursor: pointer;
+}
 
 // 通用区域的样式
 .btn {

+ 12 - 0
src/views/control/components/BaseButton.vue

@@ -7,6 +7,10 @@ defineProps({
   isActive: {
     type: Boolean,
     default: false
+  },
+  disabled: {
+    type: Boolean,
+    default: false
   }
 })
 
@@ -18,9 +22,11 @@ const emitClickEvent = () => emit('on-click');
 
 <template>
   <button
+    :disabled="disabled"
     :class="[
       'custom-button',
       'button-type_' + type, 
+      {'button-type_disable': disabled},
       {'type_active': isActive}
     ]"
     @click="emitClickEvent"
@@ -70,4 +76,10 @@ const emitClickEvent = () => emit('on-click');
     background: #EBF0FF;
   }
 }
+
+.button-type_disable {
+  cursor:not-allowed;
+  &:hover {
+  }
+}
 </style>

+ 21 - 12
src/views/control/components/BaseChooseItem.vue

@@ -1,6 +1,6 @@
 <script setup>
 import { ref, computed, watchEffect } from 'vue';
-import { useMessage } from 'naive-ui';
+import { useMessage, NTooltip } from 'naive-ui';
 
 import BaseButton from './BaseButton.vue';
 import BaseInput from './BaseInput.vue';
@@ -99,17 +99,26 @@ const changeActive = (item, index) => {
     <span class="label-inner">{{ title }}:</span>
     <div class="choose-inner">
       <div class="top-box">
-        <ul class="btn-group space-x-[4px]">
-          <BaseButton
-            v-for="item, index in btnGroup"
-            type="info"
-            :key="index"
-            :isActive="modelType === index || btnGroup.length === 1"
-            @click="changeActive(item, index)"
-          >
-            {{ item.label }}
-          </BaseButton>
-        </ul>
+        <div class="btn-group space-x-[4px]">
+          <div v-for="item, index in btnGroup">
+            <n-tooltip :disabled="!item.disabled">
+              <template #trigger>
+                <div>
+                  <BaseButton
+                    type="info"
+                    :key="index"
+                    :isActive="modelType === index || btnGroup.length === 1"
+                    :disabled="item.disabled"
+                    @click="changeActive(item, index)"
+                  >
+                    {{ item.label }}
+                  </BaseButton>
+                </div>
+              </template>
+              <span class="text-[12px]">该功能未开启</span>
+            </n-tooltip>
+          </div>
+        </div>
         <ul class="num-group flex space-x-[20px] text-center">
           <li class="w-[60px]">{{ onePoolNum }}</li>
           <li class="w-[60px]" v-if="isDouble">{{ twoPoolNum }}</li>

+ 43 - 10
src/views/control/components/TheEchartPanel.vue

@@ -6,7 +6,7 @@ import { startOfDay } from "date-fns/esm"
 import { controlApi } from "@/api/control"
 import dayjs from 'dayjs';
 
-
+const props = defineProps(['setVal']);
 const isDomSizeChange = defineModel('change');
 
 let echart = null;
@@ -37,7 +37,8 @@ const selectEnum = {
   8:  '碳源投加量-北池-计算投药量',
   9:  '碳源投加量-南池-计算投药量',
   10: '碳源投加量-北池-反馈流量',
-  11: '碳源投加量-南池-反馈流量'
+  11: '碳源投加量-南池-反馈流量',
+  12: '后反馈设定'
 }
 
 let echartOptions = [
@@ -69,13 +70,10 @@ const selectThemeOverrides = {
   },
 }
 
-
-
 const seriesName = computed(() => {
   let name = '';
   if ( activeIndex.value === 0) {
     name = echartOptions.find(({ value }) => selectValue.value === value).label
-    console.log("name", name);
   } else {
     name = coefficientOptions.find(item => item.value === selectValue.value).label
   }
@@ -105,8 +103,17 @@ const handleSwitchTab = (index) => {
 
 // select option change
 const handleSelectOptions = (selectOptionList) => {
+  let tempArr = selectOptionList;
+  if ( activeIndex.value === 0 ) {
+    if ( selectOptionList.length === 1 && selectOptionList[selectOptionList.length - 1] == 12) {
+      selectOptions.value[selectOptions.value.length - 1].disabled = true;
+      tempArr = [];
+    } else {
+      selectOptions.value[selectOptions.value.length - 1].disabled = !selectOptionList.length;
+    }
+  }
 
-  selectValue.value = selectOptionList;
+  selectValue.value = tempArr;
   
   activeIndex.value === 0 ? initWaterEchart() : intiCoefficientEchartData();
 
@@ -132,7 +139,7 @@ const initWaterEchart = async () => {
     }
     return acc;
   }, []).filter(Boolean).map(item => item.time.trim()).sort((a, b) => dayjs(a).valueOf() - dayjs(b).valueOf());
-  
+
   const options = getWaterEchartOptions({ data: tempResult, xAxis });
 
   echart.setOption(options, true);
@@ -142,14 +149,22 @@ const initWaterEchart = async () => {
 const windowResize = () => echart.resize();
 
 const getWaterEchartOptions = ({ data, xAxis = [] }) => {
-
+  
+  const lengthList = []
+  let isOff = false;
+  
   const series = data.map(item => {
+    lengthList.push(item.data.length);
+    if ( item.name === '后反馈设定' ) {
+      isOff = true;
+    }
     const d1 = item.data.map(item => {
       return [
         item.time.trim(),
         item.val ? item.val.toFixed(2) : 0
       ]
     });
+
     return {
         name: item.name,
         showSymbol: false,
@@ -160,6 +175,24 @@ const getWaterEchartOptions = ({ data, xAxis = [] }) => {
       }
   })
 
+  if ( isOff ) {
+    
+    const data = xAxis.map(time => [time, props.setVal]);
+    
+    series.push({
+      name: '后反馈设定',
+      showSymbol: false,
+      smooth: true,
+      type: 'line',
+      symbolSize: 10,
+      itemStyle: {
+        color: 'red'
+      },
+      data
+    });
+  }
+
+
   const option = {
     backgroundColor: '#FFF',
     title: {
@@ -390,7 +423,7 @@ watch(() => isDomSizeChange.value, (val) => {
 
 onMounted(async () => {
   echartOptions = Object.entries(selectEnum).map(([key, value]) => {
-    return { label: value, value: key, style: "font-size: 12px" }
+    return { label: value, value: key, style: "font-size: 12px"}
   });
 
   selectOptions.value = echartOptions;
@@ -436,8 +469,8 @@ onUnmounted(() => {
         v-model:formatted-value="datePickerValue"
       ></NDatePicker>
       <NSelect
-        :multiple="activeIndex != 1"
         class="w-[200px]"
+        :multiple="activeIndex != 1"
         :options="selectOptions"
         :value="selectValue"
         :on-update:value="handleSelectOptions"

+ 47 - 21
src/views/control/components/TheResultPanel.vue

@@ -1,9 +1,13 @@
 <script setup>
-import { computed } from 'vue';
-import { NNumberAnimation } from 'naive-ui';
+import { computed, onMounted, ref } from 'vue';
+import { NNumberAnimation, useMessage } from 'naive-ui';
+import { controlApi } from "@/api/control"
 import { SvgIcon } from '@/components';
 
+const message = useMessage();
+
 const isVisibleBtn = defineModel();
+const systemStatus = ref({});
 const modelSystemStatus = defineModel('system');
 const emit = defineEmits(['on-click', 'on-update']);
 
@@ -47,10 +51,31 @@ const noticeTextVal = computed(() => {
 
 const emitEvent = (type) => {
   // emit('on-click', type);
+
+  const name = type == 'one' ? '北池' : '南池';
+
+  if ( type == 'one' ) {
+    systemStatus.value.activeOne = systemStatus.value.activeOne === 1 ? 0 : 1;
+  } else {
+    systemStatus.value.activeTwo = systemStatus.value.activeTwo === 1 ? 0 : 1;
+  }
+
+  controlApi.putSystemStatus({ ...systemStatus.value });
+
+  message.success(`${name}投药状态更改成功`);
 };
 const emitUpdate = async () => {
   emit('on-update');
 };
+
+onMounted(() => {
+  // 获取是否允许投药开关 - 锡林浩特
+  controlApi.getSystemStatus().then(({ data }) => {
+    // 0不允许  1允许
+    // 系统 未投放  系统 投放中
+    systemStatus.value = { ...data };
+  })
+})
 </script>
 
 <template>
@@ -78,7 +103,7 @@ const emitUpdate = async () => {
         <div class="result-card_item">
           <ul class="board-inner">
             <li class="board-item">
-              <span class="label">北池</span>
+              <span class="label">北池 - {{ modelSystemStatus.activeOne === 1 ? '系统投放' : '组态投放'}}</span>
               <h4>碳源投加瞬时流量(L/h)</h4>
               <span class="num">
                 <NNumberAnimation :from="0" :to="nums.flowNum1" :duration="1000"
@@ -97,12 +122,12 @@ const emitUpdate = async () => {
 
           <div class="btn-card">
             <div :class="['round-btn']" @click="emitEvent('one')">
-              <div class="circle1" v-show="modelSystemStatus.activeOne === 1"></div>
-              <div class="circle2" v-show="modelSystemStatus.activeOne === 1"></div>
-              <div class="circle3" v-show="modelSystemStatus.activeOne === 1"></div>
+              <div class="circle1" v-show="systemStatus.activeOne === 1"></div>
+              <div class="circle2" v-show="systemStatus.activeOne === 1"></div>
+              <div class="circle3" v-show="systemStatus.activeOne === 1"></div>
               <div class="inner space-y-[4px]">
                 <SvgIcon name="control-icon-result-btn" size="14" />
-                <span>{{ modelSystemStatus.activeOne === 1 ? "系统投放" : "组态投放" }}</span>
+                <span>{{ systemStatus.activeOne === 1 ? "启动中" : "未启动" }}</span>
               </div>
             </div>
           </div>
@@ -110,7 +135,7 @@ const emitUpdate = async () => {
         <div class="result-card_item">
           <ul class="board-inner">
             <li class="board-item">
-              <span class="label">南池</span>
+              <span class="label">南池 - {{ modelSystemStatus.activeTwo === 1 ? '系统投放' : '组态投放'}}</span>
               <h4>碳源投加瞬时流量(L/h)</h4>
               <span class="num">
                 <NNumberAnimation :from="0" :to="nums.flowNum2" :duration="1000"
@@ -129,12 +154,12 @@ const emitUpdate = async () => {
           
           <div class="btn-card">
             <div :class="['round-btn']" @click="emitEvent('two')">
-              <div class="circle1" v-show="modelSystemStatus.activeTwo === 1"></div>
-              <div class="circle2" v-show="modelSystemStatus.activeTwo === 1"></div>
-              <div class="circle3" v-show="modelSystemStatus.activeTwo === 1"></div>
+              <div class="circle1" v-show="systemStatus.activeTwo === 1"></div>
+              <div class="circle2" v-show="systemStatus.activeTwo === 1"></div>
+              <div class="circle3" v-show="systemStatus.activeTwo === 1"></div>
               <div class="inner space-y-[4px]">
                 <SvgIcon name="control-icon-result-btn" size="14" />
-                <span>{{ modelSystemStatus.activeTwo === 1 ? "系统投放" : "组态投放" }}</span>
+                <span>{{ systemStatus.activeTwo === 1 ? "启动中" : "未启动" }}</span>
               </div>
             </div>
           </div>
@@ -208,8 +233,9 @@ const emitUpdate = async () => {
               position: absolute;
               top: -12px;
               right: 0;
-              width: 84px;
+              // width: 84px;
               height: 24px;
+              padding: 0 5px;
               border-bottom-left-radius: 10px;
               line-height: 24px;
               text-align: center;
@@ -252,23 +278,23 @@ const emitUpdate = async () => {
   .round-btn {
     position: relative;
     @include flex(x, center, center);
-    width: 70px;
-    height: 70px;
+    width: 64px;
+    height: 64px;
     border: 2px solid #E6EFFE;
     border-radius: 50%;
     background: #898EFE;
     font-size: 10px;
     font-weight: bold;
     color: #fff;
-    // cursor: pointer;
+    cursor: pointer;
     transition: all 0.5s;
 
     .inner {
       position: relative;
       @include flex(x, center, center);
       flex-flow: column;
-      width: 58px;
-      height: 58px;
+      width: 50px;
+      height: 50px;
       border-radius: 100%;
       background: #2454FF;
       transition: all 0.3s;
@@ -284,8 +310,8 @@ const emitUpdate = async () => {
   .circle2,
   .circle3 {
     position: absolute;
-    width: 40px;
-    height: 40px;
+    width: 36px;
+    height: 36px;
     background: rgba(137, 142, 254, 1);
     border: 1px solid rgba(137, 142, 254, 0.85);
     border-radius: 999px;
@@ -334,7 +360,7 @@ const emitUpdate = async () => {
     // }
 
     100% {
-      transform: scale(2.5);
+      transform: scale(2.2);
       opacity: 0.05;
     }
   }

+ 1 - 1
src/views/login/LoginView.vue

@@ -68,7 +68,7 @@ const handleSubmit = async () => {
 
     <div class="tips-wrapper">
       <ul class="tips-inner">
-        <li class="title">Libra 智能体运营平台<br />锡林浩特水务集团</li>
+        <li class="title">LibraAI 智能体运营平台<br />锡林浩特水务集团</li>
         <li class="sub-title">同建绿色温馨家园,共享清澈碧水蓝天</li>
       </ul>
     </div>

+ 1 - 1
src/views/xlht/AnalyseView.vue

@@ -303,7 +303,7 @@ onUnmounted(() => {
 
 .data-card {
   width: calc(100vw - 292px);
-  height: calc(100% - 168px);
+  height: calc(100% - 190px);
   margin-top: 12px;
   border-radius: 10px;
   background: #FFF;

+ 1 - 1
src/views/xlht/config.js

@@ -23,7 +23,7 @@ export const columns = [
     title: "北池好氧硝酸盐",
     key: "jqr1HyXiaodan",
     width: 120,
-    render: ({ scJsZll }) => formatTofixed(scJsZll)
+    render: ({ jqr1HyXiaodan }) => formatTofixed(jqr1HyXiaodan)
   },
   {
     title: "南池好氧硝酸盐",