From b2f5c965f5278a7f40d84ef88aa92fc8f8a76ca4 Mon Sep 17 00:00:00 2001
From: xiaoyi <908147524@qq.com>
Date: 星期六, 07 十一月 2026 14:27:00 +0800
Subject: [PATCH] feat: 补齐退单管理/成本分析/执行分析/远程诊断/停机报表/风险监测前端
---
src/views/safety/risk-source/index.vue | 32 +++++++++++++++++++++++++++-----
1 files changed, 27 insertions(+), 5 deletions(-)
diff --git a/src/views/safety/risk-source/index.vue b/src/views/safety/risk-source/index.vue
index 13c0419..70b3551 100644
--- a/src/views/safety/risk-source/index.vue
+++ b/src/views/safety/risk-source/index.vue
@@ -3,36 +3,52 @@
import { onMounted, reactive, ref } from 'vue';
import { Page } from '@vben/common-ui';
import { Alert, Button, Card, Form, FormItem, Input, InputNumber, message, Modal, Popconfirm, Select, Space, Table, Tag } from 'ant-design-vue';
-import { createRiskSource, deleteRiskSource, getRiskSourcePage, updateRiskSource } from '#/api/safety/risk-source';
+import { createRiskSource, deleteRiskSource, getRiskSourcePage, refreshRiskSourceFromCollect, updateRiskSource } from '#/api/safety/risk-source';
defineOptions({ name: 'SafetyRiskSource' });
const rows=ref<SafetyRiskSource[]>([]); const loading=ref(false); const saving=ref(false); const open=ref(false);
const filters=reactive<{name?:string}>({}); const paging=reactive({current:1,pageSize:10,total:0});
-const blank=():SafetyRiskSource=>({name:'',category:'MAJOR',location:'',metricName:'',unit:'',lowerLimit:undefined,upperLimit:undefined,currentValue:undefined,remark:''});
+const blank=():SafetyRiskSource=>({name:'',category:'MAJOR',location:'',metricName:'',unit:'',lowerLimit:undefined,upperLimit:undefined,currentValue:undefined,remark:'',machineryId:undefined,metricKey:''});
const model=reactive<SafetyRiskSource>(blank());
const categories:Record<string,string>={MAJOR:'閲嶅ぇ鍗遍櫓婧�',HIGH_VOLTAGE:'楂樺帇璇曢獙鍖哄煙',OTHER:'鍏朵粬'};
const states:Record<string,string>={NORMAL:'姝e父',ALARM:'瓒呴檺',UNKNOWN:'鏈煡'};
const columns=[{title:'鍗遍櫓婧愬悕绉�',dataIndex:'name'},{title:'绫诲埆',key:'category'},{title:'浣嶇疆',dataIndex:'location'},
- {title:'鐩戞祴鎸囨爣',dataIndex:'metricName'},{title:'褰撳墠鍊�',key:'value'},{title:'闃堝��',key:'limits'},
+ {title:'鐩戞祴鎸囨爣',dataIndex:'metricName'},{title:'鏁版嵁鏉ユ簮',key:'source'},{title:'褰撳墠鍊�',key:'value'},{title:'闃堝��',key:'limits'},
{title:'鏁板�煎彉鏇存椂闂�',dataIndex:'observedAt'},{title:'鐘舵��',key:'status'},{title:'鎿嶄綔',key:'action',width:150}];
async function load(reset=false){if(reset)paging.current=1;loading.value=true;try{const r=await getRiskSourcePage({pageNo:paging.current,pageSize:paging.pageSize,...filters});rows.value=r.list;paging.total=r.total;}finally{loading.value=false;}}
function edit(row?:SafetyRiskSource){Object.assign(model,blank(),{id:undefined},row||{});open.value=true;}
async function save(){
if(!model.name.trim()||!model.metricName.trim()){message.warning('璇峰~鍐欏嵄闄╂簮鍚嶇О鍜岀洃娴嬫寚鏍�');return;}
if(model.lowerLimit!=null&&model.upperLimit!=null&&model.lowerLimit>model.upperLimit){message.warning('涓嬮檺涓嶈兘澶т簬涓婇檺');return;}
+ if(model.machineryId&&!model.metricKey?.trim()){message.warning('缁戝畾璁惧鍚庡繀椤诲~鍐欐暟閲囨寚鏍囬敭');return;}
+ if(!model.machineryId&&model.metricKey?.trim()){message.warning('濉啓鏁伴噰鎸囨爣閿墠璇峰厛缁戝畾璁惧');return;}
saving.value=true;try{if(model.id)await updateRiskSource(model);else await createRiskSource(model);message.success('淇濆瓨鎴愬姛');open.value=false;await load();}finally{saving.value=false;}
}
async function remove(id:number){await deleteRiskSource(id);message.success('宸插垹闄�');await load();}
+/** 浠庤澶囬噰闆嗗埛鏂板凡缁戝畾璁惧鐨勫嵄闄╂簮 */
+const refreshing=ref(false);
+async function refreshFromCollect(){
+ if(refreshing.value)return;
+ refreshing.value=true;
+ try{
+ const alarms=await refreshRiskSourceFromCollect();
+ const count=alarms?.length??0;
+ if(count>0){message.warning(`宸插埛鏂帮紝${count} 涓嵄闄╂簮瓒呴檺锛�${alarms.map(a=>a.name).join('銆�')}`);}
+ else{message.success('宸插埛鏂帮紝鏆傛棤瓒呴檺鍗遍櫓婧�');}
+ await load();
+ }finally{refreshing.value=false;}
+}
onMounted(()=>load());
</script>
<template>
<Page auto-content-height>
<Card title="鍗遍櫓婧愬彴璐�">
- <Alert class="mb-4" type="info" show-icon message="浜哄伐缁存姢褰撳墠鐩戞祴鍊煎拰闃堝�硷紱姝ら〉闈笉浠h〃鐜板満鑷姩閲囬泦锛屼害涓嶄繚瀛樺巻鍙茶娴嬪簭鍒椼��" />
- <Space class="mb-3"><Input v-model:value="filters.name" placeholder="鍗遍櫓婧愬悕绉�" allow-clear /><Button @click="load(true)">鏌ヨ</Button><Button v-access:code="['safety:risk:create']" type="primary" @click="edit()">鏂板鍗遍櫓婧�</Button></Space>
+ <Alert class="mb-4" type="info" show-icon message="鏈粦瀹氳澶囩殑鍗遍櫓婧愮敱浜哄伐缁存姢褰撳墠鍊硷紱缁戝畾璁惧骞跺~鍐欐暟閲囨寚鏍囬敭鍚庯紝鍙偣銆屼粠璁惧閲囬泦鍒锋柊銆嶈嚜鍔ㄥ彇鍊煎苟鎸夐槇鍊煎垽瀹氾紝涓嶄繚瀛樺巻鍙茶娴嬪簭鍒椼��" />
+ <Space class="mb-3"><Input v-model:value="filters.name" placeholder="鍗遍櫓婧愬悕绉�" allow-clear /><Button @click="load(true)">鏌ヨ</Button><Button v-access:code="['safety:risk:create']" type="primary" @click="edit()">鏂板鍗遍櫓婧�</Button><Button v-access:code="['safety:risk:update']" :loading="refreshing" @click="refreshFromCollect">浠庤澶囬噰闆嗗埛鏂�</Button></Space>
<Table :columns="columns" :data-source="rows" :loading="loading" :pagination="paging" row-key="id" :scroll="{x:1100}" @change="p=>{paging.current=p.current||1;paging.pageSize=p.pageSize||10;load();}">
<template #bodyCell="{column,record}">
<template v-if="column.key==='category'">{{categories[record.category]||record.category}}</template>
+ <template v-else-if="column.key==='source'"><Tag :color="record.machineryId?'blue':'default'">{{record.machineryId?`璁惧閲囬泦(${record.metricKey||'-'})`:'浜哄伐褰曞叆'}}</Tag></template>
<template v-else-if="column.key==='value'">{{record.currentValue??'鏈綍鍏�'}} {{record.unit||''}}</template>
<template v-else-if="column.key==='limits'">{{record.lowerLimit??'涓嶉檺'}} 锝� {{record.upperLimit??'涓嶉檺'}} {{record.unit||''}}</template>
<Tag v-else-if="column.key==='status'" :color="record.riskStatus==='ALARM'?'red':record.riskStatus==='NORMAL'?'green':'default'">{{states[record.riskStatus]||'鏈煡'}}</Tag>
@@ -49,6 +65,12 @@
<FormItem label="鍗曚綅"><Input v-model:value="model.unit" :maxlength="32" /></FormItem>
<FormItem label="涓嬮檺锛堝彲绌猴級"><InputNumber v-model:value="model.lowerLimit" class="w-full" /></FormItem>
<FormItem label="涓婇檺锛堝彲绌猴級"><InputNumber v-model:value="model.upperLimit" class="w-full" /></FormItem>
+ <FormItem label="鍏宠仈璁惧缂栧彿锛堝彲绌猴級" extra="濉啓鍚庣敱鏁伴噰鑷姩鍙栧�硷紝浜哄伐褰撳墠鍊煎皢琚鐩�">
+ <InputNumber v-model:value="model.machineryId" class="w-full" :min="1" placeholder="璁惧鍙拌处缂栧彿" />
+ </FormItem>
+ <FormItem label="鏁伴噰鎸囨爣閿紙鍙┖锛�" extra="鍙� mes_collect_realtime.data_json 涓殑瀛楁鍚嶏紝濡� current銆乻peed锛涗篃鍙敤 ot/sts/opm">
+ <Input v-model:value="model.metricKey" :maxlength="64" placeholder="濡� current" />
+ </FormItem>
<FormItem label="褰撳墠鍊硷紙浜哄伐褰曞叆锛�"><InputNumber v-model:value="model.currentValue" class="w-full" /></FormItem>
<FormItem label="澶囨敞"><Input.TextArea v-model:value="model.remark" :maxlength="500" /></FormItem>
</Form>
--
Gitblit v1.9.3