Merge branch 'projects/mesxc-test' into projects/mesxc-zhp

This commit is contained in:
‘937886381’
2023-12-29 09:00:46 +08:00
44 changed files with 1152 additions and 325 deletions

View File

@@ -90,7 +90,7 @@ export default {
{
type: 'datePicker',
label: '时间段',
dateType: 'datetimerange',
dateType: 'daterange',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd HH:mm:ss',
rangeSeparator: '-',

View File

@@ -2,7 +2,7 @@
* @Author: zwq
* @Date: 2021-11-18 14:16:25
* @LastEditors: DY
* @LastEditTime: 2023-11-23 18:45:15
* @LastEditTime: 2023-12-26 16:59:25
* @Description:
-->
<template>
@@ -12,86 +12,162 @@
:wrapper-closable="false"
class="drawer"
size="50%"> -->
<div class="app-container">
<div class="container">
<!-- <small-title slot="title" :no-padding="true">
{{ isdetail ? '详情' : !dataForm.id ? '新增' : '编辑' }}
</small-title> -->
<el-button style="float: right" type="primary" @click="goback()">返回</el-button>
<div v-show="workOrderButton.length">
<el-button v-for="(work, index) in workOrderButton" :key="index" type="primary" @click="init(work.id, true)">{{ work.name }}</el-button>
<div v-show="workOrderButton.length" class="buttonDiv">
<div style="display: flex; width: 100%;">
<el-button v-show="showScroll" type="text" style="width: 30px; background: white; margin-right: 8px" @click="scrollLeft" icon="el-icon-caret-left"></el-button>
<div ref="content" class="scrollDiv">
<el-button style="border: none" v-for="(work, index) in workOrderButton" :key="index" @click="init(work.id, true)">{{ work.name }}</el-button>
</div>
<el-button v-show="showScroll" type="text" @click="scrolRight" style="width: 30px; background: white; margin-left: 8px" icon="el-icon-caret-right"></el-button>
<el-button style="float: right" type="primary" size="small" plain @click="goback()">
<svg-icon icon-class="return"/>返回
</el-button>
</div>
</div>
<div class="content">
<div>
<h1>工单编码{{ dataForm.code }}</h1>
</div>
<small-title
style="margin: 16px 0; padding-left: 8px"
:no-padding="true">
基本信息
</small-title>
<div class="formContent">
<el-row :gutter="20">
<el-col :span="8">工单名称:{{ dataForm.name }}</el-col>
<el-col :span="8">工单来源:{{ dataForm.triggerOrigin === 1 ? 'MES' : dataForm.triggerOrigin === 2 ? 'ERP' : ''}}</el-col>
<el-col :span="8">所属订单:
<span v-for="(item, index) in orderList" :key="index" style="margin-right: 10px">{{ item.orderName }}</span>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">产品名称:{{ dataForm.productName }}</el-col>
<el-col :span="8"> :{{ dataForm.specifications }}</el-col>
<el-col :span="8">计划生产数量:{{ dataForm.planQuantity }}</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">预计用时(小时):{{ dataForm.remainingTime }}</el-col>
<el-col :span="8">计划投入数量:{{ dataForm.planAssignQuantity }}</el-col>
<el-col :span="8">优先级:{{ fitlerP(dataForm.priority) }}</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">负责人:{{ dataForm.workers }}</el-col>
<el-col :span="8">关联产线:
<span v-for="(item, index) in dataForm.productLineNames" :key="index" style="margin-right: 10px">{{ item }}</span>
</el-col>
<el-col :span="8">物料计算方式:{{ dataForm.materialMethod === 1 ? '产品基础' : dataForm.materialMethod === 2 ? '工艺扩展' : '' }}</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">关联工艺:{{ dataForm.processFlowName }}</el-col>
</el-row>
<div class="card">
<div class="boxTitle">
<span class="blueTitle"></span>
<span>工单编码{{ dataForm.code }}</span>
</div>
<el-button v-if="!workOrderButton.length" style="float: right" type="primary" size="small" plain @click="goback()">
<svg-icon icon-class="return"/>返回
</el-button>
<div class="formContent">
<el-row :gutter="20">
<el-col :span="3">
<div class="blodTip">工单名称</div>
<div class="lightTip">{{ dataForm.name }}</div>
</el-col>
<el-col :span="3">
<div class="blodTip">工单来源</div>
<div class="lightTip">{{ dataForm.triggerOrigin === 1 ? 'MES' : dataForm.triggerOrigin === 2 ? 'ERP' : ''}}</div>
</el-col>
<el-col :span="3">
<div class="blodTip">所属订单</div>
<div class="lightTip">
<span v-for="(item, index) in orderList" :key="index" style="margin-right: 10px">{{ item.orderName }}</span>
</div>
</el-col>
<el-col :span="3">
<div class="blodTip">产品名称</div>
<div class="lightTip">{{ dataForm.productName }}</div>
</el-col>
<el-col :span="3">
<div class="blodTip"> </div>
<div class="lightTip">{{ dataForm.specifications }}</div>
</el-col>
<el-col :span="3">
<div class="blodTip">计划生产数量</div>
<div class="lightTip">{{ dataForm.planQuantity }}</div>
</el-col>
<el-col :span="3">
<div class="blodTip">预计用时(小时)</div>
<div class="lightTip">{{ dataForm.remainingTime }}</div>
</el-col>
<el-col :span="3">
<div class="blodTip">计划投入数量</div>
<div class="lightTip">{{ dataForm.planAssignQuantity }}</div>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="3">
<div class="blodTip">优先级</div>
<div class="lightTip">{{ fitlerP(dataForm.priority) }}</div>
</el-col>
<el-col :span="3">
<div class="blodTip">负责人</div>
<div class="lightTip">{{ dataForm.workers }}</div>
</el-col>
<el-col :span="3">
<div class="blodTip">关联产线</div>
<div class="lightTip">
<span v-for="(item, index) in dataForm.productLineNames" :key="index" style="margin-right: 10px">{{ item }}</span>
</div>
</el-col>
<el-col :span="3">
<div class="blodTip">物料计算方式</div>
<div class="lightTip">{{ dataForm.materialMethod === 1 ? '产品基础' : dataForm.materialMethod === 2 ? '工艺扩展' : '' }}</div>
</el-col>
<el-col :span="3">
<div class="blodTip">关联工艺</div>
<div class="lightTip">{{ dataForm.processFlowName }}</div>
</el-col>
</el-row>
</div>
</div>
<small-title
style="margin: 16px 0; padding-left: 8px"
:no-padding="true">
生产信息
</small-title>
<div class="formContent">
<el-row :gutter="20">
<el-col :span="8">工单创建时间:{{ parseTime(dataForm.createTime) }}</el-col>
<el-col :span="8">计划开始时间:{{ parseTime(dataForm.planStartTime) }}</el-col>
<el-col :span="8">计划完成时间:{{ parseTime(dataForm.planFinishTime) }}</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">预计结束时间:{{ parseTime(dataForm.computeFinishTime) }}</el-col>
<el-col :span="8">实际开始时间:{{ parseTime(dataForm.startProduceTime) }}</el-col>
<el-col :span="8">实际完成时间:{{ parseTime(dataForm.finishProduceTime) }}</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">工单状态:{{ fitlerS(dataForm.status) }}</el-col>
<el-col :span="8">实际投入数量:{{ dataForm.assignQuantity }}</el-col>
<el-col :span="8">实际生产数量:{{ dataForm.actualQuantity }}</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">废片数量:{{ dataForm.nokQuantity }}</el-col>
<el-col :span="8">检测瑕疵数:{{ }}</el-col>
</el-row>
<div class="card">
<!-- <small-title
style="margin: 16px 0; padding-left: 8px"
:no-padding="true">
生产信息
</small-title> -->
<div class="boxTitle">
<span class="blueTitle"></span>
<span>生产信息</span>
</div>
<div class="formContent">
<el-row :gutter="20">
<el-col :span="3">
<div class="blodTip">工单创建时间</div>
<div class="lightTip">{{ parseTime(dataForm.createTime) }}</div>
</el-col>
<el-col :span="3">
<div class="blodTip">计划开始时间</div>
<div class="lightTip">{{ parseTime(dataForm.planStartTime) }}</div>
</el-col>
<el-col :span="3">
<div class="blodTip">计划完成时间</div>
<div class="lightTip">{{ parseTime(dataForm.planFinishTime) }}</div>
</el-col>
<el-col :span="3">
<div class="blodTip">预计结束时间</div>
<div class="lightTip">{{ parseTime(dataForm.computeFinishTime) }}</div>
</el-col>
<el-col :span="3">
<div class="blodTip">实际开始时间</div>
<div class="lightTip">{{ parseTime(dataForm.startProduceTime) }}</div>
</el-col>
<el-col :span="3">
<div class="blodTip">实际完成时间</div>
<div class="lightTip">{{ parseTime(dataForm.finishProduceTime) }}</div>
</el-col>
<el-col :span="3">
<div class="blodTip">工单状态</div>
<div class="lightTip">{{ fitlerS(dataForm.status) }}</div>
</el-col>
<el-col :span="3">
<div class="blodTip">实际投入数量</div>
<div class="lightTip">{{ dataForm.assignQuantity }}</div>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="3">
<div class="blodTip">实际生产数量</div>
<div class="lightTip">{{ dataForm.actualQuantity }}</div>
</el-col>
<el-col :span="3">
<div class="blodTip">废片数量</div>
<div class="lightTip">{{ dataForm.nokQuantity }}</div>
</el-col>
<el-col :span="3">
<div class="blodTip">检测瑕疵数</div>
<div class="lightTip">{{ }}</div>
</el-col>
</el-row>
</div>
</div>
<div class="attr-list">
<small-title
style="margin: 16px 0; padding-left: 8px"
:no-padding="true">
订单相关信息
</small-title>
<div class="card" style="padding-bottom: 16px; margin-bottom: 10px">
<div class="boxTitle">
<span class="blueTitle"></span>
<span>订单相关信息</span>
</div>
<base-table
:table-props="tableProps"
:page="listQuery.pageNo"
@@ -114,12 +190,11 @@
@pagination="getList" /> -->
</div>
<div class="attr-list">
<small-title
style="margin: 16px 0; padding-left: 8px"
:no-padding="true">
预计用料信息
</small-title>
<div class="card" style="padding-bottom: 16px;">
<div class="boxTitle">
<span class="blueTitle"></span>
<span>预计用料信息</span>
</div>
<base-table
:table-props="tableProps1"
:page="listQuery1.pageNo"
@@ -227,8 +302,11 @@ export default {
// orderArray: [],
visible: false,
isdetail: false,
showScroll: false,
workOrderButton: [],
processFlowList: []
processFlowList: [],
timer: null
// tableH: this.tableHeight(510) / 2
};
},
created() {
@@ -244,13 +322,38 @@ export default {
name: work.name
}
})
const contentRef = this.$refs.content
if (contentRef.scrollWidth > contentRef.clientWidth) {
this.showScroll = true
} else {
this.showScroll = false
}
console.log(contentRef.scrollWidth, contentRef.clientWidth)
this.init(this.workOrderButton[0].id, true)
})
} else {
} else {
this.init(this.$route.query.id, true)
}
},
methods: {
scrolRight() {
// let contentRef = this.$refs.content
// console.log('你好啊啊', contentRef.scrollWidth, contentRef.clientWidth)
this.stopScroll()
this.timer = setTimeout(() => {
this.$refs.content.scrollLeft += 50
}, 100)
// if (contentRef.scrollWidth > contentRef.clientWi)
},
scrollLeft() {
this.stopScroll()
this.timer = setTimeout(() => {
this.$refs.content.scrollLeft -= 50
}, 100)
},
stopScroll() {
clearTimeout(this.timer)
},
getDict() {
// 工艺
getProcessFlowList().then(res => {
@@ -391,59 +494,26 @@ export default {
};
</script>
<style scoped>
.drawer >>> .el-drawer {
border-radius: 8px 0 0 8px;
.scrollDiv {
width: 100%;
overflow-x: hidden;
/* height: 50px; */
display: flex;
flex-direction: column;
/* padding-bottom: -10px; */
}
.drawer >>> .el-form-item__label {
padding: 0;
.scrollDiv::-webkit-scrollbar-track {
display: none;
}
.drawer >>> .el-drawer__header {
margin: 0;
padding: 32px 32px 24px;
border-bottom: 1px solid #dcdfe6;
}
.drawer >>> .el-drawer__body {
flex: 1;
height: 1px;
.buttonDiv {
margin-bottom: 8px;
display: flex;
flex-direction: column;
}
.drawer >>> .content {
padding: 10px 24px;
flex: 1;
display: flex;
flex-direction: column;
/* height: 100%; */
}
.drawer >>> .visual-part {
flex: 1 auto;
max-height: 76vh;
overflow: hidden;
overflow-y: scroll;
padding-right: 10px; /* 调整滚动条样式 */
}
.drawer >>> .el-form,
.drawer >>> .attr-list {
padding: 0 16px;
}
.drawer-body__footer {
display: flex;
justify-content: flex-end;
padding: 18px;
}
.formContent {
font-size: 16px;
line-height: 1.5;
margin-bottom: 10px;
width: 100%;
padding: 0 14px;
}
.action_btn {
float: right;
@@ -453,4 +523,43 @@ export default {
.add {
color: #0b58ff;
}
.blodTip {
height: 16px;
font-size: 14px;
font-weight: 600;
color: rgba(0,0,0,0.85);
margin-bottom: 8px;
}
.lightTip {
/* height: 16px; */
font-size: 14px;
font-weight: 400;
color: rgba(102,102,102,0.75);
margin-bottom: 12px;
}
.container {
background-color: rgb(242, 244, 249);
}
.card {
padding: 16px 16px 0 16px;
background-color: #fff;
border-radius: 9px;
}
.boxTitle {
display: inline-block;
font-size: 16px;
font-weight: 400;
color: #000000;
margin:0 10px 20px 0;
}
.blueTitle {
content: '';
display: inline-block;
width: 4px;
height: 18px;
background-color: #0B58FF;
border-radius: 1px;
margin-right: 8px;
vertical-align: bottom;
}
</style>

View File

@@ -84,7 +84,7 @@ export default {
label: '时间',
dateType: 'monthrange',
format: 'yyyy-MM',
valueFormat: 'yyyy-MM-ddTHH:mm:ss',
valueFormat: 'timestamp',
rangeSeparator: '-',
startPlaceholder: '开始时间',
endPlaceholder: '结束时间',

Binary file not shown.

After

Width:  |  Height:  |  Size: 492 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 322 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 507 B

View File

@@ -11,12 +11,12 @@
<i
class=""
style="display: inline-block; margin-left: 12px; padding-top: 4px">
<img :src="imgSrc" width="18" height="16" alt="" />
<img :src="imgSrc" width="20" height="20" alt="" />
</i>
<span
style="
color: #fff;
font-size: 20px;
font-size: 24px;
line-height: 2;
margin-left: 6px;
display: inline-block;
@@ -48,11 +48,11 @@ export default {
case '风机运行频率':
return require('../assets/flow.png');
case 'ISRA缺陷检测':
return require('../assets/gas.png');
return require('../assets/check.png');
case '能耗':
return require('../assets/gas.png');
return require('../assets/energeCost.png');
case '窑炉信息':
return require('../assets/gas.png');
return require('../assets/msg.png');
case '烟气处理':
return require('../assets/gas.png');
}

View File

@@ -11,9 +11,11 @@
<script>
import * as echarts from 'echarts';
import resize from './../mixins/resize'
export default {
name: 'GasChart',
mixins: [resize],
components: {},
props: {},
data() {
@@ -110,7 +112,6 @@ export default {
},
};
},
inject: ['resizeChart'],
computed: {
sidebarStatus() {
return this.$store.state.app.sidebar.opened;
@@ -126,10 +127,6 @@ export default {
this.chart.setOption(this.option);
}, 500);
},
// resizeChart(val) {
// console.log('resizeChart', val);
// val && this.chart && this.chart.resize();
// },
},
mounted() {
this.$el.addEventListener('resize', () => {

View File

@@ -7,69 +7,93 @@
<template>
<header class="kiln-header">
<h1
style="
font-size: 32px;
margin-bottom: 36px;
color: #0ee8e4;
letter-spacing: 5px;
">
<h1>
窑炉生产运行驾驶舱
</h1>
<!-- left: 312px; -->
<div
class="firm"
style="
position: absolute;
bottom: 24px;
left: 16.5vw;
color: #fff;
font-size: 16px;
letter-spacing: 1px;
">
class="firm">
单位: 河南汇融科技服务有限公司
</div>
<div
class="datetime"
style="
position: absolute;
bottom: 18px;
right: 15.5vw;
color: #fff;
font-size: 16px;
letter-spacing: 1px;
display: flex;
align-items: center;
gap: 16px;
">
<DateBtnGroup />
class="datetime">
<!-- <DateBtnGroup /> -->
{{ new Date().toLocaleString() }}
</div>
<el-button
type="text"
class="screen-btn"
@click="changeFullScreen"
>
<svg-icon v-if="isFullScreen" icon-class="unFullScreenView" />
<svg-icon v-else icon-class="fullScreenView" />
</el-button>
</header>
</template>
<script>
import DateBtnGroup from './DateBtnGroup.vue';
// import DateBtnGroup from './DateBtnGroup.vue';
export default {
name: 'KilnHeader',
components: { DateBtnGroup },
props: {},
// components: { DateBtnGroup },
props: {
isFullScreen:false
},
data() {
return {};
return {
};
},
computed: {},
methods: {},
methods: {
changeFullScreen() {
this.$emit('screenfullChange')
}
},
};
</script>
<style scoped lang="scss">
.kiln-header {
background: url('../assets/head.png') no-repeat;
height: 88px;
height: 96px;
background-size: 100%;
background-position: 0 0;
display: grid;
place-content: center;
position: relative;
h1{
font-size: 32px;
margin-bottom: 36px;
color: #0ee8e4;
letter-spacing: 8px;
}
.firm{
position: absolute;
top: 45px;
left: 325px;
color: #fff;
font-size: 20px;
letter-spacing: 1px;
}
.datetime {
position: absolute;
top: 45px;
right: 240px;
color: #fff;
font-size: 20px;
letter-spacing: 1px;
display: flex;
align-items: center;
gap: 16px;
}
.screen-btn{
color: #00fff0;
font-size: 32px;
position: absolute;
right: 32px;
top:28px
}
}
</style>

View File

@@ -11,9 +11,11 @@
<script>
import * as echarts from 'echarts';
import resize from './../mixins/resize'
export default {
name: 'ISRAChart',
mixins: [resize],
components: {},
props: {},
data() {
@@ -24,6 +26,14 @@ export default {
tooltip: {
trigger: 'item',
},
legend: {
bottom: '3%',
left: 'center',
icon: 'circle',
textStyle: {
color: '#fff'
}
},
title: {
text: 11234,
subtext: '总数',
@@ -44,7 +54,7 @@ export default {
{
name: 'Access From',
type: 'pie',
radius: ['60%', '85%'],
radius: ['45%', '65%'],
avoidLabelOverlap: true,
label: {
show: true,
@@ -60,25 +70,25 @@ export default {
rich: {
a: {
color: '#2760ff',
fontSize: 18,
fontSize: 24,
borderWidth: 0,
textBorderWidth: 0,
},
b: {
color: '#518eec',
fontSize: 18,
fontSize: 24,
borderWidth: 0,
textBorderWidth: 0,
},
c: {
color: '#0ee8e4',
fontSize: 18,
fontSize: 24,
borderWidth: 0,
textBorderWidth: 0,
},
d: {
color: '#ddb523',
fontSize: 18,
fontSize: 24,
borderWidth: 0,
textBorderWidth: 0,
},

View File

@@ -36,7 +36,7 @@ export default {
.switcher {
:deep(.el-switch__core) {
border: none;
background-color: #213d566b;
background-color:rgba(3, 35, 60, 1);
&::after {
background-color: #02457e;
@@ -46,7 +46,7 @@ export default {
:deep(.is-checked) {
.el-switch__core {
border: none;
background-color: #b4fffc;
background-color: rgba(180, 255, 252, 0.71);
&::after {
background-color: #08d8cd;

View File

@@ -12,13 +12,13 @@
<div class="" style="flex: 2; padding: 8px">
<div
class="header-line"
style="margin-bottom: 8px; display: flex; align-items: center">
style="margin: 8px 0 16px; display: flex; align-items: center">
<h2 class="" style="margin: 0; color: #0ee8fe; margin-right: 12px">
烟气趋势图
能耗趋势图
</h2>
<Switcher />
<!-- <Switcher /> -->
<div>
<span class="lgd lgd-total">总量</span>
<!-- <span class="lgd lgd-total">总量</span> -->
<!-- <span class="lgd lgd-day">白班</span>
<span class="lgd lgd-night">夜班</span> -->
</div>
@@ -31,10 +31,10 @@
justify-content: space-between;
">
<SelectorBtnGroup
:options="['氧气含量', '二氧化硫', '一氧化氢', '二氧化氢']" />
<SelectorBtnGroup :options="['日', '周', '月', '年']" />
:options="['电耗能', '天然气I', '天然气II']" />
<SelectorBtnGroup :options="['周', '月', '年']" />
</div>
<div class="chart" style="height: 150px; margin-top: 8px;">
<div class="chart" style="height: 200px; margin-top: 8px;">
<GasChart />
</div>
</div>
@@ -45,8 +45,8 @@
import Container from '../components/Container.vue';
import ShadowRect from '../components/ShadowRect.vue';
import SplitLine from '../components/line';
import Switcher from '../components/Switcher.vue';
import EnergeTop from './EnergeTop.vue';
import Switcher from '../components/Switcher';
import EnergeTop from './EnergeTop';
import GasChart from '../components/GasChart.vue';
import SelectorBtnGroup from '../components/SelectorBtnGroup.vue';
export default {

View File

@@ -15,6 +15,7 @@
grid-template-rows: auto;
gap: 8px;
padding: 4px;
margin-bottom: 6px;
">
<ShadowRect
style="grid-row: 1 / 3; flex-direction: column; justify-content: center">

View File

@@ -7,7 +7,7 @@
<template>
<Container name="风机运行频率" size="middle" style="">
<div class="" style="position: absolute; top: 18px; left: 180px">
<div class="" style="position: absolute; top: 26px; left: 220px">
<Switcher />
</div>
<div
@@ -17,22 +17,22 @@
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-auto-rows: auto;
gap: 8px;
gap: 10px;
">
<ShadowRect v-for="n in 14" :key="n" :rounded="false">
<ShadowRect v-for="(value, key, i) in fanFrequencyInfo" :key="i" :rounded="false">
<span
style="
font-size: 16px;
line-height: 1.24;
flex: 1.2;
font-size: 18px;
line-height: 1.1;
flex: 3.5;
text-align: right;
padding-right: 8px;
letter-spacing: 1px;
">
{{ n }}#风机
{{ key }}:
</span>
<span style="font-size: 16px; line-height: 1.24; flex: 1">
{{ Math.floor(Math.random() * 100) }}Hz
<span style="font-size: 20px; line-height: 1; flex: 1">
{{ value }}Hz
</span>
</ShadowRect>
</div>
@@ -42,16 +42,24 @@
<script>
import Container from '../components/Container.vue';
import ShadowRect from '../components/ShadowRect.vue';
import Switcher from '../components/Switcher.vue';
import Switcher from '../components/Switcher';
export default {
name: 'FanSequence',
components: { Container, ShadowRect, Switcher },
computed: {
fanFrequencyInfo() {
return this.$store.state.websocket.fanFrequencyInfo
}
},
props: {},
data() {
return {};
},
computed: {},
methods: {},
mounted() {
},
methods: {
}
};
</script>

View File

@@ -21,7 +21,7 @@
<ShadowRect>
<span
style="
font-size: 16px;
font-size: 20px;
line-height: 1.24;
flex: 1.2;
text-align: right;
@@ -30,12 +30,12 @@
">
氧气含量
</span>
<span style="font-size: 16px; line-height: 1.24; flex: 1">82%</span>
<span style="font-size: 20px; line-height: 1.24; flex: 1">82%</span>
</ShadowRect>
<ShadowRect>
<div
style="
font-size: 16px;
font-size: 20px;
line-height: 1.5;
flex: 1.2;
text-align: right;
@@ -45,13 +45,13 @@
<p style="margin: 0; line-height: inherit">一氧化氮</p>
<p style="margin: 0; line-height: inherit">排放浓度</p>
</div>
<span style="font-size: 16px; line-height: 1.24; flex: 1">82%</span>
<span style="font-size: 20px; line-height: 1.24; flex: 1">82%</span>
</ShadowRect>
<ShadowRect>
<div
style="
font-size: 16px;
font-size: 20px;
line-height: 1.5;
flex: 1.2;
text-align: right;
@@ -61,13 +61,13 @@
<p style="margin: 0; line-height: inherit">二氧化硫</p>
<p style="margin: 0; line-height: inherit">排放浓度</p>
</div>
<span style="font-size: 16px; line-height: 1.24; flex: 1">82%</span>
<span style="font-size: 20px; line-height: 1.24; flex: 1">59mg/</span>
</ShadowRect>
<ShadowRect>
<div
style="
font-size: 16px;
font-size: 20px;
line-height: 1.5;
flex: 1.2;
text-align: right;
@@ -77,22 +77,22 @@
<p style="margin: 0; line-height: inherit">二氧化氮</p>
<p style="margin: 0; line-height: inherit">排放浓度</p>
</div>
<span style="font-size: 16px; line-height: 1.24; flex: 1">82%</span>
<span style="font-size: 20px; line-height: 1.24; flex: 1">82%</span>
</ShadowRect>
</div>
<KilnLine :horizontal="true" />
<div class="" style="flex: 2; padding: 8px">
<div
class="header-line"
style="margin-bottom: 8px; display: flex; align-items: center">
<h2 class="" style="margin: 0; color: #0ee8fe; margin-right: 12px">
style="margin-bottom: 10px; display: flex; align-items: center">
<h2 class="" style="margin: 5px 0; color: #0ee8fe; margin-right: 12px">
烟气趋势图
</h2>
<Switcher />
<!-- <Switcher /> -->
<div>
<span class="lgd lgd-total">总量</span>
<span class="lgd lgd-day">白班</span>
<span class="lgd lgd-night">夜班</span>
<!-- <span class="lgd lgd-total">总量</span> -->
<!-- <span class="lgd lgd-day">白班</span>
<span class="lgd lgd-night">夜班</span> -->
</div>
</div>
<div
@@ -103,10 +103,10 @@
justify-content: space-between;
">
<SelectorBtnGroup
:options="['氧气含量', '二氧化硫', '一氧化', '二氧化']" />
:options="['氧气含量', '二氧化硫', '一氧化', '二氧化']" />
<SelectorBtnGroup :options="['日', '周', '月', '年']" />
</div>
<div class="chart" style="height: 220px">
<div class="chart" style="height: 250px;margin-top: 10px;">
<GasChart />
</div>
</div>
@@ -118,7 +118,7 @@
import Container from '../components/Container.vue';
import ShadowRect from '../components/ShadowRect.vue';
import KilnLine from '../components/line';
import Switcher from '../components/Switcher.vue';
import Switcher from '../components/Switcher';
import SelectorBtnGroup from '../components/SelectorBtnGroup.vue';
import GasChart from '../components/GasChart.vue';

View File

@@ -7,9 +7,10 @@
<template>
<Container name="ISRA缺陷检测" size="middle" style="">
<div style="padding: 12px; display: flex; flex-direction: column; gap: 8px; height: 100%;">
<ISRAChart />
<!-- <div style="padding: 12px; display: flex; flex-direction: column; gap: 8px; height: 100%;">
<div class="f" style="flex: 9;">
<ISRAChart />
</div>
<ul
class="legend"
@@ -27,7 +28,7 @@
<li class="fault-3">缺陷3</li>
<li class="fault-4">缺陷4</li>
</ul>
</div>
</div> -->
</Container>
</template>

View File

@@ -17,22 +17,37 @@
grid-auto-rows: auto;
gap: 8px;
">
<ShadowRect v-for="info in kilnInfo" :key="info.name" :rounded="false">
<span
style="
font-size: 16px;
line-height: 1.45;
flex: 1.2;
text-align: right;
padding-right: 8px;
letter-spacing: 1px;
">
{{ info.name }}
</span>
<span style="font-size: 16px; line-height: 1.45; flex: 1">
{{ info.value }}
<!-- {{ Math.floor(Math.random() * 100) }}Hz -->
</span>
<ShadowRect :rounded="false">
<span class="kiln-info-item">窑炉压力:</span>
<span style="font-size: 20px; line-height: 1.7; flex: 1">{{ kilnInfoMsg?.kilnPressure }}</span>
</ShadowRect>
<ShadowRect :rounded="false">
<span class="kiln-info-item">循环水温度:</span>
<span style="font-size: 20px; line-height: 1.7; flex: 1">{{ kilnInfoMsg?.waterTemp }}</span>
</ShadowRect>
<ShadowRect :rounded="false">
<span class="kiln-info-item">循环水流量:</span>
<span style="font-size: 20px; line-height: 1.7; flex: 1">{{ kilnInfoMsg?.waterFlow }}</span>
</ShadowRect>
<ShadowRect :rounded="false">
<span class="kiln-info-item">循环水压力:</span>
<span style="font-size: 20px; line-height: 1.7; flex: 1">{{ kilnInfoMsg?.waterPressure }}</span>
</ShadowRect>
<ShadowRect :rounded="false">
<span class="kiln-info-item">助燃风压力:</span>
<span style="font-size: 20px; line-height: 1.7; flex: 1">{{ kilnInfoMsg?.combustionAirPressure }}</span>
</ShadowRect>
<ShadowRect :rounded="false">
<span class="kiln-info-item">碹顶加权温度:</span>
<span style="font-size: 20px; line-height: 1.7; flex: 1">{{ kilnInfoMsg?.topTemp }}</span>
</ShadowRect>
<ShadowRect :rounded="false">
<span class="kiln-info-item">压缩气压力:</span>
<span style="font-size: 20px; line-height: 1.7; flex: 1">{{ kilnInfoMsg?.compressedAirPressure }}</span>
</ShadowRect>
<ShadowRect :rounded="false">
<span class="kiln-info-item">熔化加权温度:</span>
<span style="font-size: 20px; line-height: 1.7; flex: 1">{{ kilnInfoMsg?.meltTemp }}</span>
</ShadowRect>
</div>
</Container>
@@ -48,24 +63,26 @@ export default {
props: {},
data() {
return {
kilnInfo: [
{ name: '窑炉压力', value: '83Kpa' },
{ name: '循环水温度', value: '53℃' },
{ name: '循环水流量', value: '23m³/h' },
{ name: '循环水压力', value: '33Kpa' },
{ name: '助燃风压力', value: '12Kpa' },
{ name: '碹顶加权温度', value: '32℃' },
{ name: '压缩气压力', value: '83Kpa' },
{ name: '融化加权温度', value: '123℃' },
],
};
},
computed: {},
computed: {
kilnInfoMsg() {
return this.$store.state.websocket.kilnInfo
}
},
methods: {},
};
</script>
<style scoped lang="scss">
.kiln-info {
.kiln-info-item {
font-size: 20px;
line-height: 1.7;
flex: 1.5;
text-align: right;
padding-right: 8px;
letter-spacing: 1px;
}
}
</style>

View File

@@ -12,7 +12,7 @@
display: grid;
gap: 16px;
grid-template-columns: 1fr 1fr;
grid-template-rows: 1fr 1fr;
grid-template-rows: 462px 462px;
">
<MaterialCost />
<IsraCheck />

View File

@@ -21,7 +21,7 @@
class="material"
style="
flex: 1;
padding: 6px;
padding: 12px 6px 20px;
display: flex;
flex-direction: column;
gap: 4px;
@@ -31,7 +31,7 @@
<span style="color: #0ee8e4; font-weight: 500; font-size: 32px">
234
</span>
<span style="color: #fff; font-size: 14px; letter-spacing: 1px">
<span style="color: #fff; font-size: 16px; letter-spacing: 1px">
- 原料1/ -
</span>
</div>

View File

@@ -8,7 +8,11 @@
<template>
<div
class="right-two"
style="display: flex; gap: 16px; flex-direction: column">
style="
display: grid;
gap: 16px;
grid-template-rows: 320px 605px;
">
<KilnInfo />
<GasHandle />
</div>
@@ -18,7 +22,7 @@
import Container from '../components/Container.vue';
import ShadowRect from '../components/ShadowRect.vue';
import KilnLine from '../components/line';
import Switcher from '../components/Switcher.vue';
import Switcher from '../components/Switcher';
import SelectorBtnGroup from '../components/SelectorBtnGroup.vue';
import KilnInfo from './KilnInfo.vue';
import GasHandle from './GasHandle.vue';

View File

@@ -6,36 +6,46 @@
-->
<template>
<div
class="KilnDataBoard"
style="
position: absolute;
top: -8px;
left: -16px;
width: calc(100% + 28px);
height: calc(100% + 38px);
display: flex;
flex-direction: column;
gap: 16px;
">
<KHeader />
<div id='kilnContainer' style="width: 100%;height: 100%;">
<div
class="main-body"
style="flex: 1; display: flex; gap: 16px; padding: 8px 16px">
<div class="left-side" style="flex: 2">
<LeftFour />
</div>
<div class="right-side" style="flex: 1">
<RightTwo />
id='kilnContainerB'
ref='kilnContainer'
class="KilnDataBoard"
style="
position: absolute;
transform-origin: 16px 8px;
font-size: 16px;
top: -8px;
left: -16px;
width: 1920px;
height: 1080px;
display: flex;
flex-direction: column;
gap: 24px;
"
:style="{transform:'scale('+scaleNum+')'}">
<KHeader :isFullScreen='isFullScreen' @screenfullChange='screenfullChange'/>
<div
class="main-body"
style="flex: 1; display: flex; gap: 20px; padding: 0px 16px">
<div class="left-side" style="flex: 2">
<LeftFour />
</div>
<div class="right-side" style="flex: 1">
<RightTwo />
</div>
</div>
</div>
</div>
</template>
<script>
import KHeader from '../components/Header.vue';
import LeftFour from './LeftFour.vue';
import KHeader from '../components/Header';
import LeftFour from './LeftFour';
import RightTwo from './RightTwo.vue';
import screenfull from 'screenfull'
import { debounce } from '@/utils/debounce'
import { getDcsMsg } from './../utils/dcs'
export default {
name: 'KilnDataBoard',
@@ -49,15 +59,110 @@ export default {
// resizeChart: null,
// };
// },
mounted() {
// this.$el.addEventListener('resize', () => {
// console.log('resizzzze...')
// this.resizeChart = Math.random();
// });
},
data() {
return {};
return {
isFullScreen: false,
scaleNum: 0.8
};
},
created() {
this.init()
},
destroy() {
this.destroy()
},
mounted() {
this.boxReset = debounce(() => {
this.resetSize()
}, 300)
this.boxReset()
window.addEventListener('resize', () => {
this.boxReset()
})
// this.getMes()
// closeWebsocket()
getDcsMsg()
console.log('mounted...........')
},
destroyed() {
console.log('destroyed...........')
},
methods: {
change() {
this.isFullScreen = screenfull.isFullscreen
},
init() {
if (screenfull.isEnabled) {
screenfull.on('change', this.change)
}
},
destroy() {
if (screenfull.isEnabled) {
screenfull.off('change', this.change)
}
},
// 全屏
screenfullChange() {
if (!screenfull.isEnabled) {
this.$message({
message: 'you browser can not work',
type: 'warning'
})
return false
}
screenfull.toggle(this.$refs.kilnContainer)
console.log('11111')
// this.resetSize()
console.log('2222')
},
resetSize() {
let kilnContainerBox = document.querySelector('#kilnContainerB')
let rw = parseFloat(window.innerWidth)
let rh = parseFloat(window.innerHeight)
let bw = parseFloat(kilnContainerBox.style.width)
let bh = parseFloat(kilnContainerBox.style.height)
let wx = 0
let hx = 0
if (screenfull.isFullscreen) {
console.log('全屏')
wx = rw / bw
hx = rh / bh
console.log(this.scaleNum)
}else{
console.log('非全屏')
console.log(this.$store.state.app.sidebar.opened)
if (this.$store.state.app.sidebar.opened) {
wx = (rw-264) / bw
hx = (rh-116) / bh
}else{
wx = (rw-78) / bw
hx = (rh-116) / bh
}
}
this.scaleNum = wx
},
// 获取ws
getMes() {
const userId = 'dcsmsg' + new Date().getTime()
connectWebsocket(
// 测试地址
'ws://10.70.180.10:8081/xc-screen/websocket/'+userId,
// 传递给后台的数据
'',
// 成功拿到后台返回的数据的回调函数
(data) => {
console.log('成功的回调函数, 接收到的data数据: ', data)
},
// websocket连接失败的回调函数
(err) => {
console.log('失败的回调函数', err)
}
)
}
}
};
</script>
@@ -66,5 +171,6 @@ export default {
background: url(../assets/bg.png) no-repeat;
background-size: cover;
background-position: 0 0;
overflow: auto;
}
</style>

View File

@@ -0,0 +1,55 @@
import { debounce } from '@/utils'
export default {
data() {
return {
$_sidebarElm: null,
$_resizeHandler: null
}
},
mounted() {
this.$_resizeHandler = debounce(() => {
if (this.chart) {
this.chart.resize()
}
}, 100)
this.$_initResizeEvent()
this.$_initSidebarResizeEvent()
},
beforeDestroy() {
this.$_destroyResizeEvent()
this.$_destroySidebarResizeEvent()
},
// to fixed bug when cached by keep-alive
// https://github.com/PanJiaChen/vue-element-admin/issues/2116
activated() {
this.$_initResizeEvent()
this.$_initSidebarResizeEvent()
},
deactivated() {
this.$_destroyResizeEvent()
this.$_destroySidebarResizeEvent()
},
methods: {
// use $_ for mixins properties
// https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
$_initResizeEvent() {
window.addEventListener('resize', this.$_resizeHandler)
},
$_destroyResizeEvent() {
window.removeEventListener('resize', this.$_resizeHandler)
},
$_sidebarResizeHandler(e) {
if (e.propertyName === 'width') {
this.$_resizeHandler()
}
},
$_initSidebarResizeEvent() {
this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0]
this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler)
},
$_destroySidebarResizeEvent() {
this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler)
}
}
}

View File

@@ -0,0 +1,34 @@
import { connectWebsocket, closeWebsocket } from './../utils/websocket'
import store from "@/store";
// 创建dcs链接
export const getDcsMsg = () => {
const userId = 'dcsmsg' + new Date().getTime()
connectWebsocket(
// 测试地址
'ws://10.70.180.10:8081/xc-screen/websocket/'+userId,
// 传递给后台的数据
'',
// 成功拿到后台返回的数据的回调函数
(data) => {
console.log('成功的回调函数, 接收到的data数据: ', data)
let msgData = JSON.parse(data)
switch (msgData?.type) {
case "FanFrequencyInfo": {
store.dispatch({type: "websocket/setFanFrequencyInfo", payload:msgData.data.FanFrequencyInfo})
break;
}
case "KilnInfo": {
store.dispatch({type: "websocket/setKilnInfo", payload: msgData.data.kilnInfo})
break;
}
default:
console.log('++++++++')
}
},
// websocket连接失败的回调函数
(err) => {
console.log('失败的回调函数', err)
}
)
}

View File

@@ -0,0 +1,34 @@
import { connectWebsocket, closeWebsocket } from './../utils/websocket'
import store from "@/store";
// 创建dcs链接
export const getDcsMsg = () => {
const userId = 'dcsmsg' + new Date().getTime()
connectWebsocket(
// 测试地址
'ws://10.70.180.10:8081/xc-screen/websocket/'+userId,
// 传递给后台的数据
'',
// 成功拿到后台返回的数据的回调函数
(data) => {
console.log('成功的回调函数, 接收到的data数据: ', data)
let msgData = JSON.parse(data)
switch (msgData?.type) {
case "FanFrequencyInfo": {
store.dispatch({type: "websocket/setFanFrequencyInfo", payload:msgData.data.FanFrequencyInfo})
break;
}
case "KilnInfo": {
store.dispatch({type: "websocket/setKilnInfo", payload: msgData.data.kilnInfo})
break;
}
default:
console.log('++++++++')
}
},
// websocket连接失败的回调函数
(err) => {
console.log('失败的回调函数', err)
}
)
}

View File

@@ -0,0 +1,204 @@
// websocket实例
let wsObj = null;
// ws连接地址
let wsUrl = null;
// let userId = null;
// 是否执行重连 true/不执行 false/执行
let lockReconnect = false;
// 重连定时器
let wsCreateHandler = null;
// 连接成功,执行回调函数
let messageCallback = null;
// 连接失败,执行回调函数
let errorCallback = null;
// 发送给后台的数据
let sendDatas = {};
/**
* 发起websocket请求函数
* @param {string} url ws连接地址
* @param {Object} agentData 传给后台的参数
* @param {function} successCallback 接收到ws数据对数据进行处理的回调函数
* @param {function} errCallback ws连接错误的回调函数
*/
export const connectWebsocket = (url, agentData, successCallback, errCallback) => {
wsUrl = url;
createWebSoket();
messageCallback = successCallback;
errorCallback = errCallback;
sendDatas = agentData;
}
// 手动关闭websocket 这里手动关闭会执行onclose事件
export const closeWebsocket = () => {
if (wsObj) {
writeToScreen('手动关闭websocket');
wsObj.close() // 关闭websocket
// wsObj.onclose() // 关闭websocket(如果上面的关闭不生效就加上这一条)
// 关闭重连
lockReconnect = true;
wsCreateHandler && clearTimeout(wsCreateHandler);
// 关闭心跳检查
heartCheck.stop();
}
}
// 创建ws函数
const createWebSoket = () => {
if (typeof (WebSocket) === 'undefined') {
writeToScreen("您的浏览器不支持WebSocket无法获取数据");
return false
}
// const host = window.location.host;
// userId = GetQueryString("userId");
// wsUrl = "ws://" + host + "/websoket" + userId;
try {
wsObj = new WebSocket(wsUrl);
initWsEventHandle();
} catch (e) {
writeToScreen("连接异常,开始重连");
reconnect();
}
}
const initWsEventHandle = () => {
try {
// 连接成功
wsObj.onopen = (event) => {
onWsOpen(event);
heartCheck.start();
}
// 监听服务器端返回的信息
wsObj.onmessage = (event) => {
onWsMessage(event);
heartCheck.start();
}
wsObj.onclose = (event) => {
writeToScreen('onclose执行关闭事件');
onWsClose(event);
}
wsObj.onerror = (event) => {
writeToScreen('onerror执行error事件开始重连');
onWsError(event);
reconnect();
}
} catch (err) {
writeToScreen('绑定事件没有成功,开始重连');
reconnect();
}
}
const onWsOpen = (event) => {
writeToScreen('CONNECT');
// // 客户端与服务器端通信
// wsObj.send('我发送消息给服务端');
// 添加状态判断当为OPEN时发送消息
if (wsObj.readyState === wsObj.OPEN) { // wsObj.OPEN = 1
// 发给后端的数据需要字符串化
wsObj.send(JSON.stringify(sendDatas));
}
if (wsObj.readyState === wsObj.CLOSED) { // wsObj.CLOSED = 3
writeToScreen('wsObj.readyState=3, ws连接异常开始重连');
reconnect();
errorCallback(event);
}
}
const onWsMessage = (event) => {
const jsonStr = event.data;
writeToScreen('onWsMessage接收到服务器的数据: ', jsonStr);
messageCallback(jsonStr);
}
const onWsClose = (event) => {
writeToScreen('DISCONNECT');
// e.code === 1000 表示正常关闭。 无论为何目的而创建, 该链接都已成功完成任务。
// e.code !== 1000 表示非正常关闭。
console.log('onclose event: ', event)
if (event && event.code !== 1000) {
writeToScreen('非正常关闭');
errorCallback(event);
// 如果不是手动关闭,这里的重连会执行;如果调用了手动关闭函数,这里重连不会执行
reconnect();
}
}
const onWsError = (event) => {
writeToScreen('onWsError: ', event.data);
errorCallback(event);
}
const writeToScreen = (massage) => {
console.log(massage);
}
// 重连函数
const reconnect = () => {
if (lockReconnect) {
return;
}
writeToScreen('3秒后重连');
lockReconnect = true;
// 没连接上会一直重连,设置延迟避免请求过多
wsCreateHandler && clearTimeout(wsCreateHandler);
wsCreateHandler = setTimeout(() => {
writeToScreen('重连...' + wsUrl);
createWebSoket();
lockReconnect = false;
writeToScreen('重连完成');
}, 3000);
}
// 从浏览器地址中获取对应参数
const GetQueryString = (name) => {
let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
// 获取url中 ? 符后的字符串并正则匹配
let r = window.location.search.substr(1).match(reg);
let context = "";
r && (context = r[2]);
reg = null;
r = null;
return context;
}
// 心跳检查看看websocket是否还在正常连接中
let heartCheck = {
timeout: 15000,
timeoutObj: null,
serverTimeoutObj: null,
// 重启
reset() {
clearTimeout(this.timeoutObj);
clearTimeout(this.serverTimeoutObj);
this.start();
},
// 停止
stop() {
clearTimeout(this.timeoutObj);
clearTimeout(this.serverTimeoutObj);
},
// 开启定时器
start() {
this.timeoutObj && clearTimeout(this.timeoutObj);
this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj);
// 15s之内如果没有收到后台的消息则认为是连接断开了需要重连
this.timeoutObj = setTimeout(() => {
writeToScreen("心跳检查发送ping到后台");
try {
const datas = { ping: true };
wsObj.send(JSON.stringify(datas));
} catch (err) {
writeToScreen("发送ping异常");
}
console.log("内嵌定时器this.serverTimeoutObj: ", this.serverTimeoutObj)
// 内嵌定时器
this.serverTimeoutObj = setTimeout(() => {
writeToScreen("没有收到后台的数据,重新连接");
reconnect();
}, this.timeout)
}, this.timeout)
}
}

View File

@@ -44,6 +44,7 @@ import { Message } from 'element-ui';
import LocalDataManager from './utils/local-data-manager';
// import response from './response';
import moment from 'moment';
import { parseTime } from '@/utils/ruoyi'
export default {
name: 'EquipmentFullParams',
@@ -51,9 +52,9 @@ export default {
props: {},
data() {
const now = new Date();
const [y, m, d] = [now.getFullYear(), now.getMonth(), now.getDate()];
const today = new Date(y, m, d, 0, 0, 0, 0).getTime();
const aWeekAgo = today - 3600 * 1000 * 24 * 7;
// const [y, m, d] = [now.getFullYear(), now.getMonth(), now.getDate()];
const today = new Date().getTime();
const tenminAgo = today - (10 * 60 * 1000);
return {
searchBarFormConfig: [
{
@@ -73,7 +74,7 @@ export default {
{
type: 'datePicker',
label: '时间段',
dateType: 'daterange', // datetimerange
dateType: 'datetimerange', // datetimerange
format: 'yyyy-MM-dd HH:mm:ss',
// valueFormat: 'yyyy-MM-dd HH:mm:ss',
valueFormat: 'timestamp',
@@ -94,13 +95,19 @@ export default {
],
queryParams: {
id: null,
time: [new Date(aWeekAgo), new Date(today)],
time: [tenminAgo, today],
},
tableList: [
// {
// key: 'base-table__key__1',
// tableProps: [],
// list: [],
// tableProps: [{
// prop: 'name',
// label: 'name'
// }],
// dataManager: {dataList: [{name: '1'}]},
// list: [{
// name: '11'
// }],
// pageNo: 1,
// pageSize: 3,
// total: 0,
@@ -122,6 +129,11 @@ export default {
'defaultSelect',
to.params.equipmentCode
);
vm.$set(
vm.searchBarFormConfig[2],
'defaultSelect',
vm.queryParams.time
);
vm.handleQuery();
});
} else {
@@ -268,11 +280,17 @@ export default {
async handleSearchBarBtnClick({ btnName, timeVal }) {
if (timeVal && timeVal.length > 0) {
this.queryParams.time = timeVal;
if (timeVal[1] - timeVal[0] <= 10 * 60 * 1000) {
this.queryParams.time = timeVal;
await this.handleQuery();
} else {
this.$message.warning('时间范围最大一小时限制!')
}
} else {
this.queryParams.time = [];
this.$message.warning('时间段必选!')
}
await this.handleQuery();
},
handleEmitFun(table, val) {
@@ -295,9 +313,12 @@ export default {
}
.tables {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 18px;
/* display: grid; */
/* grid-template-columns: 1fr 1fr; */
/* gap: 18px; */
display: flex;
flex-direction: column;
width: 100%;
}
.tables >>> .baseTable {
@@ -306,5 +327,6 @@ export default {
.custom-table {
overflow-x: hidden;
margin-bottom: 10px;
}
</style>

View File

@@ -170,19 +170,19 @@ export default {
{ width: 256, prop: 'code', label: '设备编码' },
{ prop: 'location', label: '位置' },
{ prop: 'responsiblePeopleName', label: '负责人' },
{ prop: 'dueDate', label: '有效期至' },
{ prop: 'dueTime', label: '有效期至' },
{ prop: 'remark', label: '备注' },
],
searchBarFormConfig: [
{
type: 'input',
label: '名称',
label: '设备名称',
placeholder: '请输入设备名称',
param: 'name',
},
{
type: 'input',
label: '编码',
label: '设备编码',
placeholder: '请输入设备编码',
param: 'code',
},
@@ -251,7 +251,7 @@ export default {
{
datetime: true,
label: '有效期至',
prop: 'dueDate',
prop: 'dueTime',
bind: { clearable: true },
},
{},

View File

@@ -175,13 +175,13 @@ export default {
searchBarFormConfig: [
{
type: 'input',
label: '名称',
label: '设备名称',
placeholder: '请输入设备名称',
param: 'name',
},
{
type: 'input',
label: '编码',
label: '设备编码',
placeholder: '请输入设备编码',
param: 'code',
},

View File

@@ -50,10 +50,16 @@
</el-col>
<el-col :span="8">
<el-form-item label="设备名称" prop="equipmentId">
<el-form-item
label="设备名称"
prop="equipmentId"
:rules="[
{ required: true, message: '设备不能为空', trigger: 'blur' },
]">
<el-select
v-model="dataForm.equipmentId"
filterable
clearable
:disabled="isdetail"
style="width: 100%"
placeholder="请选择设备名称"
@@ -70,10 +76,16 @@
<!-- <el-form-item label="物料名称" prop="name">
<el-input v-model="dataForm.name" :disabled="isdetail" clearable placeholder="请输入物料名称" />
</el-form-item> -->
<el-form-item label="巡检配置名称" prop="configId">
<el-form-item
label="巡检配置名称"
prop="configId"
:rules="[
{ required: true, message: '巡检配置不能为空', trigger: 'blur' },
]">
<el-select
v-model="dataForm.configId"
filterable
clearable
:disabled="isdetail"
style="width: 100%"
placeholder="请选择巡检配置"
@@ -121,6 +133,7 @@
<el-select
v-model="dataForm.origin"
filterable
clearable
:disabled="isdetail"
style="width: 100%"
placeholder="请选择数据来源">

View File

@@ -353,7 +353,7 @@ export default {
queryData.createTime = this.queryParams.createTime;
}
this.$router.push({
path: '/equipment/base/maintain/record',
path: '/safety-environmental/special-equipment/equipment-maintain/maintain-record',
query: queryData,
});
// this.$router.push({ path: '/equipment/base/maintain/record', query: { orderNo: row.orderNo }})

View File

@@ -556,6 +556,19 @@ export default {
this.form.relatePlan = tempRow.nextMaintainTime ? 1 : 2;
this.form.startTime = tempRow.nextMaintainTime;
this.form.maintainPlanId = tempRow.id;
// await (() => {
// return new Promise((acpt, rejt) => {
// this.form.relatePlan =
// this.$route.query.relatePlan ||
// (tempRow.nextMaintainTime ? 1 : 2);
// this.form.startTime = tempRow.nextMaintainTime;
// acpt();
// });
// })();
// this.$nextTick(() => {
// this.form.maintainPlanId = tempRow.id;
// this.form.equipmentId = tempRow.equipmentId;
// });
}
if (this.$route.query.isAdd) {
// 赋值

View File

@@ -32,11 +32,11 @@
<el-table v-if="refreshTable" v-loading="loading" :data="menuList" row-key="id" :default-expand-all="isExpandAll"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}">
<el-table-column prop="name" label="菜单名称" :show-overflow-tooltip="true" width="250"></el-table-column>
<el-table-column prop="icon" label="图标" align="center" width="100">
<!-- <el-table-column prop="icon" label="图标" align="center" width="100">
<template v-slot="scope">
<svg-icon :icon-class="scope.row.icon" />
</template>
</el-table-column>
</el-table-column> -->
<el-table-column prop="sort" label="排序" width="60"></el-table-column>
<el-table-column prop="permission" label="权限标识" :show-overflow-tooltip="true" />
<el-table-column prop="component" label="组件路径" :show-overflow-tooltip="true" />
@@ -76,7 +76,7 @@
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="24">
<!-- <el-col :span="24">
<el-form-item v-if="form.type !== 3" label="菜单图标">
<el-popover placement="bottom-start" width="460" trigger="click" @show="$refs['iconSelect'].reset()">
<IconSelect ref="iconSelect" @selected="selected" />
@@ -87,7 +87,7 @@
</el-input>
</el-popover>
</el-form-item>
</el-col>
</el-col> -->
<el-col :span="12">
<el-form-item label="菜单名称" prop="name">
<el-input v-model="form.name" placeholder="请输入菜单名称" />
@@ -263,9 +263,9 @@ export default {
},
methods: {
// 选择图标
selected(name) {
this.form.icon = name;
},
// selected(name) {
// this.form.icon = name;
// },
/** 查询菜单列表 */
getList() {
this.loading = true;
@@ -305,7 +305,7 @@ export default {
id: undefined,
parentId: 0,
name: undefined,
icon: undefined,
// icon: undefined,
type: SystemMenuTypeEnum.DIR,
sort: undefined,
status: CommonStatusEnum.ENABLE,