|
@@ -1,6 +1,6 @@
|
|
|
<script setup>
|
|
|
import { ref, onMounted, computed, unref, watch } from 'vue';
|
|
|
-import { NScrollbar, useMessage, NTabs, NTabPane, c } from 'naive-ui';
|
|
|
+import { NScrollbar, useMessage, NTabs, NTabPane, NProgress } from 'naive-ui';
|
|
|
import { TheChatView } from '@/components';
|
|
|
import { controlApi } from "@/api/control";
|
|
|
import BaseTitle from './components/BaseTitle.vue';
|
|
@@ -13,372 +13,176 @@ import TheEchartPanel from './components/TheEchartPanel.vue';
|
|
|
|
|
|
import NumberPanel from './NumberPanel.vue';
|
|
|
import CirclePanel from './CirclePanel.vue';
|
|
|
+import EchartLeft from './EchartLeft.vue'
|
|
|
+import EchartRight from './EchartRight.vue'
|
|
|
+import DrawerSetting from './DrawerSetting.vue';
|
|
|
+import ParamterCard from './ParamterCard.vue';
|
|
|
+import DrawerWarning from './DrawerWarning.vue';
|
|
|
+
|
|
|
+let isProcessing = false;
|
|
|
|
|
|
const message = useMessage();
|
|
|
-const isVisibleBtn = ref(true);
|
|
|
-const isVisibleUpdateInfo = ref(false);
|
|
|
+const processNumber = ref(0);
|
|
|
const systemStatus = ref(0);
|
|
|
+const configurationStatus = ref(1);
|
|
|
+const medicineAmount = ref(0);
|
|
|
+const tytjTransientLL = ref(0);
|
|
|
|
|
|
-const columnData = ref([
|
|
|
- { label: '后反馈设定', key: 'htfksd', value: '' },
|
|
|
- { label: '基准系数', key: 'jzxs', value: '' },
|
|
|
- { label: '修正系数', key: 'xzxs', value: '' },
|
|
|
- { label: '控制系数', key: 'kzxs', value: '' },
|
|
|
- { label: '水量分配系数', key: 'slfpxs', value: '' },
|
|
|
- { label: '碳源当量', key: 'tydl', value: '' },
|
|
|
- { label: '转换系数', key: 'zhxs', value: '' },
|
|
|
- { label: '稀释倍数', key: 'sxps', value: '' },
|
|
|
- { label: '药剂密度', key: 'yymd', value: '' },
|
|
|
- { label: '最小启动流量', key: 'zxqdll', value: '' },
|
|
|
- { label: '碳氮比', key: 'tdb', value: '' }
|
|
|
-])
|
|
|
-
|
|
|
-const doseNum = ref(null);
|
|
|
-const flowNum = ref(null);
|
|
|
-const updateNum = ref(null);
|
|
|
-
|
|
|
-const tabKeyEnum = {
|
|
|
- 0: 'auto',
|
|
|
- 1: 'onePool',
|
|
|
- 2: 'twoPool',
|
|
|
- 3: 'worker'
|
|
|
-}
|
|
|
+const paramterDrawerVisible = ref(false);
|
|
|
+const warningDrawerVisible = ref(false);
|
|
|
|
|
|
-// water实时数据
|
|
|
-const waterConfigParams = ref({});
|
|
|
+const paramterValue = ref({});
|
|
|
|
|
|
-// 基础数据
|
|
|
-const dataSourceParams = ref({
|
|
|
- auto: {},
|
|
|
- onePool: {},
|
|
|
- twoPool: {},
|
|
|
- worker: {
|
|
|
- medicineAmount: null
|
|
|
- }
|
|
|
-})
|
|
|
+const systemSwitchType = computed(() => configurationStatus.value === 0 && systemStatus.value === 1);
|
|
|
|
|
|
-// 系数
|
|
|
-const baseSourceParams = ref({
|
|
|
- numberBeng: 0,
|
|
|
- type: 0
|
|
|
-})
|
|
|
+// 开始投放
|
|
|
+const handleSystemStatus = () => {
|
|
|
|
|
|
-// 当前Tab选中的key
|
|
|
-const tabActiveKey = computed(() => tabKeyEnum[baseSourceParams.value.type]);
|
|
|
-// 计算碳氮比
|
|
|
-const tdbNum = computed(() => {
|
|
|
- const type = tabActiveKey.value;
|
|
|
+ if ( isProcessing ) return;
|
|
|
|
|
|
- const [ r1, r2, rOne, rTwo] = getTotalNum();
|
|
|
-
|
|
|
- const {
|
|
|
- jsLlOne, jsLlTwo,
|
|
|
- jsCodOne, jsCodTwo,
|
|
|
- jsTnOne, jsTnTwo
|
|
|
- } = dataSourceParams.value[type];
|
|
|
+ isProcessing = true;
|
|
|
|
|
|
- const {
|
|
|
- tydl, zhxs
|
|
|
- } = baseSourceParams.value
|
|
|
-
|
|
|
- if ( type === 'auto' || type === 'worker' ) {
|
|
|
- const rNum = Math.max( r1, r2 );
|
|
|
- const jsll = rNum == r1 ? jsLlOne: jsLlTwo;
|
|
|
- const cod = rNum == r1 ? jsCodOne: jsCodTwo;
|
|
|
- const jsTn = rNum == r1 ? jsTnOne: jsTnTwo;
|
|
|
- const n = rNum == r1 ? rOne : rOne
|
|
|
- return Number(((n*1000/jsll*tydl+cod*zhxs*tydl)/jsTn).toFixed(2));
|
|
|
- }
|
|
|
- if ( type === 'onePool' ) {
|
|
|
- return Number(((rOne*1000/jsLlOne*tydl+jsCodOne*zhxs*tydl)/jsTnOne).toFixed(2));
|
|
|
- }
|
|
|
- if ( type === 'twoPool' ) {
|
|
|
- return Number(((rTwo*1000/jsLlTwo*tydl+jsCodTwo*zhxs*tydl)/jsTnTwo).toFixed(2));
|
|
|
+ if ( configurationStatus.value == 1 ) {
|
|
|
+ return message.warning('当前组态未启用,无法投放');
|
|
|
}
|
|
|
-})
|
|
|
-watch(() => tdbNum.value , tdb => {
|
|
|
- columnData.value[columnData.value.length - 1].value = tdb;
|
|
|
-})
|
|
|
-
|
|
|
-// 编辑系数 - confirm
|
|
|
-const onEditConfirm = () => {
|
|
|
- isVisibleBtn.value = true;
|
|
|
- columnData.value = columnData.value.map(item => {
|
|
|
- Object.entries(baseSourceParams.value).forEach(([key, value]) => {
|
|
|
- if (key === item.key) {
|
|
|
- item.value = value;
|
|
|
- }
|
|
|
- })
|
|
|
- return item;
|
|
|
- })
|
|
|
|
|
|
- handleMedicateAmount();
|
|
|
-}
|
|
|
-
|
|
|
-// 编辑系数 - 取消
|
|
|
-const onEditCancel = () => {
|
|
|
- isVisibleBtn.value = true;
|
|
|
-
|
|
|
- columnData.value.map(({ key, value }) => {
|
|
|
- baseSourceParams.value[key] = value;
|
|
|
- })
|
|
|
-}
|
|
|
-
|
|
|
-const onFinalResult = () => {
|
|
|
const addStatus = systemStatus.value === 0 ? 1 : 0;
|
|
|
|
|
|
controlApi.putSystemStatus({ addStatus });
|
|
|
|
|
|
- systemStatus.value = addStatus;
|
|
|
-
|
|
|
- message.warning(addStatus === 0 ? '当前投药状态:已停用' : '当前投药状态:投放中');
|
|
|
-
|
|
|
+ operateNumbers(addStatus === 0 ? "decrement" : "increment", () => {
|
|
|
+ systemStatus.value = addStatus;
|
|
|
+ isProcessing = false
|
|
|
+ message.warning(addStatus === 0 ? '当前投药状态:已停用' : '当前投药状态:投放中');
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
-const onUpdateTab = (index) => {
|
|
|
- const currentData = dataSourceParams.value[tabKeyEnum[index]];
|
|
|
- baseSourceParams.value.type = index;
|
|
|
- if ( !Object.keys(currentData).length ) {
|
|
|
- isVisibleUpdateInfo.value = false;
|
|
|
- return;
|
|
|
- }
|
|
|
- isVisibleBtn.value = true;
|
|
|
- handleMedicateAmount();
|
|
|
+// 更新参数设置
|
|
|
+const handleUpdateParams = () => {
|
|
|
+ paramterDrawerVisible.value = false;
|
|
|
+ initData();
|
|
|
}
|
|
|
|
|
|
-function getTotalNum() {
|
|
|
- const {
|
|
|
- hycXsyOne = 0, hycXsyTwo = 0,
|
|
|
- qycAdOne = 0, qycAdTwo = 0,
|
|
|
- qycYxyOne = 0, qycYxyTwo = 0,
|
|
|
- jsLlOne = 0, jsLlTwo = 0,
|
|
|
- jsCodOne = 0, jsCodTwo = 0
|
|
|
- } = dataSourceParams.value[tabActiveKey.value];
|
|
|
-
|
|
|
- const {
|
|
|
- htfksd, xzxs, kzxs, slfpxs, zhxs, tydl, jzxs, yymd, sxps
|
|
|
- } = baseSourceParams.value;
|
|
|
+const getNumVal = (type, n1, n2, activeIndex) => {
|
|
|
|
|
|
- const rOne1 = (((2*hycXsyOne-htfksd)+((qycAdOne+qycYxyOne)*xzxs-htfksd))*(jzxs-1))*(jsLlOne*slfpxs)/1000;
|
|
|
- const rOne2 = (rOne1*kzxs-(jsLlOne*slfpxs*jsCodOne*zhxs/1000))/tydl;
|
|
|
- const rOne3 = rOne2/yymd/1000*sxps
|
|
|
+ if ( type == 0 ) {
|
|
|
+ return Math.max(n1, n2);
|
|
|
+ }
|
|
|
|
|
|
- const rTwo1 = (((2*hycXsyTwo-htfksd)+((qycAdTwo+qycYxyTwo)*xzxs-htfksd))*(jzxs-1))*(jsLlTwo*slfpxs)/1000;
|
|
|
- const rTwo2 = (rTwo1*kzxs-(jsLlTwo*slfpxs*jsCodTwo*zhxs/1000))/tydl;
|
|
|
- const rTwo3 = rTwo2/yymd/1000*sxps
|
|
|
+ if ( type == 1 ) {
|
|
|
+ return n1 || n1 == 0 ? Number(n1.toFixed(2)) : '--'
|
|
|
+ }
|
|
|
|
|
|
- const r1 = Number((rOne3 < 0 || !rOne3) ? 0 : rOne3.toFixed(3)) || 0;
|
|
|
- const r2 = Number((rTwo3 < 0 || !rTwo3) ? 0 : rTwo3.toFixed(3)) || 0;
|
|
|
+ if ( type == 2 ) {
|
|
|
+ return n2 || n2 == 0 ? Number(n2.toFixed(2)) : '--'
|
|
|
+ }
|
|
|
|
|
|
- return [ r1, r2, rOne2, rTwo2 ];
|
|
|
}
|
|
|
|
|
|
-const onConfirmUpdate = async () => {
|
|
|
- await controlApi.postAddRecord({
|
|
|
- ...dataSourceParams.value[tabKeyEnum[baseSourceParams.value.type]],
|
|
|
- ...baseSourceParams.value,
|
|
|
- });
|
|
|
+const operateNumbers = (operationType, callBack) => {
|
|
|
+ const totalTime = 3000;
|
|
|
+ const steps = 100;
|
|
|
+ const intervalTime = totalTime / steps;
|
|
|
|
|
|
- isVisibleUpdateInfo.value = false;
|
|
|
+ let currentNumber = operationType === 'decrement' ? 100 : 1;
|
|
|
|
|
|
- message.success("系统加药量,更新成功");
|
|
|
+ processNumber.value = currentNumber;
|
|
|
|
|
|
- doseNum.value = updateNum.value;
|
|
|
-}
|
|
|
+ const intervalId = setInterval(() => {
|
|
|
+ operationType === 'increment' ? currentNumber++ : currentNumber--
|
|
|
|
|
|
-// 更新投药结果
|
|
|
-const handleMedicateAmount = () => {
|
|
|
- const type = tabActiveKey.value;
|
|
|
- const lastNum = unref(updateNum);
|
|
|
- const tdb = tdbNum.value;
|
|
|
-
|
|
|
- if ( type === 'worker' ) {
|
|
|
- const medicineNum = dataSourceParams.value.worker.medicineAmount;
|
|
|
- if ( medicineNum || medicineNum == 0 ) {
|
|
|
- updateNum.value = medicineNum;
|
|
|
- isVisibleUpdateInfo.value = true;
|
|
|
- baseSourceParams.value.tdb = tdb;
|
|
|
- message.warning("有新投放方案, 请查看")
|
|
|
- } else {
|
|
|
- updateNum.value = null;
|
|
|
- isVisibleUpdateInfo.value = false;
|
|
|
+ processNumber.value = currentNumber
|
|
|
+
|
|
|
+ if ((operationType === 'increment' && currentNumber > 100) ||
|
|
|
+ (operationType === 'decrement' && currentNumber < 0)) {
|
|
|
+ clearInterval(intervalId);
|
|
|
+ callBack && callBack();
|
|
|
}
|
|
|
- return;
|
|
|
- }
|
|
|
+ }, intervalTime);
|
|
|
+}
|
|
|
|
|
|
- const [r1, r2] = getTotalNum();
|
|
|
- const maxR = Math.max( r1, r2 );
|
|
|
+const initData = async () => {
|
|
|
+ const { data } = await controlApi.getBaseData();
|
|
|
+ const {
|
|
|
+ addType,
|
|
|
|
|
|
- if ( type === 'auto' && maxR !== lastNum) {
|
|
|
- updateNum.value = maxR;
|
|
|
- isVisibleUpdateInfo.value = true;
|
|
|
- baseSourceParams.value.tdb = tdb;
|
|
|
- message.warning("有新的投放方案, 请查看");
|
|
|
+ numberBeng, type,
|
|
|
+ jsLlOne, jsLlTwo,
|
|
|
+ jsCodOne, jsCodTwo,
|
|
|
+ jsTnOne, jsTnTwo,
|
|
|
+ hycXsyOne, hycXsyTwo,
|
|
|
+
|
|
|
+ qycYxyOne, qycYxyTwo,
|
|
|
+ qycAdOne, qycAdTwo,
|
|
|
+
|
|
|
+ // 系统加药量
|
|
|
+ medicineAmount,
|
|
|
+ // 瞬时加药量
|
|
|
+ tytjTransientLL
|
|
|
+ } = data;
|
|
|
+
|
|
|
+ const numberBengEunm = {
|
|
|
+ 0: '1号加药泵',
|
|
|
+ 1: '2号加药泵',
|
|
|
+ 2: '3号加药泵'
|
|
|
}
|
|
|
|
|
|
- if ( type === 'onePool' && r1 != lastNum) {
|
|
|
- updateNum.value = r1;
|
|
|
- isVisibleUpdateInfo.value = true;
|
|
|
- baseSourceParams.value.tdb = tdb;
|
|
|
- message.warning("有新的投放方案, 请查看");
|
|
|
+ const typeEnum = {
|
|
|
+ 0: '自动',
|
|
|
+ 1: '1号池',
|
|
|
+ 2: '2号池',
|
|
|
+ 3: '手动'
|
|
|
}
|
|
|
|
|
|
- if ( type === 'twoPool' && r2 != lastNum ) {
|
|
|
- updateNum.value = r2;
|
|
|
- isVisibleUpdateInfo.value = true;
|
|
|
- baseSourceParams.value.tdb = tdb;
|
|
|
- message.warning("有新的投放方案, 请查看");
|
|
|
- }
|
|
|
+ paramterValue.value = {
|
|
|
+ device: `${numberBengEunm[numberBeng]} / ${typeEnum[type]}`,
|
|
|
+ jsll: getNumVal(type, jsLlOne, jsLlTwo) + ' m³/h',
|
|
|
+ cod: getNumVal(type, jsCodOne, jsCodTwo) + ' mg/L',
|
|
|
+ jszd: getNumVal(type, jsTnOne, jsTnTwo) + ' mg/L',
|
|
|
+ hycxsy: getNumVal(type, hycXsyOne, hycXsyTwo) + ' mg/L',
|
|
|
+ hycad: '没有',
|
|
|
+ qycxsy: getNumVal(type, qycYxyOne, qycYxyTwo) + ' mg/L',
|
|
|
+ qycan: getNumVal(type, qycAdOne, qycAdTwo) + ' mg/L',
|
|
|
+ };
|
|
|
+
|
|
|
+ configurationStatus.value = addType;
|
|
|
|
|
|
}
|
|
|
|
|
|
onMounted(async () => {
|
|
|
- // 获取最后一条记录 getSystemStatus
|
|
|
- await controlApi.getBaseData().then(({ data }) => {
|
|
|
- const {
|
|
|
- numberBeng = 0, type = 0,
|
|
|
- htfksd, jzxs, xzxs, kzxs, slfpxs, tydl, zhxs, sxps, yymd, zxqdll,
|
|
|
- medicineAmount,
|
|
|
- addType,
|
|
|
- tytjTransientLL
|
|
|
- } = data;
|
|
|
-
|
|
|
- baseSourceParams.value = {
|
|
|
- ...baseSourceParams.value,
|
|
|
- numberBeng, type,
|
|
|
- htfksd, jzxs, xzxs, kzxs, slfpxs, tydl, zhxs, sxps, yymd, zxqdll,
|
|
|
- addType
|
|
|
- };
|
|
|
-
|
|
|
- updateNum.value = medicineAmount;
|
|
|
-
|
|
|
- doseNum.value = medicineAmount;
|
|
|
-
|
|
|
- flowNum.value = tytjTransientLL;
|
|
|
-
|
|
|
- dataSourceParams.value[tabActiveKey.value] = data;
|
|
|
-
|
|
|
- })
|
|
|
-
|
|
|
-
|
|
|
- // 获取实时数据
|
|
|
- controlApi.getNumValue().then(({ data }) => {
|
|
|
-
|
|
|
- Object.entries(data).forEach(([key, val]) => {
|
|
|
- data[key] = val;
|
|
|
- });
|
|
|
-
|
|
|
- // water实时数据
|
|
|
- waterConfigParams.value = data;
|
|
|
-
|
|
|
- // 重新计算碳氮比
|
|
|
- const tdb = tdbNum.value;
|
|
|
- baseSourceParams.value.tdb = tdb;
|
|
|
-
|
|
|
- columnData.value = columnData.value.map(item => {
|
|
|
- item.value = item.key === 'tdb' ? tdb : dataSourceParams.value[tabActiveKey.value][item.key];
|
|
|
- return item;
|
|
|
- })
|
|
|
-
|
|
|
- const params = {
|
|
|
- jsLlType: 1,
|
|
|
- jsLlOne: data.jslYB,
|
|
|
- jsLlTwo: data.jslYB,
|
|
|
- jsCodType: 1,
|
|
|
- jsCodOne: data.jsCodYB,
|
|
|
- jsCodTwo: data.jsCodYB,
|
|
|
- hycXsyType: 1,
|
|
|
- hycXsyOne: data.hyXsyHYOne,
|
|
|
- hycXsyTwo: data.hyXsyHYTwo,
|
|
|
- qycYxyType: 1,
|
|
|
- qycYxyOne: data.qyXsyHYOne,
|
|
|
- qycYxyTwo: data.qyXsyHYTwo,
|
|
|
- qycAdType: 1,
|
|
|
- qycAdOne: data.qyAdHYOne,
|
|
|
- qycAdTwo: data.qyAdHYTwo,
|
|
|
- jsTnType: 1,
|
|
|
- jsTnOne: data.jsTnYB,
|
|
|
- jsTnTwo: data.jsTnYB
|
|
|
- }
|
|
|
-
|
|
|
- Object.keys(dataSourceParams.value).forEach(key => {
|
|
|
- const item = dataSourceParams.value[key];
|
|
|
- if ( !Object.keys(item).length ) {
|
|
|
- dataSourceParams.value[key] = { ...params };
|
|
|
- }
|
|
|
- })
|
|
|
- })
|
|
|
+ // 初始化
|
|
|
+ await initData();
|
|
|
|
|
|
// 获取是否允许投药开关
|
|
|
- controlApi.getSystemStatus().then(({ data }) => {
|
|
|
+ await controlApi.getSystemStatus().then(({ data }) => {
|
|
|
// 0不允许 1允许
|
|
|
systemStatus.value = data;
|
|
|
});
|
|
|
|
|
|
+ processNumber.value = systemSwitchType.value ? 100 : 0;
|
|
|
})
|
|
|
-
|
|
|
</script>
|
|
|
|
|
|
<template>
|
|
|
<section class="flex items-start h-full">
|
|
|
<TheChatView leftTitle="智适应碳源投加" :isChatSlot="false" :isFooter="false">
|
|
|
<template #control>
|
|
|
- <div class="control-container space-y-[16px]">
|
|
|
+ <div class="control-container">
|
|
|
<div class="arg-section">
|
|
|
|
|
|
<div class="left-card space-y-[16px]">
|
|
|
<BaseTitle title="智能投加计算"></BaseTitle>
|
|
|
- <ul class="paramter-list">
|
|
|
- <li class="paramter-item">
|
|
|
- <span class="label">加药设备</span>
|
|
|
- <span class="value">1号加药泵 / 1号池</span>
|
|
|
- </li>
|
|
|
- <li class="line"></li>
|
|
|
- <li class="paramter-item">
|
|
|
- <span class="label">进水流量</span>
|
|
|
- <span class="value">1号加药泵 / 1号池</span>
|
|
|
- </li>
|
|
|
- <li class="line"></li>
|
|
|
- <li class="paramter-item">
|
|
|
- <span class="label">进水COD</span>
|
|
|
- <span class="value">1号加药泵 / 1号池</span>
|
|
|
- </li>
|
|
|
- <li class="line"></li>
|
|
|
- <li class="paramter-item">
|
|
|
- <span class="label">进水总氮</span>
|
|
|
- <span class="value">1号加药泵 / 1号池</span>
|
|
|
- </li>
|
|
|
- <li class="line"></li>
|
|
|
- <li class="paramter-item">
|
|
|
- <span class="label">好氧池硝酸盐</span>
|
|
|
- <span class="value">1号加药泵 / 1号池</span>
|
|
|
- </li>
|
|
|
- <li class="line"></li>
|
|
|
- <li class="paramter-item">
|
|
|
- <span class="label">好氧池氨氮</span>
|
|
|
- <span class="value">1号加药泵 / 1号池</span>
|
|
|
- </li>
|
|
|
- <li class="line"></li>
|
|
|
- <li class="paramter-item">
|
|
|
- <span class="label">缺氧池硝酸盐</span>
|
|
|
- <span class="value">1号加药泵 / 1号池</span>
|
|
|
- </li>
|
|
|
- <li class="line"></li>
|
|
|
- <li class="paramter-item">
|
|
|
- <span class="label">缺氧池氨氮</span>
|
|
|
- <span class="value">1号加药泵 / 1号池</span>
|
|
|
- </li>
|
|
|
- </ul>
|
|
|
+ <ParamterCard :data="paramterValue"></ParamterCard>
|
|
|
</div>
|
|
|
|
|
|
<div class="right-card">
|
|
|
<div class="header">
|
|
|
<h4 class="title">智能系统参数</h4>
|
|
|
<ul class="btn-list space-x-[8px]">
|
|
|
- <li class="item">
|
|
|
+ <li class="item" @click="paramterDrawerVisible = true">
|
|
|
<span>参数设置</span>
|
|
|
</li>
|
|
|
- <li class="item">
|
|
|
+ <li class="item" @click="warningDrawerVisible = true">
|
|
|
<span>系统告警</span>
|
|
|
<span class="waring-circle-icon"></span>
|
|
|
</li>
|
|
@@ -387,38 +191,59 @@ onMounted(async () => {
|
|
|
<div class="result-content">
|
|
|
<div class="number_card space-x-[20px]">
|
|
|
<NumberPanel direction="left" title="智能控制系数" :value="123"></NumberPanel>
|
|
|
- <CirclePanel></CirclePanel>
|
|
|
+ <CirclePanel :medicineAmount="medicineAmount" :tytjTransientLL="tytjTransientLL"></CirclePanel>
|
|
|
<NumberPanel direction="right" title="硝酸盐智能设定" unit="mg/L" :value="22"></NumberPanel>
|
|
|
</div>
|
|
|
<div class="progress_card space-y-[8px]">
|
|
|
<span class="time">模型更新时间: 2025-04-11 12:11:11</span>
|
|
|
- <div class="progress"></div>
|
|
|
- <span class="tips">Libra智能投药中...</span>
|
|
|
+ <div class="progress">
|
|
|
+ <NProgress
|
|
|
+ processing
|
|
|
+ type="line"
|
|
|
+ :border-radius="0"
|
|
|
+ :percentage="processNumber"
|
|
|
+ :show-indicator="false"
|
|
|
+ :height="10"
|
|
|
+ :color="'red'"
|
|
|
+ rail-color="transparent"
|
|
|
+ class="custom-progress"
|
|
|
+ ></NProgress>
|
|
|
+ </div>
|
|
|
+ <span class="tips">Libra智能{{ systemSwitchType ? "投药中" : "未启用" }}...</span>
|
|
|
</div>
|
|
|
<div class="play_card">
|
|
|
- <div class="play-btn space-x-[12px]">
|
|
|
- <span class="icon"></span>
|
|
|
- <span>暂停</span>
|
|
|
+ <div class="play-btn space-x-[6px]" @click="handleSystemStatus">
|
|
|
+ <span :class="[systemSwitchType ? 'icon_end' : 'icon_start' ]"></span>
|
|
|
+ <span>{{ systemSwitchType ? "暂停" : "开始" }}</span>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
-
|
|
|
</div>
|
|
|
- <div class="echart-section">
|
|
|
-
|
|
|
+ <div class="echart-section space-x-[20px]">
|
|
|
+ <EchartLeft></EchartLeft>
|
|
|
+ <EchartRight></EchartRight>
|
|
|
</div>
|
|
|
</div>
|
|
|
</template>
|
|
|
</TheChatView>
|
|
|
</section>
|
|
|
+
|
|
|
+ <!-- 参数设置 - 抽屉 -->
|
|
|
+ <DrawerSetting
|
|
|
+ v-model:show="paramterDrawerVisible"
|
|
|
+ @on-update="handleUpdateParams"
|
|
|
+ ></DrawerSetting>
|
|
|
+
|
|
|
+ <!-- 系统告警 - 抽屉 -->
|
|
|
+ <DrawerWarning
|
|
|
+ v-model:show="warningDrawerVisible"
|
|
|
+ ></DrawerWarning>
|
|
|
</template>
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
.control-container {
|
|
|
- // @include flex(x, start, start);
|
|
|
height: 100%;
|
|
|
-
|
|
|
.arg-section {
|
|
|
@include flex(x, start, start);
|
|
|
height: 57%;
|
|
@@ -427,6 +252,7 @@ onMounted(async () => {
|
|
|
border-radius: 10px;
|
|
|
background: url(@/assets/images/control/bg-top.png) left center no-repeat;
|
|
|
background-size: 878px 100% ;
|
|
|
+ overflow: hidden;
|
|
|
|
|
|
.left-card {
|
|
|
flex-shrink: 0;
|
|
@@ -434,34 +260,6 @@ onMounted(async () => {
|
|
|
height: 100%;
|
|
|
display: flex;
|
|
|
flex-flow: column;
|
|
|
-
|
|
|
- .paramter-list {
|
|
|
- flex: 1;
|
|
|
- display: flex;
|
|
|
- justify-content: space-between;
|
|
|
- flex-flow: column;
|
|
|
- padding: 14px;
|
|
|
- border: 1px solid #fff;
|
|
|
- border-radius: 10px;
|
|
|
- background: rgba(255, 255, 255, 0.20);
|
|
|
- backdrop-filter: blur(5px);
|
|
|
- font-size: 13px;
|
|
|
- color: #585858;
|
|
|
- line-height: 22px;
|
|
|
-
|
|
|
- .line {
|
|
|
- width: 100%;
|
|
|
- height: 1px;
|
|
|
- background: #EEE;
|
|
|
- }
|
|
|
- .paramter-item {
|
|
|
- @include flex(x, center, between);
|
|
|
- .value {
|
|
|
- color: #1A2029;
|
|
|
- font-weight: bold;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
.right-card {
|
|
@@ -513,72 +311,12 @@ onMounted(async () => {
|
|
|
@include flex(y, center, around);
|
|
|
height: calc(100% - 40px);
|
|
|
padding: 0px 86px 0 86px;
|
|
|
- // background: #0059FF;
|
|
|
background-clip: padding-box;
|
|
|
|
|
|
.number_card {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
justify-content: center;
|
|
|
-
|
|
|
- .left, .right {
|
|
|
- text-align: center;
|
|
|
- .left-animate {
|
|
|
- background: url("@/assets/images/control/number-card-left.png") center center no-repeat;
|
|
|
- .number {
|
|
|
- right: 30px;
|
|
|
- }
|
|
|
- }
|
|
|
- .right-animate {
|
|
|
- background: url("@/assets/images/control/number-card-right.png") center center no-repeat;
|
|
|
- .number {
|
|
|
- @include flex(y, start, center);
|
|
|
- left: 30px;
|
|
|
- span {
|
|
|
- color: #000;
|
|
|
- font-family: "PingFang SC";
|
|
|
- font-size: 12px;
|
|
|
- font-style: normal;
|
|
|
- font-weight: 400;
|
|
|
- line-height: normal;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- .animate-card {
|
|
|
- position: relative;
|
|
|
- width: 194px;
|
|
|
- height: 164px;
|
|
|
- // background-size: 140px 100%;
|
|
|
- background-size: cover;
|
|
|
-
|
|
|
- .number {
|
|
|
- position: absolute;
|
|
|
- top: 30px;
|
|
|
- color: #1A2029;
|
|
|
- // font-family: "DIN-RegularAlternate";
|
|
|
- font-family: "D-DIN-PRO-700-Bold";
|
|
|
- font-size: 52px;
|
|
|
- font-style: normal;
|
|
|
- font-weight: 700;
|
|
|
- }
|
|
|
- }
|
|
|
- .sub-title {
|
|
|
- color: #333;
|
|
|
- font-family: "PingFang SC";
|
|
|
- font-size: 12px;
|
|
|
- font-style: normal;
|
|
|
- font-weight: 400;
|
|
|
- line-height: 20px;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- .middel {
|
|
|
- width: 186px;
|
|
|
- height: 186px;
|
|
|
- background: url("@/assets/images/control/number-card-middle.svg") center center no-repeat,
|
|
|
- url("@/assets/images/control/number-card-middle2.svg") center bottom no-repeat;
|
|
|
- background-size: contain;
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
.progress_card {
|
|
@@ -608,7 +346,8 @@ onMounted(async () => {
|
|
|
.progress {
|
|
|
width: 165px;
|
|
|
height: 10px;
|
|
|
- background: red;
|
|
|
+ background: #cce7ec;
|
|
|
+ box-shadow: 0px 5px 5px #ccc;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -616,8 +355,6 @@ onMounted(async () => {
|
|
|
@include flex(x, center, center);
|
|
|
.play-btn {
|
|
|
@include flex(x, center, center);
|
|
|
- // width: 136px;
|
|
|
- // height: 64px;
|
|
|
width: 120px;
|
|
|
height: 48px;
|
|
|
background: url("@/assets/images/control/bg-play-btn.png") center center no-repeat;
|
|
@@ -627,13 +364,20 @@ onMounted(async () => {
|
|
|
font-weight: 500;
|
|
|
line-height: 16px;
|
|
|
cursor: pointer;
|
|
|
- .icon {
|
|
|
+ user-select: none;
|
|
|
+ .icon_end, .icon_start {
|
|
|
display: block;
|
|
|
width: 28px;
|
|
|
height: 28px;
|
|
|
+ }
|
|
|
+ .icon_end {
|
|
|
background: url("@/assets/images/control/icon-end.svg") center center no-repeat;
|
|
|
background-size: cover;
|
|
|
}
|
|
|
+ .icon_start {
|
|
|
+ background: url("@/assets/images/control/icon-start.svg") center center no-repeat;
|
|
|
+ background-size: cover;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -641,32 +385,38 @@ onMounted(async () => {
|
|
|
}
|
|
|
|
|
|
.echart-section {
|
|
|
+ @include flex(x, start, start);
|
|
|
height: 43%;
|
|
|
- background: red;
|
|
|
+ padding-top: 16px;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
</style>
|
|
|
|
|
|
<style lang="scss">
|
|
|
-.custom-tab_item {
|
|
|
- @include flex (x, center, center);
|
|
|
- height: 35px;
|
|
|
- border-radius: 4px;
|
|
|
- background: #F3F5FA;
|
|
|
-
|
|
|
- &.n-tabs-tab--active {
|
|
|
- transition: none !important;
|
|
|
- border-radius: 4px;
|
|
|
- transition: none !important;
|
|
|
- background: url('https://static.fuxicarbon.com/bigModel/pc/tab-border-item-2x.png') -3px 0px no-repeat, linear-gradient(180deg, #F1F3FE 0%, #FFF 100%);
|
|
|
- background-size: 107% 100%;
|
|
|
+.progress {
|
|
|
+ .custom-progress {
|
|
|
+ .n-progress-graph-line-fill {
|
|
|
+ background: linear-gradient(to right, rgba(0, 101, 253, 1), rgba(0, 239, 234, 1)) !important;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// .custom-tab_item {
|
|
|
+// @include flex (x, center, center);
|
|
|
+// height: 35px;
|
|
|
+// border-radius: 4px;
|
|
|
+// background: #F3F5FA;
|
|
|
+
|
|
|
+// &.n-tabs-tab--active {
|
|
|
+// transition: none !important;
|
|
|
+// border-radius: 4px;
|
|
|
+// transition: none !important;
|
|
|
+// background: url('https://static.fuxicarbon.com/bigModel/pc/tab-border-item-2x.png') -3px 0px no-repeat, linear-gradient(180deg, #F1F3FE 0%, #FFF 100%);
|
|
|
+// background-size: 107% 100%;
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
.control-container .left-section {
|
|
|
.n-tabs-nav-scroll-content {
|
|
|
padding-bottom: 10px;
|