Authored by 王涛

Merge branch 'master-500-dev-lushangqing' into 'master-500-dev'

历史告警消除功能及知识库详情页



See merge request !499
... ... @@ -6,6 +6,13 @@
max-height: 100%;
overflow: auto;
}
.alarmsClearEditor-container .el-button--primary{
background: #1E9FFF;
border-color: #1E9FFF;
}
.alarmsClearEditor-container .el-tag{
color:#1E9FFF;
}
.alarmsClearEditor-info{
/*padding:10px;*/
}
... ... @@ -40,6 +47,10 @@
text-align: left;
width:100%;
}
.info-item-statistics .el-collapse-item__content{
max-height:250px;
overflow: auto;
}
.info-content{
margin-bottom: 5px;
}
... ... @@ -136,3 +147,32 @@
.apply-btn .el-button{
margin:3px;
}
.clearDetail-container{
padding:0 15px;
min-height: 500px;
max-height:800px;
overflow: auto;
}
.clearDetail-title{
text-align: left;
font-size:16px;
}
.clearDetail-handlePer{
display: flex;
align-items: center;
justify-content: space-between;
}
.clearDetail-handlePer{
padding:10px 0;
color:#999999;
}
.editor{
text-align: left;
}
.tag-keyword-span{
padding:5px 10px;
background: #ecf5ff;
color:#1E9FFF;
margin:5px;
border-radius: 3px;
}
... ...
<div class="info-content">
<div class="info-content-body">
<div class="content-body-info">
<div class="info-item-notice">通知信息:{{alarmInfo.alarmContent}}</div>
<div class="info-item-notice">通知人清单:{{alarmInfo.nickName}}</div>
</div>
</div>
</div>
<div class="info-content">
<div class="info-content-body">
<div class="content-body-info">
<div class="info-item-statistics">
统计信息:该告警历史上出现了{{statisticsData.alarmCnt?statisticsData.alarmCnt:0}}次
<span v-if="statisticsData.alarmCnt">,平均持续时长{{statisticsData.continueTimeAvg?statisticsData.continueTimeAvg:0}}s,
... ...
... ... @@ -6,10 +6,6 @@ export default {
type: String,
default: ''
},
alarmInfo:{
type:Object,
default:{}
},
//同类型告警处理审核部分是否显示
isExamine: {
type: Boolean,
... ...
... ... @@ -40,7 +40,7 @@
<template #tools="{scope}" >
<div class="apply-btn">
<el-button v-if="(scope.row.status==1 && scope.row.approver==loginName) || ((scope.row.status==0 || scope.row.status==3) && scope.row.managename==loginName) " @click="handle(scope.row)" size="mini">处理</el-button>
<el-button v-if="(scope.row.status==1 && scope.row.managename==loginName) || scope.row.status==2 " @click="handle(scope.row)" size="mini">查看</el-button>
<el-button v-if="(scope.row.status==1 && scope.row.managename==loginName) || scope.row.status==2 || (scope.row.status==3 && scope.row.approver==loginName)" @click="handle(scope.row)" size="mini">查看</el-button>
</div>
</template>
... ...
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
</html>
\ No newline at end of file
<div class="clearDetail-container">
<div class="clearDetail-title">消除原因:{{handleInfoObj.reason}}</div>
<div class="clearDetail-handlePer">
<div class="handlePer-left">
<span>处理人:{{handleInfoObj.managenameName}}</span>
</div>
<div>
<span>处理时间:{{handleInfoObj.managetime}}</span>
</div>
<div class="handlePer-left">
<span>审批人:{{handleInfoObj.approverName}}</span>
</div>
</div>
<div class="clearDetail-pcontent" v-html="handleInfoObj.pcontent">
图文信息{{handleInfoObj.pcontent}}
</div>
</div>
\ No newline at end of file
... ...
... ... @@ -4,18 +4,38 @@ export default {
components: {
},
props: [],
props: {
isExamine: {
type: Boolean,
default: false
},
amId:{
type:String,
default: ''
}
},
setup(props, {attrs, slots, emit}) {
const {proxy} = Vue.getCurrentInstance();
let handleInfoObj=Vue.ref('');
let getDetail=()=>{
proxy.$http.get(`/api-web/bAlarmManage/getAlarmManageById`, {amId:props.amId}, function (res) {
if (res && res.code == 0) {
if(res.object){
handleInfoObj.value=res.object;
}
}
})
}
// 挂载完
Vue.onMounted(() => {
getDetail();
})
return {
handleInfoObj,
getDetail,
}
}
... ...
... ... @@ -61,10 +61,19 @@
</div>
</div>
</div>
<div class="info-content">
<div class="info-content-body">
<div class="content-body-info">
<div class="info-item-notice">通知信息:{{alarmInfo.alarmContent}}</div>
<div class="info-item-notice">通知人清单:{{alarmInfo.nickName}}</div>
</div>
</div>
</div>
<!--通知统计信息组件-->
<cm-notice-statistics v-if="alarmIdVal" :alarmId="alarmIdVal" :alarmInfo="alarmInfo" :isExamine="isExamine"></cm-notice-statistics>
<cm-notice-statistics v-if="alarmIdVal" :alarmId="alarmIdVal" :isExamine="isExamine"></cm-notice-statistics>
</div>
<div class="alarmsRadio" v-if="alarmInfo.alarmTypeCustom=='active' || status==0 || status==3">
<div class="alarmsRadio" v-if="alarmInfo.alarmTypeCustom=='active' || alarmInfo.alarmTypeCustom=='his' || status==0 || status==3">
<div class="alarmNotice-title">消除原因</div>
<div class="alarmsNotice">
<div class="alarmsDes"><el-input v-model="reason" placeholder="消除原因" /></div>
... ... @@ -112,10 +121,11 @@
<i class="el-icon-edit-outline update-icon" v-if="!isExamine || status==0 || status==3" @click="showUserDialog(true)" ></i>
</span>
</span>
<span class="title-handle-per" v-if="!isExamine || status==0 || status==3">时间:{{dateTime}}</span>
<span class="title-handle-per" v-if="!isExamine || status==0">时间:{{dateTime}}</span>
<span class="title-handle-per" v-if="status==3">时间:{{handleInfoObj.managetime}}</span>
</div>
<cm-wang-editor v-if="!isExamine || status==0 || status==3" v-model="detail" :repositoryInfo="repositoryInfo" :isDisabled="repositoryInto==1?true:false" :isClear="isClear" @change="change" @changetext="changetext"></cm-wang-editor>
<div class="editor_detail" v-if="isExamine && status!=0 && status!=3" >
<cm-wang-editor v-if="!isExamine || status==0 || (status==3 && handleInfoObj.managename==loginName)" v-model="detail" :repositoryInfo="repositoryInfo" :isDisabled="repositoryInto==1?true:false" :isClear="isClear" @change="change" @changetext="changetext"></cm-wang-editor>
<div class="editor_detail" v-if="isExamine && status!=0 && (status==3 && approverName==loginName)" >
<div v-html="handleInfoObj.pcontent"></div>
</div>
</div>
... ... @@ -134,7 +144,10 @@
</div>
</div>
<div class="alarmsClearTag" v-if="repositoryInto && (!isExamine || status==0 || status==3) ">
<div class="tag-keyword">
<div class="tag-keyword" v-if="approverName==loginName">
关键字:<span class="tag-keyword-span" v-for="tag in dynamicTags">{{tag}}</span>
</div>
<div class="tag-keyword" v-if="handleInfoObj.managename==loginName">
关键字:
<el-tag
v-for="tag in dynamicTags"
... ... @@ -155,7 +168,7 @@
@keyup.enter="handleInputConfirm"
@blur="handleInputConfirm"
/>
<el-button v-else class="button-new-tag ml-1" size="small" @click="showInput">
<el-button v-else class="button-new-tag ml-1" size="small" @click="showInput" >
+ 添加
</el-button>
</div>
... ... @@ -172,7 +185,7 @@
</div>
<div class="alarmsClearEditor-btn">
<el-button type="primary" @click="saveDetail(0)" v-if="!isExamine" size="small">存为草稿</el-button>
<el-button type="primary" @click="saveDetail(1)" v-if="!isExamine || status==0 ||status==3" size="small">确认</el-button>
<el-button type="primary" @click="saveDetail(1)" v-if="!isExamine || status==0 || (status==3 && handleInfoObj.managename==loginName)" size="small">确认</el-button>
{{amStatus}}
<el-button type="primary" @click="saveDetail(2)" v-if="isExamine && status==1 && approverName==loginName" size="small">通过</el-button>
<el-button type="primary" @click="saveDetail(3)" v-if="isExamine && status==1 && approverName==loginName" size="small">不通过</el-button>
... ...
... ... @@ -262,7 +262,6 @@ export default {
let userNames = userObj.user.map(function (v) {
return v.nickname;
});
console.log("userIds",userObj)
approverName.value=userIds[0];
approverLabel.value=userNames[0];
... ... @@ -294,7 +293,19 @@ export default {
getAlarmStatis();
// }
}else {
alarmInfo.value=proxy.$route.query;
let urlObj=proxy.$route.query;
if(urlObj){
for(let key in urlObj){
urlObj[key]=decodeURIComponent(urlObj[key])
}
}
alarmInfo.value=urlObj;
if(alarmInfo.value.alarmTypeCustom=='his'){
let str=alarmInfo.value.alarmContent;
let startIndex=str.indexOf("消除原因");
let endIndex=str.indexOf(",消除内容");
reason.value=str.substring(startIndex+5,endIndex);
}
alarmIdVal.value=alarmInfo.value.primaryKey;
getUser();
}
... ...
... ... @@ -44,7 +44,7 @@
<!--弹框-->
<cm-dialog :title="dialog.title" width="40%" :showDialogVisible="dialog.show" @hidedialog="hideDialog" :showFooter="false">
<template v-slot>
<alarmsClearEditor :isExamine=true :amId="dialog.adId" />
<clearDetail :isExamine=true :amId="dialog.amId" />
</template>
</cm-dialog>
... ...
... ... @@ -5,8 +5,8 @@ export default {
'resNameComponents': Vue.defineAsyncComponent(
() => myImport('components/page/res/resNameComponents/index')
),
'alarmsClearEditor': Vue.defineAsyncComponent(
() => myImport('views/alarmsClearEditor/index')
'clearDetail': Vue.defineAsyncComponent(
() => myImport('views/alarmsClearEditor/clearDetail/index')
)
},
props: [],
... ... @@ -20,7 +20,7 @@ export default {
limit: 10,
});
let dialog = Vue.ref({
title : "处理审批",
title : "审批详情",
show:false,
amId : ''
});
... ... @@ -116,7 +116,7 @@ export default {
// 处理弹框
let handle = (row) =>{
hideDialog(true);
dialog.value.amId = row.amId;
dialog.value.amId = row.amid;
}
//查看详情
... ...
... ... @@ -257,7 +257,6 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common',
code: 'knFlag'
},
done: function (data) {
console.log("knFlag",data)
let knFlag=data.object.value;
if(knFlag == '1'){
//开启闭环
... ... @@ -270,10 +269,13 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common',
return;
}
let params=paramsData[0];
console.log("params",params)
for(let key in params){
if(params[key]){
urlParams+=key+'='+params[key]+'&'
let str=params[key];
if(typeof str=='string'){
str= str.replace(/%/g, '%25');
}
urlParams+=key+'='+encodeURIComponent(str)+'&'
}
}
urlParams=urlParams.substr(0,urlParams.length-1)+'&alarmTypeCustom=active';
... ...
... ... @@ -21,7 +21,26 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common',
var bizId='';//业务Id
var busIdSelect;
var busTypeList = [];
//获取知识库开启状态
var knFlag=0;
var minWidthHandle=100;
function getSysConfCode(){
admin.req({
url: common.domainName + '/api-user/sysConf/getByCode',
type: "get",
data: {
code: 'knFlag'
},
done: function (data) {
knFlag = data.object.value;
if (knFlag == '1') {
//开启闭环
minWidthHandle=150;
}
}
})
}
getSysConfCode();
if (alarmNo) {
$("#historywarningkw").val(alarmNo);
}
... ... @@ -229,7 +248,6 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common',
})
});
}
//渲染表格
var historywarningTable;
//获取配置的列
... ... @@ -242,6 +260,7 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common',
if (retCols) {
cols = retCols;
} else {
cols = [
{type: 'checkbox', fixed: 'left'}
, {
... ... @@ -281,8 +300,13 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common',
, {field: 'alarmTime', title: '首次告警时间', align: 'center', minWidth: 180, sort: true}
, {field: 'durationStr', title: '持续时间', align: 'center', width: 190}
, {
title: '操作', align: 'center', minWidth: 100,
templet: '<div><!--<span history-data-warn-clear="{{d.id}}" class="layui-table-link">消除</span>--> <span history-data-warn-view="{{d.id}}" class="layui-table-link">查看</span> <span history-data-warn-path="{{d.id}}" class="layui-table-link">轨迹</span></div>'
title: '操作', align: 'center', minWidth: minWidthHandle,
templet: `<div>
<span history-data-warn-clear="{{d.id}}" class="layui-table-link">补录</span>
<span history-data-warn-view="{{d.id}}" class="layui-table-link">查看</span>
<span history-data-warn-path="{{d.id}}" class="layui-table-link">轨迹</span>
</div>`
}
];
}
... ... @@ -355,41 +379,48 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common',
});
}
//start lsq 历史告警消除 2022-03-23
$('[history-data-warn-clear]').unbind("click").on('click', function () {
// Start 将对象转成key=value&key1=value1 LSQ 2022/03/22
let urlParams='';
// let paramsData=table.checkStatus('historywarningTable').data;
let paramsData= [];
if(resArr){
resArr.map(item=>{
if(item.id==$(this).attr('history-data-warn-clear')){
paramsData.push(item);
}
})
}
let params=paramsData[0];
console.log("params",params)
for(let key in params){
if(params[key]){
urlParams+=key+'='+params[key]+'&'
if(knFlag=='1'){
$('[history-data-warn-clear]').show();
$('[history-data-warn-clear]').unbind("click").on('click', function () {
// Start 将对象转成key=value&key1=value1 LSQ 2022/03/22
let urlParams='';
// let paramsData=table.checkStatus('historywarningTable').data;
let paramsData= [];
if(resArr){
resArr.map(item=>{
if(item.id==$(this).attr('history-data-warn-clear')){
paramsData.push(item);
}
})
}
}
urlParams=urlParams.substr(0,urlParams.length-1)+'&alarmTypeCustom=his';
layer.open({
title: ['告警消除', 'font-size:18px;'],
type: 2,
area: ['80%', '90%'],
shadeClose: true,//开启遮罩层
id: 'alarms_clear_id',
// content: laytpl(res.body).render(JSON.stringify(params)),
content: ['/vue3/index.html#/alarmsClearEditor?'+urlParams, 'no'],
cancel: function () {
clearTimeout();
let params=paramsData[0];
for(let key in params){
if(params[key]){
let str=params[key];
if(typeof str=='string'){
str= str.replace(/%/g, '%25');
}
urlParams+=key+'='+encodeURIComponent(str)+'&'
}
}
});
})
urlParams=urlParams.substr(0,urlParams.length-1)+'&alarmTypeCustom=his';
layer.open({
title: ['告警消除', 'font-size:18px;'],
type: 2,
area: ['80%', '90%'],
shadeClose: true,//开启遮罩层
id: 'alarms_clear_id',
// content: laytpl(res.body).render(JSON.stringify(params)),
content: ['/vue3/index.html#/alarmsClearEditor?'+urlParams, 'no'],
cancel: function () {
clearTimeout();
}
});
})
}else{
$('[history-data-warn-clear]').hide();
}
//end lsq 2022-03-23
//告警操作日志
$('[history-data-warn-view]').unbind("click").on('click', function () {
... ...