Commit ac978b88 authored by liqiuyu's avatar liqiuyu

feat(*): 我的已办模块开发

parent e364fa66
...@@ -10,17 +10,18 @@ ...@@ -10,17 +10,18 @@
<slot></slot> <slot></slot>
</div> </div>
<template #footer> <template #footer>
<div class="dialog-footer" v-if="btnGroup.length"> <div class="dialog-footer">
<div v-for="item in btnGroup" class="real-btn" :key="item.attrKey" @click="handleBtn(item.attrKey)"> <el-button @click="closeDialog">关闭</el-button>
{{ item.label }} <el-button type="primary" v-if="btnGroup.length" v-for="item in btnGroup" class="real-btn" :key="item.attrKey" @click="handleBtn(item.attrKey)">
</div> {{item.label}}
</el-button>
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
</template> </template>
<script setup> <script setup>
import { defineProps, defineEmits, ref, reactive,watch,onMounted } from 'vue'; import { defineProps, defineEmits } from 'vue';
const props = defineProps({ const props = defineProps({
showDialog: { showDialog: {
...@@ -40,7 +41,7 @@ const props = defineProps({ ...@@ -40,7 +41,7 @@ const props = defineProps({
default: () => ([]) default: () => ([])
} }
}); });
const emit = defineEmits(['close:showDialog', 'handleBtn']); const emit = defineEmits(['close:showDialog', 'handleBtn','onSave']);
/** /**
* @Description: 弹框关闭回调 * @Description: 弹框关闭回调
* @author liqiuyu * @author liqiuyu
...@@ -56,8 +57,16 @@ const closeDialog = () => { ...@@ -56,8 +57,16 @@ const closeDialog = () => {
* @date 2025/5/21 * @date 2025/5/21
*/ */
const handleBtn = (key) => { const handleBtn = (key) => {
emit('handleBtn', key); emit('handleBtn',key);
}; };
/**
* @Description: 确认按钮方法回调
* @author liqiuyu
* @date 2025/5/22
*/
const handleSave = ()=> {
emit('onSave');
}
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
......
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
<el-select v-model="formInline.branchFactoryIds" <el-select v-model="formInline.branchFactoryIds"
placeholder="请选择" placeholder="请选择"
> >
<el-option label="全部" value="" />
<el-option v-for="(item, index) in basicConfiguration.branchFactoryList" <el-option v-for="(item, index) in basicConfiguration.branchFactoryList"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
...@@ -80,25 +79,493 @@ ...@@ -80,25 +79,493 @@
</span> </span>
</template> </template>
<template #operation="{ row }"> <template #operation="{ row }">
<el-button type="primary" link @click="handleDone(row)"> <span class="view-btn" @click="handleDone(row)">
处理 处理
</el-button> </span>
<span class="table-btn">|</span> <span class="table-btn">|</span>
<el-button type="primary" link @click="handleDispatch(row)"> <span class="view-btn" @click="handleDispatch(row)">
分派 分派
</el-button> </span>
<span class="table-btn">|</span> <span class="table-btn">|</span>
<el-button type="primary" link @click="changeBag(row)"> <span class="view-btn" @click="changeBag(row)">
更换布袋 更换布袋
</el-button> </span>
</template> </template>
</common-table> </common-table>
</div> </div>
<common-dialog
:show-dialog="doneDialog.show"
:title="doneDialog.title"
:width="doneDialog.width"
@handleBtn="saveDeal"
@close:showDialog="doneDialog.show = false"
>
<div class="form-box">
<el-form ref="form" :model="formModel">
<el-row :gutter="24">
<el-col :span="24">
<div class="label-title">闭环控制分派</div>
<el-form-item label="已分派人:">
<el-tag
v-for="(ele,eIndex) in personTag"
:key="ele.name"
:type="ele.type">
{{ele.name}}
</el-tag>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="24">
<div class="label-title">闭环控制信息</div>
<div class="alarm-content">
<div class="content-item">
<span class="name">编号:</span>
<span class="value">{{ workSheetDetail.workTicketNo }}</span>
</div>
<div class="content-item">
<span class="name">创建时间:</span>
<span class="value">{{ workSheetDetail.createTime }}</span>
</div>
<div class="content-item">
<span class="name">闭环控制状态:</span>
<span class="value work-status">{{ workSheetDetail.desc }}</span>
</div>
</div>
</el-col>
</el-row>
<el-row :gutter="24" v-if="workSheetDetail?.warnType !== 5">
<el-col :span="24">
<div class="label-title">告警信息</div>
<div class="alarm-content">
<div class="content-item">
<span class="name">所属区域:</span>
<span class="value">{{
workSheetDetail.branchFactory || "--"
}}</span>
</div>
<div class="content-item">
<span class="name">发生位置:</span>
<span class="value">{{ workSheetDetail.deviceName }}</span>
</div>
<div
class="content-item"
v-if="
workSheetDetail?.warnType &&
workSheetDetail?.warnType != 3 &&
workSheetDetail?.warnType != 18 &&
workSheetDetail?.warnType != 9 &&
((workSheetDetail?.warnType != 99 &&
workSheetDetail?.warnType != 4 &&
workSheetDetail?.warnType != 20 &&
workSheetDetail?.warnType != 21) ||
workSheetDetail?.warnType == 4)
"
>
<span
class="name"
v-if="
workSheetDetail?.warnType != 99 &&
workSheetDetail?.warnType != 4 &&
workSheetDetail?.warnType != 20 &&
workSheetDetail?.warnType != 21
"
>告警值:</span>
<span class="name" v-else-if="workSheetDetail?.warnType == 4">离线时长:</span>
<span
class="value alarm-value"
v-if="
workSheetDetail.warnType != 99 &&
workSheetDetail.warnType != 4 &&
workSheetDetail.warnType != 18
"
>{{ workSheetDetail.value }}{{ workSheetDetail.unit }}</span
>
<span
class="value alarm-value"
v-else-if="workSheetDetail?.warnType == 4"
>{{ warnValueFilter(workSheetDetail?.offlineTime) }}</span>
</div>
<div class="content-item" v-if="workSheetDetail.convertValue">
<span class="name">折算值:</span>
<span class="value alarm-value"
>{{ workSheetDetail.convertValue
}}{{ workSheetDetail.unit }}</span
>
</div>
<div class="content-item">
<span class="name">告警时间:</span>
<span class="value">{{ workSheetDetail.eventTime }}</span>
</div>
<div
class="content-item"
v-if="
workSheetDetail?.warnType &&
workSheetDetail?.warnType != 3 &&
workSheetDetail?.warnType != 9 &&
workSheetDetail?.warnType != 20 &&
workSheetDetail?.warnType != 21 &&
workSheetDetail?.warnType != 100 &&
workSheetDetail?.warnType != 150 &&
workSheetDetail?.warnType != 18
"
>
<span class="name">当前监测值:</span>
<span class="value cur-alarm-value">
{{ workSheetDetail.realtimeValue || "--"
}}{{ workSheetDetail.unit }}
</span>
</div>
<div
class="content-item"
v-if="
workSheetDetail?.warnType &&
workSheetDetail?.warnType != 3 &&
workSheetDetail?.warnType != 9
"
>
<span class="name">告警指标:</span>
<span class="value">{{ workSheetDetail.metric }}</span>
</div>
<div
class="content-item"
v-if="
workSheetDetail?.warnType &&
workSheetDetail?.warnType != 3 &&
workSheetDetail?.warnType != 9
"
>
<span class="name">告警级别:</span>
<div
class="value"
:class="getColor(workSheetDetail.level)"
></div>
</div>
<div
class="content-item new-content-item-style"
v-if="workSheetDetail.metric == 'TSP浓度'"
>
<span class="name change-style">TSP粉尘污染溯源结果:</span>
<span class="value">{{
workSheetDetail.sourceTrace || "无"
}}</span>
</div>
<div
class="content-item"
v-if="
workSheetDetail?.warnType && workSheetDetail?.warnType == 18
"
>
<span class="name">故障类型:</span>
<span class="value">
{{ viewData[workSheetDetail.cemsBreakdownTag] }}
</span>
</div>
</div>
</el-col>
</el-row>
<el-row :gutter="24" v-if="workSheetDetail?.relationAnalysis">
<el-col :span="24">
<div class="label-title">数据异常定位分析</div>
<div class="alarm-content">
<div class="content-item">
<span class="name">离线原因:</span>
<span class="value">{{
workSheetDetail.analysisMessage || "--"
}}</span>
</div>
<div class="content-item">
<el-button
type="primary"
style="margin-left: 80px"
class="led-btn"
@click="openPage(workSheetDetail)"
>关联台账</el-button
>
</div>
</div>
</el-col>
</el-row>
<el-row :gutter="24" v-if="workSheetDetail?.warnType === 5">
<el-col :span="24">
<div class="label-title">道路信息</div>
<div class="alarm-content">
<div class="content-item">
<span class="name">发生位置:</span>
<span class="value">
{{
workSheetDetail.analyzeResult &&
workSheetDetail.analyzeResult.roadName
? workSheetDetail.analyzeResult.roadName
: "--"
}}
</span>
</div>
<div class="content-item">
<span class="name">全厂PM10均值:</span>
<span class="value">
{{
workSheetDetail.analyzeResult &&
workSheetDetail.analyzeResult.pm10AvgFactory
? workSheetDetail.analyzeResult.pm10AvgFactory +
" μg/m³"
: "--"
}}
</span>
</div>
<div class="content-item">
<span class="name">统计时间:</span>
<span class="value">
{{
workSheetDetail.analyzeResult
? workSheetDetail.analyzeResult.startTime +
"—" +
workSheetDetail.analyzeResult.endTime
: ""
}}
</span>
</div>
<div class="content-item">
<span class="name">PM10均值:</span>
<span class="value">
{{
workSheetDetail.analyzeResult &&
workSheetDetail.analyzeResult.pm10AvgRoad
? workSheetDetail.analyzeResult.pm10AvgRoad + " μg/m³"
: "--"
}}
</span>
</div>
<div class="content-item">
<span class="name">道路清洁度指数:</span>
<template v-if="workSheetDetail.analyzeResult">
<div
v-for="(item, i) in Number(
workSheetDetail.analyzeResult.riskLevel
)
? Number(workSheetDetail.analyzeResult.riskLevel)
: 0"
:key="i"
>
<span
v-if="Number(workSheetDetail.analyzeResult.riskLevel)"
>
<img src="@/assets/star.png" alt="⭐️" />
</span>
</div>
</template>
<div
v-if="
workSheetDetail.analyzeResult &&
workSheetDetail.analyzeResult.riskLevel == '-'
"
>
<span class="value">
{{ workSheetDetail.analyzeResult.riskLevel }}
</span>
</div>
</div>
<div class="content-item">
<span class="name">VDM均值:</span>
<span class="value">
{{
workSheetDetail.analyzeResult &&
workSheetDetail.analyzeResult.vdmAvgRoad
? workSheetDetail.analyzeResult.vdmAvgRoad + " μg/m³"
: ""
}}
</span>
</div>
</div>
</el-col>
</el-row>
<el-row :gutter="24" v-if="workSheetDetail?.alarmImags">
<el-col>
<div class="label-title">告警图片</div>
<div class="demo-image__preview">
<div
class="image-preview"
v-for="(item, index) in alarmImags"
:key="index"
>
<el-image
style="width: 100px; height: 100px"
:lazy="true"
:src="item"
:preview-src-list="alarmImags"
></el-image>
</div>
</div>
</el-col>
</el-row>
<el-row
:gutter="24"
v-if="
workSheetDetail?.forwards &&
workSheetDetail?.forwards[0] &&
workSheetDetail?.triggerType === 2
"
>
<el-col :span="24">
<div class="label-title">问题描述</div>
<div class="input-style-text">
{{ workSheetDetail.forwards[0].forward }}
</div>
<div class="demo-image__preview">
<div
class="image-preview"
v-for="(item, index) in imgUrlList"
:key="index"
>
<el-image
style="width: 100px; height: 100px"
:lazy="true"
:src="item"
:preview-src-list="imgUrlList"
></el-image>
</div>
</div>
<div
class="input-style-text"
v-if=" !workSheetDetail?.forwards[0]?.forward && imgUrlList.length == 0"
>
暂无描述
</div>
</el-col>
</el-row>
<el-row :gutter="24" v-if="srcList.length">
<el-col :span="24">
<div class="label-title">告警图片</div>
<div class="demo-image__preview">
<div
class="image-preview"
v-for="(item, index) in srcList"
:key="index"
>
<el-image
style="width: 100px; height: 100px"
:lazy="true"
:src="item"
:preview-src-list="srcList"
></el-image>
</div>
</div>
</el-col>
</el-row>
<el-row
:gutter="24"
v-if="workSheetDetail?.warnType && workSheetDetail?.warnType == 444"
>
<el-col :span="24" class="deal-line-wrap">
<div class="label-title">问题描述</div>
<div
class="qusetion-records"
v-if="
workSheetDetail?.questionDescList &&
workSheetDetail?.questionDescList.length > 0
"
>
<div
class="qusetion-records-item"
v-for="(item, index) in workSheetDetail?.questionDescList"
:key="index"
>
{{ item }}
</div>
</div>
<div v-else class="input-style-text">暂无数据</div>
</el-col>
</el-row>
<el-row
:gutter="24"
v-if="functionAuthority && functionAuthority?.close_loop_upgrade"
>
<el-col :span="24" class="deal-line-wrap">
<div class="label-title">落实管理制度</div>
<div
class="processing-records"
:class="[
workSheetDetail?.levelManageList.length == 1
? 'one-record'
: '',
]"
v-if="
workSheetDetail?.levelManageList &&
workSheetDetail?.levelManageList.length > 0
"
>
<div
class="processing-records-item"
v-for="(item, index) in workSheetDetail?.levelManageList"
:key="index"
>
<div class="steps-line">
<div class="header" v-show="index !== 0"></div>
<div
class="footer"
v-show="
index !== workSheetDetail?.levelManageList.length - 1
"
></div>
</div>
<span class="handler">{{ item.userName }}</span>
<span class="circle"></span>
<span class="step-name">
{{
item.state == 0
? "处理中"
: item.state == 1
? "已处理"
: ""
}}
</span>
<span class="partment">{{ item.officeName || "无" }}</span>
<span class="handler-time">{{ item.date }}</span>
</div>
</div>
<div v-else class="input-style-text">暂无数据</div>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="24">
<div class="label-title">原因分析</div>
<el-input
class="input-style"
v-model="form.reason"
type="textarea"
:rows="3"
placeholder="请输入内容"
/>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="24">
<div class="label-title">处理措施</div>
<div>
<el-input
class="input-style"
v-model="form.measure"
type="textarea"
:rows="3"
placeholder="请输入内容"
/>
</div>
</el-col>
</el-row>
</el-form>
</div>
</common-dialog>
<common-dialog <common-dialog
:showDialog="assignDialog.show" :showDialog="assignDialog.show"
:title="assignDialog.title" :title="assignDialog.title"
:btnGroup="assignDialog.btnGroup" @handleBtn="saveAssign"
@handleBtn="closeAssignDialog"
@close:showDialog="assignDialog.show = false" @close:showDialog="assignDialog.show = false"
> >
<el-form :inline="true"> <el-form :inline="true">
...@@ -127,32 +594,6 @@ ...@@ -127,32 +594,6 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
</common-dialog> </common-dialog>
<common-dialog
:show-dialog="rejectDialog.show"
:title="rejectDialog.title"
:btnGroup="rejectDialog.btnGroup"
@handleBtn="closeRejectDialog"
@close:visible="rejectDialog.show = false"
>
<el-form>
<el-form-item label="驳回原因">
<el-select v-model="rejectType">
<el-option v-for="(item, i) in reasonList"
:key="i"
:label="item.description"
:value="item.rejectType"
>
</el-option>
</el-select>
</el-form-item>
<el-row>
<el-col :span="21">
<el-input type="textarea" v-model="rejectReason" :autosize="{ minRows: 2, maxRows: 12 }" placeholder="请输入内容">
</el-input>
</el-col>
</el-row>
</el-form>
</common-dialog>
</div> </div>
</template> </template>
...@@ -160,8 +601,14 @@ ...@@ -160,8 +601,14 @@
import { ref, reactive, onMounted, onBeforeUnmount,computed } from 'vue' import { ref, reactive, onMounted, onBeforeUnmount,computed } from 'vue'
import CommonTable from "@/components/commonTable/index.vue"; import CommonTable from "@/components/commonTable/index.vue";
import commonDialog from "./components/dialog.vue"; import commonDialog from "./components/dialog.vue";
import { getDataFun } from '@/request/method.js'; import { getDataFun, postDataJson, postDataJSON } from '@/request/method.js';
import moment from 'moment'; import moment from 'moment';
import { getToken } from '@/utils/auth.js';
import { ElMessage } from 'element-plus'
import { storeToRefs } from 'pinia'
import { useUsersStore } from "@/pinia/user.js";
const { functionAuthority } = storeToRefs(useUsersStore());
const formInline = ref({ const formInline = ref({
eventNameId: '', eventNameId: '',
keyword: '', keyword: '',
...@@ -175,39 +622,16 @@ const formInline = ref({ ...@@ -175,39 +622,16 @@ const formInline = ref({
}); });
const workTicketNo = ref(''); const workTicketNo = ref('');
const rejectType = ref('');
const reasonList = ref([]);
const rejectReason = ref('');
const rejectDialog = ref({
title: '驳回申请',
show: false,
btnGroup: [
{
attrKey: 'save',
label: '保存'
},
{
attrKey: 'cancel',
label: '关闭'
}
]
});
const handlerPeopleId = ref(''); const handlerPeopleId = ref('');
const handlerPeople = ref([]); const handlerPeople = ref([]);
const assignDialog = ref({ const assignDialog = ref({
title: '闭环控制分派', title: '闭环控制分派',
show: false, show: false,
width: '50%',
btnGroup: [ btnGroup: [
{ {
attrKey: 'save', attrKey: 'save',
label: '保存' label: '保存'
},
{
attrKey: 'cancel',
label: '关闭'
} }
] ]
}); });
...@@ -224,19 +648,58 @@ const addPerson = ()=>{ ...@@ -224,19 +648,58 @@ const addPerson = ()=>{
} }
const delPerson = (index)=>{ const delPerson = (index)=>{
personTag.value.splice(index,1);
} }
const isShow = ref(true);
const getIndex = (index) => { const getIndex = (index) => {
return (currentPage.value - 1) * pageSize.value + index + 1; return (currentPage.value - 1) * pageSize.value + index + 1;
}; };
const saveAssign = ()=> {
if (personTag.value.length === 0) {
ElMessage({
showClose: true,
type: 'warning',
message: '请选择分派人'
})
}
const tempArr = [];
personTag.value.forEach(item => {
tempArr.push({
userId: item.userId,
userName: item.userName
})
});
const params = {
workTicketNo,
receiveUser: '',
receiveUserName: '',
handleUsers: tempArr
}
const url = '/transaction/doc/transferTransaction';
dispatchHandle(url, params);
}
const dispatchHandle = async (url,param) => {
try {
let result = await postDataJSON(url,param);
if (result && result.code === 1) {
assignDialog.value.show = false;
ElMessage({
message: '处理成功',
type: 'success'
});
searchData();
}
} catch (e) {
console.log(e);
}
}
const basicConfiguration = reactive({ const basicConfiguration = reactive({
ticketEventName: [], ticketEventName: [{ name: '全部', id: '' }],
eventTypeList: [], eventTypeList: [],
branchFactoryList: [], branchFactoryList: [{ branchFactory: '全部', branchFactoryId: '' }],
deviceList: [] deviceList: []
}); });
...@@ -254,27 +717,120 @@ const getColor = computed(()=>{ ...@@ -254,27 +717,120 @@ const getColor = computed(()=>{
} }
}); });
const onSearch = ()=> { const warnValueFilter = computed(()=> {
return (offlineTime)=> {
if (offlineTime == null || offlineTime <= 0) {
return "--";
}
if (offlineTime < 60) {
return offlineTime + "分钟";
}
if (offlineTime < 1440) {
if (offlineTime % 60 == 0) {
return offlineTime / 60 + "小时";
} else {
return (
parseInt(offlineTime / 60) + "小时" + (offlineTime % 60) + "分钟"
);
}
} else {
let s;
let d = parseInt(offlineTime / 60 / 24);
let h = parseInt((offlineTime / 60) % 24);
let m = offlineTime % 60;
s = d + "天";
if (h >= 1) {
s += h + "小时";
}
if (m > 0) {
s += m + "分钟";
}
return s;
}
}
});
const onSearch = ()=> {
searchData();
} }
const onReset =()=> { const onReset =()=> {
currentPage.value = 1;
pageSize.value = 20;
formInline.value.eventNameId = '';
formInline.value.keyword = '';
formInline.value.branchFactoryIds = '';
formInline.value.deviceType = '';
formInline.value.createTime = [
moment(new Date().getTime() - 1000 * 60 * 60 * 24).format('YYYY-MM-DD HH:mm:ss'),
moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
]
searchData();
} }
const handleDone = (data)=> { const doneDialog = ref({
title: '闭环控制分派',
show: false,
width: '50%',
btnGroup: [
{
attrKey: 'save',
label: '处理'
}
]
});
const viewData = {
D: "在线监控(监测)仪器仪表故障",
B: "在线监控(监测)仪器仪表与数采通讯异常",
VGD: "在线监控(监测)仪器仪表与数采通讯异常",
} }
const handleView = (data)=>{ const handleDone = async (data)=> {
doneDialog.value.title = data.eventName;
doneDialog.value.show = true;
/*let res = await getDetail(data.workTicketNo);
personTag.value = [];
if (res.handleUsers && res.handleUsers.length > 0) {
res.handleUsers.forEach(item => {
personTag.value.push({
type: 'info',
name: item.userName,
userId: item.userId,
userName: item.userName
});
});
}
disposeWorkSheetDetail(res);*/
} }
// 拒绝
const handleReject = (data)=> { const saveDeal = () => {
workTicketNo.value = data.workTicketNo; const { workTicketNo, handleValue, imgUrl } = workSheetDetail.value;
rejectDialog.value.show = true; const { resson,measure } = this.form;
const param = { workTicketNo, handleValue, reason, measure, imgUrl };
const url = '/transaction/doc/finishTransaction';
disposeHandle(url, param);
} }
const disposeHandle = async (url, param) => {
try {
let result = await postDataJson(url, param);
if (result && result.code === 1) {
doneDialog.value.show = false;
searchData();
ElMessage({
message: '处理成功',
type: 'success'
});
}
} catch (e) {
ElMessage({
message: '处理失败',
type: 'error'
});
}
};
// 分派 // 分派
const handleDispatch = async (data)=> { const handleDispatch = async (data)=> {
assignDialog.value.show = true; assignDialog.value.show = true;
...@@ -292,14 +848,6 @@ const handleDispatch = async (data)=> { ...@@ -292,14 +848,6 @@ const handleDispatch = async (data)=> {
}*/ }*/
} }
const closeAssignDialog = () => {
assignDialog.value.show = false;
}
const closeRejectDialog = ()=>{
rejectDialog.value.show = false;
}
const getDetail = (workTicketNo) => { const getDetail = (workTicketNo) => {
return new Promise((resolve,reject) => { return new Promise((resolve,reject) => {
const url = '/transaction/doc/detail'; const url = '/transaction/doc/detail';
...@@ -319,7 +867,7 @@ const changeBag = (data)=>{ ...@@ -319,7 +867,7 @@ const changeBag = (data)=>{
} }
const tableData = [ const tableData = ref([
{ {
id: 1, id: 1,
name: '张三', name: '张三',
...@@ -354,7 +902,7 @@ const tableData = [ ...@@ -354,7 +902,7 @@ const tableData = [
eventTime: '20', eventTime: '20',
level: 3 level: 3
} }
]; ]);
const tableColumns = ref([ const tableColumns = ref([
{ {
...@@ -401,6 +949,182 @@ const tableColumns = ref([ ...@@ -401,6 +949,182 @@ const tableColumns = ref([
}, },
]); ]);
const permissionBranchFactory = JSON.parse(sessionStorage.getItem('branchFactoryList'))|| [];
const customerId = getToken('customerId');
const getBranchTypeList = ()=> {
const url = '/transaction/getBranchFactory';
const params = {
customerId
}
getDataFun(url,params).then(res => {
if (res && res.code === 1) {
const branchFactory = res.data;
if (permissionBranchFactory.length === 0) {
basicConfiguration.branchFactoryList = [];
} else if (permissionBranchFactory.length === 1 && permissionBranchFactory[0] == 0) {
basicConfiguration.branchFactoryList = basicConfiguration.branchFactoryList.concat(branchFactory);
} else {
basicConfiguration.branchFactoryList = branchFactory.filter((item) =>
permissionBranchFactory.includes(item.branchFactoryId)
);
basicConfiguration.branchFactoryList.unshift({ branchFactory: '全部', branchFactoryId: '' });
}
}
});
}
const getWarnAndTicketConfigMap = ()=> {
const url = '/system/getWarnAndTicketConfigMap';
const params = {
customerId
}
getDataFun(url,params).then(res => {
if (res && res.code === 1) {
const { ticketEventName, eventType } = res.data;
basicConfiguration.ticketEventName = basicConfiguration.ticketEventName.concat(ticketEventName);
}
});
};
let realBtn = '';
const searchData =()=> {
currentPage.value = 1;
pageSize.value = 20;
if (!formInline.value.branchFactoryIds) {
if (permissionBranchFactory.length === 0) {
realBtn = -1;
} else if (permissionBranchFactory.length === 1 && permissionBranchFactory[0] == 0) {
realBtn = '';
} else {
realBtn = permissionBranchFactory.join(',');
}
} else {
realBtn = formInline.value.branchFactoryIds;
}
getTableData();
}
const getTableData = ()=> {
let keyWord = formInline.value.keyword?.replace(/#/g, '%23');
const params = {
eventNameId: formInline.value.eventNameId,
warnType: formInline.value.warnType,
createStartTime: formInline.value.createTime[0],
createEndTime: formInline.value.createTime[1],
branchFactoryIds: realBtn,
keyword: keyWord,
pageNum: currentPage.value,
pageSize: pageSize.value,
handleState: 1,
belongTo: 1,
deviceType: formInline.value.deviceType
}
tableData.value = [];
const url = '/transaction/doc/getListParamPage';
getDataFun(url,params).then(res => {
if (res && res.code === 1) {
const { list } = res.data;
disposeType(list);
tableData.value = list;
}
});
}
const disposeType = (list)=> {
if (list.length) {
list.forEach(l => {
if (!l.deviceNo) {
l.deviceNo = '--';
}
switch (l.warnType) {
case 0:
l.warnType = '人工提交'
break
case 1:
l.warnType = '超标'
break
case 2:
l.warnType = '超低'
break
case 3:
l.warnType = '生产治理同步率'
break
case 4:
l.warnType = '离线'
break
case 5:
l.warnType = '其他'
break
case 10:
l.warnType = '持续超标'
break
case 11:
l.warnType = '三倍超标'
break
case 99:
l.warnType = '恒值'
break
}
})
}
}
const srcList = ref([]);
const form = ref({
reason: "",
measure: "",
});
const imgUrlList = ref([]);
const alarmImags = ref([]);
const disposeWorkSheetDetail = (obj)=> {
const {
reason,
measure,
imagParams,
imgUrl,
alarmImags,
forwards,
createId,
} = obj;
if (forwards.length > 0) {
let receiveUserItem = forwards.slice(-1)[0];
}
srcList.value = [];
imgUrlList.value = [];
if (imagParams) {
let arr = [];
for (let item of imagParams) {
srcList.value = arr.concat(item.url.split(";"));
}
}
if (alarmImags && alarmImags.length) {
for (let item of alarmImags) {
alarmImags.push(item.imageUrl);
}
}
if (imgUrl) {
imgUrlList.value = imgUrl.split(";");
}
}
onMounted(()=>{
// getBranchTypeList();
// getWarnAndTicketConfigMap();
// searchData();
});
const formModel = ref({
selectReason: [],
});
const currentPage = ref(1); const currentPage = ref(1);
const pageSize = ref(20); const pageSize = ref(20);
...@@ -473,7 +1197,83 @@ const handlePaginationChange = (pagination) => { ...@@ -473,7 +1197,83 @@ const handlePaginationChange = (pagination) => {
transform: translate(-50%); transform: translate(-50%);
} }
} }
.view-btn {
margin-right: 8px;
cursor: pointer;
}
.form-box {
height: 60vh;
overflow-y: auto;
.label-title {
position: relative;
padding-left: 14px;
margin-bottom: 20px;
font-weight: 700;
font-size: 19px;
overflow: hidden;
&::before {
content: "";
width: 4px;
height: 4px;
border-radius: 50%;
background: #1890ff;
position: absolute;
left: 0px;
top: 50%;
transform: translateY(-50%);
}
&::after {
content: "";
width: 100%;
height: 0px;
position: absolute;
border-bottom: dashed 1px rgb(209, 209, 209);
left: 130px;
top: 50%;
transform: translateY(-50%);
}
}
.alarm-content {
display: flex;
align-items: center;
flex-wrap: wrap;
padding: 0px 35px;
.content-item {
width: 50%;
font-size: 14px;
font-weight: 500;
color: #3b3b3b;
line-height: 19px;
min-height: 34px;
display: flex;
.name {
text-align: right;
width: 140px;
margin-right: 10px;
}
.change-style {
width: auto;
}
.value {
color: #000000;
flex: 1;
}
.alarm-value {
color: #ff7373;
}
.cur-alarm-value {
color: #086635;
}
.work-status {
color: #e1971d;
}
}
.new-content-item-style {
width: 100%;
height: auto;
}
}
}
.default-btn { .default-btn {
width: 85px; width: 85px;
......
<script setup> <template>
<div class="my-agency">
<el-form :inline="true" :model="formInline" class="demo-form-inline">
<el-form-item label="事件名称:">
<el-select v-model="formInline.eventNameId"
placeholder="请选择"
>
<el-option
v-for="(item, index) in basicConfiguration.ticketEventName"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="发生位置:">
<el-input v-model="formInline.keyword" placeholder="请输入"></el-input>
</el-form-item>
<el-form-item label="所属区域:">
<el-select v-model="formInline.branchFactoryIds"
placeholder="请选择"
>
<el-option label="全部" value="" />
<el-option v-for="(item, index) in basicConfiguration.branchFactoryList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="设备类型">
<el-select v-model="formInline.deviceType">
<el-option label="全部" value="" />
<el-option
v-for="(item, index) in basicConfiguration.deviceList"
index="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="发生时间">
<el-date-picker type="daterange"
v-model="formInline.createTime"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
format="YYYY-MM-DD HH:mm:ss"
date-format="YYYY/MM/DD ddd"
time-format="A hh:mm:ss"
/>
</el-form-item>
<el-form-item>
<el-button class="default-btn" @click="onSearch">搜索</el-button>
<el-button type="primary" class="default-btn" @click="onReset">重置</el-button>
</el-form-item>
</el-form>
<div class="table-box">
<common-table
:data="tableData"
:columns="tableColumns"
:default-page-size="20"
@pagination-change="handlePaginationChange"
:pagination-texts="{
total: '共',
sizeChange: '条/页',
prev: '前一页',
next: '后一页',
jumper: '跳至',
}"
>
<template #index="{ $index }">
{{ getIndex($index) }}
</template>
<template #level="{ row }">
<span class="level" :class="getColor(row.level)">
{{ row.level }}
</span>
</template>
<template #operation="{ row }">
<span class="view-btn" @click="handleView(row)">
查看
</span>
<span class="table-btn">|</span>
<span class="view-btn" @click="handleReject(row)">
驳回
</span>
<span class="table-btn">|</span>
<span class="view-btn" @click="changeBag(row)">
更换布袋
</span>
</template>
</common-table>
</div>
<common-dialog
:show-dialog="viewDialog.show"
:title="viewDialog.title"
:width="viewDialog.width"
@close:showDialog="viewDialog.show = false"
>
<div class="form-box">
<el-form ref="form" :model="formModel">
<el-row :gutter="24">
<el-col :span="24">
<div class="label-title">闭环控制信息</div>
<div class="alarm-content">
<div class="content-item">
<span class="name">编号:</span>
<span class="value">{{ workSheetDetail.workTicketNo }}</span>
</div>
<div class="content-item">
<span class="name">创建时间:</span>
<span class="value">{{ workSheetDetail.createTime }}</span>
</div>
<div class="content-item">
<span class="name">闭环控制状态:</span>
<span class="value work-status">{{
workSheetDetail.desc
}}</span>
</div>
</div>
</el-col>
</el-row>
</script> <el-row :gutter="24" v-if="workSheetDetail.warnType !== 5">
<el-col :span="24">
<div class="label-title">告警信息</div>
<div class="alarm-content">
<div class="content-item">
<span class="name">所属区域:</span>
<span class="value">{{
workSheetDetail.branchFactory || "--"
}}</span>
</div>
<div class="content-item">
<span class="name">发生位置:</span>
<span class="value">{{ workSheetDetail.deviceName }}</span>
</div>
<div
class="content-item"
v-if="
workSheetDetail.warnType &&
workSheetDetail.warnType != 3 &&
workSheetDetail.warnType != 18
"
>
<span
class="name"
v-if="
workSheetDetail.warnType != 99 &&
workSheetDetail.warnType != 4 &&
workSheetDetail.warnType != 20 &&
workSheetDetail.warnType != 21
"
>告警值:</span>
<span class="name" v-else-if="workSheetDetail.warnType == 4">离线时长:</span>
<span
class="value alarm-value"
v-if="
workSheetDetail.warnType != 99 &&
workSheetDetail.warnType != 4
"
>{{ workSheetDetail.value }}{{ workSheetDetail.unit }}</span>
<span
class="value alarm-value"
v-else-if="workSheetDetail.warnType == 4"
>{{ warnValueFilter(workSheetDetail?.offlineTime) }}</span>
<span class="value alarm-value" v-else>
{{ workSheetDetail.totalConstantTime }}
</span>
</div>
<div class="content-item" v-if="workSheetDetail.convertValue">
<span class="name">折算值:</span>
<span class="value alarm-value"
>{{ workSheetDetail.convertValue
}}{{ workSheetDetail.unit }}</span
>
</div>
<div class="content-item">
<span class="name">告警时间:</span>
<span class="value">{{ workSheetDetail.eventTime }}</span>
</div>
<div
class="content-item"
v-if="
workSheetDetail.warnType &&
workSheetDetail.warnType != 3 &&
workSheetDetail.warnType != 9
"
>
<span class="name">告警指标:</span>
<span class="value">{{ workSheetDetail.metric }}</span>
</div>
<div
class="content-item"
v-if="
workSheetDetail.warnType &&
workSheetDetail.warnType != 3 &&
workSheetDetail.warnType != 9
"
>
<span class="name">告警级别:</span>
<span
class="value"
:class="[
workSheetDetail.level == 2
? 'red'
: workSheetDetail.level == 1
? 'yellow'
: '',
]"
></span>
</div>
<div
class="content-item"
v-if="
workSheetDetail.warnType && workSheetDetail.warnType == 18
"
>
<span class="name">故障类型:</span>
<span class="value">
{{ viewData[workSheetDetail.cemsBreakdownTag] }}
</span>
</div>
<div
class="content-item"
v-if="workSheetDetail.warnType && workSheetDetail.warnType == 3"
>
<span class="name">运行状态:</span>
<span class="value">{{ workSheetDetail.runState }}</span>
</div>
<div
class="content-item new-content-item-style"
v-if="workSheetDetail.metric == 'TSP浓度'"
>
<span class="name change-style">TSP粉尘污染溯源结果:</span>
<span class="value">{{ workSheetDetail.sourceTrace || "无"}}</span>
</div>
</div>
</el-col>
</el-row>
<template> <el-row :gutter="24" v-if="workSheetDetail?.warnType === 5">
<el-col :span="24">
<div class="label-title">道路信息</div>
<div class="alarm-content">
<div class="content-item">
<span class="name">发生位置:</span>
<span class="value">
{{
workSheetDetail.analyzeResult &&
workSheetDetail.analyzeResult.roadName
? workSheetDetail.analyzeResult.roadName
: "--"
}}
</span>
</div>
<div class="content-item">
<span class="name">全厂PM10均值:</span>
<span class="value">
{{
workSheetDetail.analyzeResult &&
workSheetDetail.analyzeResult.pm10AvgFactory
? workSheetDetail.analyzeResult.pm10AvgFactory +
" μg/m³"
: "--"
}}
</span>
</div>
<div class="content-item">
<span class="name">统计时间:</span>
<span class="value">
{{
workSheetDetail.analyzeResult
? workSheetDetail.analyzeResult.startTime +
"—" +
workSheetDetail.analyzeResult.endTime
: ""
}}
</span>
</div>
<div class="content-item">
<span class="name">PM10均值:</span>
<span class="value">
{{
workSheetDetail.analyzeResult &&
workSheetDetail.analyzeResult.pm10AvgRoad
? workSheetDetail.analyzeResult.pm10AvgRoad + " μg/m³"
: "--"
}}
</span>
</div>
<div class="content-item">
<span class="name">道路清洁度指数:</span>
<template v-if="workSheetDetail.analyzeResult">
<div
v-for="(item, i) in Number(
workSheetDetail.analyzeResult.riskLevel
)
? Number(workSheetDetail.analyzeResult.riskLevel)
: 0"
:key="i"
>
<span
v-if="Number(workSheetDetail.analyzeResult.riskLevel)"
>
<img src="@/assets/star.png" alt="⭐️" />
</span>
</div>
</template>
<div
v-if="
workSheetDetail.analyzeResult &&
workSheetDetail.analyzeResult.riskLevel == '-'
"
>
<span class="value">
{{ workSheetDetail.analyzeResult.riskLevel }}
</span>
</div>
<!-- <span class="value">{{workSheetDetail.deviceName}}</span> -->
</div>
<div class="content-item">
<span class="name">VDM均值:</span>
<span class="value">
{{
workSheetDetail.analyzeResult &&
workSheetDetail.analyzeResult.vdmAvgRoad
? workSheetDetail.analyzeResult.vdmAvgRoad + " μg/m³"
: "--"
}}
</span>
</div>
</div>
</el-col>
</el-row>
<el-row
:gutter="24"
v-if="
workSheetDetail.forwards &&
workSheetDetail.forwards[0] &&
workSheetDetail.triggerType === 2
"
>
<el-col :span="24">
<div class="label-title">问题描述</div>
<div class="input-style-text">
{{ workSheetDetail.forwards[0].forward }}
</div>
<div
class="input-style-text"
v-if="
!workSheetDetail.forwards[0].forward && imgUrlList.length == 0
"
>
暂无描述
</div>
</el-col>
</el-row>
<el-row :gutter="24" v-if="workSheetDetail?.alarmImags">
<el-col>
<div class="label-title">告警图片</div>
<div class="demo-image__preview">
<div
class="image-preview"
v-for="(item, index) in alarmImags"
:key="index"
>
<el-image
style="width: 100px; height: 100px"
:lazy="true"
:src="item"
:preview-src-list="alarmImags"
></el-image>
</div>
</div>
</el-col>
</el-row>
<el-row
:gutter="24"
v-if="
workSheetDetail.typeName == 'CEMS' &&
(workSheetDetail.leftAvgValue > 0 ||
workSheetDetail.leftAvgValue == 0)
"
>
<el-col :span="24">
<div class="label-title">排放提示</div>
<div class="tips-content">
<div class="content-item">
<span class="name">
后半小时内平均排放放浓度不得超
<span class="value">
{{
workSheetDetail.leftAvgValue
? workSheetDetail.leftAvgValue.toFixed(2)
: ""
}}
</span>
{{ workSheetDetail.unit }}
</span>
<!-- <span class="value">{{workSheetDetail.deviceName}}</span> -->
</div>
</div>
</el-col>
</el-row>
<el-row :gutter="24" v-if="srcList.length">
<el-col :span="24">
<div class="label-title">告警图片</div>
<div class="demo-image__preview">
<div
class="image-preview"
v-for="(item, index) in srcList"
:key="index"
>
<el-image
style="width: 100px; height: 100px"
:lazy="true"
:src="item"
:preview-src-list="srcList"
></el-image>
</div>
</div>
</el-col>
</el-row>
<el-row
:gutter="24"
v-if="functionAuthority && functionAuthority.close_loop_upgrade"
>
<el-col :span="24" class="deal-line-wrap">
<div class="label-title">落实管理制度</div>
<div
class="processing-records"
:class="[
workSheetDetail.levelManageList.length == 1
? 'one-record'
: '',
]"
v-if="
workSheetDetail.levelManageList &&
workSheetDetail.levelManageList.length > 0
"
>
<div
class="processing-records-item"
v-for="(item, index) in workSheetDetail.levelManageList"
:key="index"
>
<div class="steps-line">
<div class="header" v-show="index !== 0"></div>
<div
class="footer"
v-show="
index !== workSheetDetail.levelManageList.length - 1
"
></div>
</div>
<span class="handler">{{ item.userName }}</span>
<span class="circle"></span>
<span class="step-name">
{{
item.state == 0
? "处理中"
: item.state == 1
? "已处理"
: ""
}}
</span>
<span class="partment">{{ item.officeName || "无" }}</span>
<span class="handler-time">{{ item.date }}</span>
</div>
</div>
<div v-else class="input-style-text">暂无数据</div>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="24">
<div class="label-title">原因分析</div>
<div class="input-style">
{{ workSheetDetail.reason || "暂无信息" }}
</div>
</el-col>
</el-row>
<el-row :gutter="24" v-if="imgUrlList.length">
<el-col :span="24">
<div class="label-title">现场图片</div>
<div class="demo-image__preview">
<div
class="image-preview"
v-for="(item, index) in imgUrlList"
:key="index"
>
<el-image
style="width: 100px; height: 100px"
:lazy="true"
:src="item"
:preview-src-list="imgUrlList"
></el-image>
</div>
</div>
<div
class="input-style-text"
v-if="
!workSheetDetail.forwards[0].forward && imgUrlList.length == 0
"
>
暂无描述
</div>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="24">
<div class="label-title">处理措施</div>
<div class="input-style">
{{ workSheetDetail.measure || "暂无信息" }}
</div>
</el-col>
</el-row>
<el-row
:gutter="24"
v-if="workSheetDetail.warnType && workSheetDetail.warnType === 5"
>
<el-col :span="24">
<div class="label-title">改善情况</div>
<div
class="improve-situation"
v-if="workSheetDetail.analyzeResult"
>
<div class="improve-situation-item">
<span>改善前</span>
<div class="road-cleanliness-index">
<div class="star" v-if="workSheetDetail.analyzeResult">
<div v-for="(item, i) in starList" :key="i">
<span
v-if="
Number(
workSheetDetail.analyzeResult
? workSheetDetail.analyzeResult.riskLevel
: 0
)
"
>
<img src="@/assets/star.png" alt="⭐️" />
</span>
</div>
</div>
<span class="name">道路清洁度指数</span>
</div>
</div>
<div class="improve-situation-item">
<span>改善后</span>
<div class="road-cleanliness-index">
<div class="star" v-if="workSheetDetail.analyzeResult">
<div v-for="(item, i) in 3" :key="i">
<span
v-if="
Number(
workSheetDetail.analyzeResult
? workSheetDetail.analyzeResult.riskLevel
: 0
)
"
>
<img src="@/assets/star.png" alt="⭐️" />
</span>
</div>
</div>
<span class="name">道路清洁度指数</span>
</div>
</div>
</div>
<div v-else class="input-style-text">暂无数据</div>
</el-col>
</el-row>
<el-row
:gutter="24"
v-if="
workSheetDetail.warnType &&
workSheetDetail.warnType !== 3 &&
workSheetDetail.warnType != 9 &&
workSheetDetail.warnType !== 4 &&
workSheetDetail.warnType !== 5 &&
workSheetDetail.warnType !== 99 &&
workSheetDetail.warnType != 20 &&
workSheetDetail.warnType != 21 &&
workSheetDetail.warnType != 18
"
>
<el-col :span="24">
<div class="label-title">改善情况</div>
<div class="improve-situation">
<div class="improve-situation-item">
<span>告警值</span>
<span class="value">
{{ workSheetDetail.value }}
<span>{{ workSheetDetail.unit }}</span>
</span>
</div>
<div class="improve-situation-item">
<span>监测值</span>
<span class="value">
{{ workSheetDetail.handleValue }}
<span>{{
workSheetDetail.warnTypeName == "高频高幅"
? "μg/m³"
: workSheetDetail.unit
}}</span>
</span>
</div>
</div>
</el-col>
</el-row>
<el-row
:gutter="24"
v-if="workSheetDetail.forwards && workSheetDetail.forwards.length"
>
<el-col :span="24" class="deal-line-wrap">
<div class="label-title">处理记录</div>
<div
class="processing-records"
:class="[
workSheetDetail.forwards.length == 1 ? 'one-record' : '',
]"
>
<div
class="processing-records-item"
v-for="(item, index) in workSheetDetail.forwards"
:key="index"
>
<div class="steps-line">
<div class="header" v-show="index !== 0"></div>
<div
class="footer"
v-show="index !== workSheetDetail.forwards.length - 1"
></div>
</div>
<span class="handler">{{
index === 0 && item.state === 1
? item.sendUserName
: item.receiveUserName
}}</span>
<span class="circle"></span>
<span class="step-name">
{{
item.state == 0
? "未送达"
: item.state == 1
? "已创建"
: item.state == 2
? "已处理"
: item.state == 3
? "已分配"
: item.state == 4
? "处理中"
: ""
}}
</span>
<span class="handler-time">
{{ item.createTime ? item.createTime : "--" }}
</span>
</div>
</div>
</el-col>
</el-row>
</el-form>
</div>
</common-dialog>
<common-dialog
:show-dialog="rejectDialog.show"
:title="rejectDialog.title"
@handleBtn="saveReject"
@close:showDialog="rejectDialog.show = false"
>
<el-form>
<el-form-item label="驳回原因">
<el-select v-model="rejectType">
<el-option v-for="(item, i) in reasonList"
:key="i"
:label="item.description"
:value="item.rejectType"
>
</el-option>
</el-select>
</el-form-item>
<el-row>
<el-col :span="21">
<el-input type="textarea" v-model="rejectReason" :autosize="{ minRows: 2, maxRows: 12 }" placeholder="请输入内容">
</el-input>
</el-col>
</el-row>
</el-form>
</common-dialog>
</div>
</template> </template>
<script setup>
import { ref, reactive, onMounted, onBeforeUnmount,computed } from 'vue'
import CommonTable from "@/components/commonTable/index.vue";
import commonDialog from "./components/dialog.vue";
import { getDataFun, postDataJSON } from '@/request/method.js';
import moment from 'moment';
import { getToken } from '@/utils/auth.js';
import { ElMessage } from 'element-plus';
const formInline = ref({
eventNameId: '',
keyword: '',
warnType: '',
branchFactoryIds: '',
deviceType: '',
createTime: [
moment(new Date().getTime() - 1000 * 60 * 60 * 24).format('YYYY-MM-DD HH:mm:ss'),
moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
]
});
const formModel = ref({
selectReason: [],
});
const viewDialog = ref({
title: '闭环控制分派',
show: false,
width: '50%',
});
const viewData = {
D: "在线监控(监测)仪器仪表故障",
B: "在线监控(监测)仪器仪表与数采通讯异常",
VGD: "在线监控(监测)仪器仪表与数采通讯异常",
}
const warnValueFilter = computed(()=> {
return (offlineTime)=> {
if (offlineTime == null || offlineTime <= 0) {
return "--";
}
if (offlineTime < 60) {
return offlineTime + "分钟";
}
if (offlineTime < 1440) {
if (offlineTime % 60 == 0) {
return offlineTime / 60 + "小时";
} else {
return (
parseInt(offlineTime / 60) + "小时" + (offlineTime % 60) + "分钟"
);
}
} else {
let s;
let d = parseInt(offlineTime / 60 / 24);
let h = parseInt((offlineTime / 60) % 24);
let m = offlineTime % 60;
s = d + "天";
if (h >= 1) {
s += h + "小时";
}
if (m > 0) {
s += m + "分钟";
}
return s;
}
}
});
const imgUrlList = ref([]);
const alarmImags = ref([]);
const srcList = ref([]);
const workTicketNo = ref('');
const rejectType = ref('');
const reasonList = ref([]);
const rejectReason = ref('');
const rejectDialog = ref({
title: '驳回申请',
show: false,
btnGroup: [
{
attrKey: 'save',
label: '保存'
}
]
});
const getIndex = (index) => {
return (currentPage.value - 1) * pageSize.value + index + 1;
};
const basicConfiguration = reactive({
ticketEventName: [{ name: "全部", id: "" }],
branchFactoryList: [{ branchFactory: "全部", branchFactoryId: "" }],
deviceList: [{ name: "全部", id: "" }]
});
const workSheetDetail = ref(null);
const getColor = computed(()=>{
return (level) => {
if (level == 2) {
return 'red'
} else if (level == 1) {
return 'yellow'
} else {
return 'purple'
}
}
});
const onSearch = ()=> {
searchData();
}
const onReset =()=> {
currentPage.value = 1;
pageSize.value = 20;
formInline.value.eventNameId = '';
formInline.value.keyword = '';
formInline.value.branchFactoryIds = '';
formInline.value.deviceType = '';
formInline.value.createTime = [
moment(new Date().getTime() - 1000 * 60 * 60 * 24).format('YYYY-MM-DD HH:mm:ss'),
moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
]
searchData();
}
const handleView = async (data) => {
viewDialog.value.title = data.eventName;
viewDialog.value.show = true;
/*let res = await getDetail(data.workTicketNo);
personTag.value = [];
if (res.handleUsers && res.handleUsers.length > 0) {
res.handleUsers.forEach(item => {
personTag.value.push({
type: 'info',
name: item.userName,
userId: item.userId,
userName: item.userName
});
});
}
disposeWorkSheetDetail(res);*/
}
const disposeWorkSheetDetail = (obj)=> {
const {
reason,
measure,
imagParams,
imgUrl,
alarmImags,
forwards,
createId,
} = obj;
if (forwards.length > 0) {
let receiveUserItem = forwards.slice(-1)[0];
}
srcList.value = [];
imgUrlList.value = [];
if (imagParams) {
let arr = [];
for (let item of imagParams) {
srcList.value = arr.concat(item.url.split(";"));
}
}
if (alarmImags && alarmImags.length) {
for (let item of alarmImags) {
alarmImags.push(item.imageUrl);
}
}
if (imgUrl) {
imgUrlList.value = imgUrl.split(";");
}
}
// 拒绝
const handleReject = (data)=> {
workTicketNo.value = data.workTicketNo;
rejectDialog.value.show = true;
}
const saveReject = ()=>{
const url = '/transaction/doc/reject';
const params = {
workTicketNo: workTicketNo.value,
rejectType: rejectType.value,
rejectReason: rejectReason.value
}
postDataJSON(url,params).then(res => {
workTicketNo.value = '';
rejectReason.value = '';
rejectType.value = '';
rejectDialog.value.show = false;
ElMessage({
type: 'success',
message: '操作成功'
});
searchData();
});
}
const getDetail = (workTicketNo) => {
return new Promise((resolve,reject) => {
const url = '/transaction/doc/detail';
const params = {
workTicketNo
}
getDataFun(url,params).then(res => {
workSheetDetail.value = res.data;
resolve(res.data);
}).catch(err => {
reject();
});
});
}
const changeBag = (data)=>{
}
const tableData = [
{
id: 1,
name: '张三',
phone: '13888888888',
email: '<EMAIL>',
branchFactory: '上海分公司',
deviceType: '烟感',
eventTime: '2021-09-09 12:00:00',
eventStatus: '已处理',
eventDetail: '设备报警',
level: 1
},
{
id: 2,
name: '张三',
phone: '13888888888',
email: '<EMAIL>',
branchFactory: '上海分公司',
deviceType: '烟感',
eventTime: '2021-09-09 12:00:00',
eventStatus: '已处理',
eventDetail: '设备报警',
level: 2
},
{
id: 3,
name: '张三',
phone: '13888888888',
email: '<EMAIL>',
branchFactory: '上海分公司',
deviceType: '烟感',
eventTime: '20',
level: 3
}
];
const tableColumns = ref([
{
prop: 'workTicketNo',
label: '编号',
width: '10%'
},
{
prop: 'eventName',
label: '事件名称',
width: '10%'
},
{
prop: 'deviceName',
label: '发生位置',
width: '10%'
},
{
prop: 'deviceNo',
label: '设备编码',
width: '10%'
},
{
prop: 'deviceType',
label: '设备类型',
width: '10%'
},
{
prop: 'signalName',
label: '信号名称',
width: '10%'
},
{
prop: 'branchFactory', label: '所属区域',width: '10%' },
{ prop: 'warnTypeName', label: '类型',width: '10%' },
{ prop: 'createTime', label: '发生时间',width: '10%' },
{ prop: 'desc', label: '闭环状态',width: '10%' },
{ prop: 'person', label: '处理人',width: '10%' },
{ prop: 'level', label: '级别',width: '5%' },
{
prop: "operation",
label: "操作",
width: '15%'
},
]);
const permissionBranchFactory = JSON.parse(sessionStorage.getItem('branchFactoryList'))|| [];
const customerId = getToken('customerId');
const getBranchTypeList = ()=> {
const url = '/transaction/getBranchFactory';
const params = {
customerId
}
getDataFun(url,params).then(res => {
if (res && res.code === 1) {
const branchFactory = res.data;
if (permissionBranchFactory.length === 0) {
basicConfiguration.branchFactoryList = [];
} else if (permissionBranchFactory.length === 1 && permissionBranchFactory[0] == 0) {
basicConfiguration.branchFactoryList = basicConfiguration.branchFactoryList.concat(branchFactory);
} else {
basicConfiguration.branchFactoryList = branchFactory.filter((item) =>
permissionBranchFactory.includes(item.branchFactoryId)
);
basicConfiguration.branchFactoryList.unshift({ branchFactory: '全部', branchFactoryId: '' });
}
}
});
}
const getWarnAndTicketConfigMap = ()=> {
const url = '/system/getWarnAndTicketConfigMap';
const params = {
customerId
}
getDataFun(url,params).then(res => {
if (res && res.code === 1) {
const { ticketEventName, eventType } = res.data;
basicConfiguration.ticketEventName = basicConfiguration.ticketEventName.concat(ticketEventName);
}
});
};
let realBtn = '';
const searchData = ()=>{
currentPage.value = 1;
pageSize.value = 20;
if (!formInline.value.branchFactoryIds) {
if (permissionBranchFactory.length === 0) {
realBtn = -1;
} else if (permissionBranchFactory.length === 1 && permissionBranchFactory[0] == 0) {
realBtn = '';
} else {
realBtn = permissionBranchFactory.join(',');
}
} else {
realBtn = formInline.value.branchFactoryIds;
}
getTableData();
}
const getTableData = ()=> {
let keyWord = formInline.value.keyword?.replace(/#/g, '%23');
const params = {
eventNameId: formInline.value.eventNameId,
warnType: formInline.value.warnType,
createStartTime: formInline.value.createTime[0],
createEndTime: formInline.value.createTime[1],
branchFactoryIds: realBtn,
keyword: keyWord,
pageNum: currentPage.value,
pageSize: pageSize.value,
handleState: 2,
belongTo: 1,
deviceType: formInline.value.deviceType
}
tableData.value = [];
const url = '/transaction/doc/getListParamPage';
getDataFun(url,params).then(res => {
if (res && res.code === 1) {
const { list } = res.data;
disposeType(list);
tableData.value = list;
}
});
}
const disposeType = (list)=> {
if (list.length) {
list.forEach(l => {
if (!l.deviceNo) {
l.deviceNo = '--';
}
switch (l.warnType) {
case 0:
l.warnType = '人工提交'
break
case 1:
l.warnType = '超标'
break
case 2:
l.warnType = '超低'
break
case 3:
l.warnType = '生产治理同步率'
break
case 4:
l.warnType = '离线'
break
case 5:
l.warnType = '其他'
break
case 10:
l.warnType = '持续超标'
break
case 11:
l.warnType = '三倍超标'
break
case 99:
l.warnType = '恒值'
break
}
})
}
}
onMounted(() => {
// getBranchTypeList();
// getWarnAndTicketConfigMap();
// searchData();
});
const currentPage = ref(1);
const pageSize = ref(20);
const handlePaginationChange = (pagination) => {
currentPage.value = pagination.currentPage;
pageSize.value = pagination.pageSize;
searchData();
};
</script>
<style scoped lang="scss"> <style scoped lang="scss">
.my-agency {
width: 100%;
height: calc(100% - 14px);
box-sizing: border-box;
background: #fff;
padding: 20px;
display: flex;
flex-direction: column;
box-sizing: border-box;
&-bottom {
flex: 1;
}
.level {
width: 100%;
color: #fff;
text-align: center;
}
.yellow {
// color: #faa508;
position: relative;
&::before {
content: ' ';
width: 8px;
height: 8px;
border-radius: 50%;
background: #ffb224;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%);
}
}
.red {
position: relative;
&::before {
content: ' ';
width: 8px;
height: 8px;
border-radius: 50%;
background: #db001d;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%);
}
}
.purple {
position: relative;
&::before {
content: ' ';
width: 8px;
height: 8px;
border-radius: 50%;
background: #aa05fa;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%);
}
}
.view-btn {
margin-right: 8px;
cursor: pointer;
}
.default-btn {
width: 85px;
}
.search-btn {
width: 85px;
background: #2182a0;
border: 1px solid #2182a0;
}
}
</style> </style>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment