projects/mesxc-zjl #139

マージ済み
juzi が 2 個のコミットを projects/mesxc-zjl から projects/mesxc-test へマージ 2023-12-12 10:57:13 +08:00
23個のファイルの変更3185行の追加1018行の削除

ファイルの表示

@ -20,7 +20,7 @@ VUE_APP_BASE_API = 'http://192.168.0.33:48082'
# VUE_APP_BASE_API = 'http://192.168.1.8:48082'
# VUE_APP_BASE_API = 'http://192.168.4.159:48080'
# VUE_APP_BASE_API = 'http://192.168.1.56:48082'
# VUE_APP_BASE_API = 'http://192.168.4.159:48080'
# VUE_APP_BASE_API = 'http://192.168.1.62:48082'
# 积木报表指向地址
VUE_APP_JIMU_API = 'http://192.168.0.33:48082'

92
src/api/safetyEnvironmental/environmental.js ノーマルファイル
ファイルの表示

@ -0,0 +1,92 @@
import request from '@/utils/request'
// 获得环保检测指标实时数据
export function environmentalCheckRealtime(query) {
return request({
url: '/base/environmental-check/realtime',
method: 'get',
params: query
})
}
// 获得环保检测指标趋势数据
export function environmentalCheckRealtimeTrend(data) {
return request({
url: '/base/environmental-check-record/trend',
method: 'post',
data: data
})
}
// 获得环保检测指标分页
export function environmentalCheckPage(query) {
return request({
url: '/base/environmental-check/page',
method: 'get',
params: query
})
}
// 创建环保检测指标
export function environmentalCheckCreate(data) {
return request({
url: '/base/environmental-check/create',
method: 'post',
data: data
})
}
// 更新环保检测指标
export function environmentalCheckUpdate(data) {
return request({
url: '/base/environmental-check/update',
method: 'put',
data: data
})
}
// 获得环保检测指标
export function environmentalCheckGet(query) {
return request({
url: '/base/environmental-check/get',
method: 'get',
params: query
})
}
// 删除环保检测指标
export function environmentalCheckDelete(query) {
return request({
url: '/base/environmental-check/delete',
method: 'delete',
params: query
})
}
// 获得环保检测记录分页
export function environmentalCheckRecordPage(data) {
return request({
url: '/base/environmental-check-record/page',
method: 'post',
data: data
})
}
// 导出环保检测记录 Excel
export function environmentalCheckRecordExport(data) {
return request({
url: '/base/environmental-check-record/export-excel',
method: 'post',
data: data,
responseType: 'blob'
})
}
// 获取环保检测指标code
export function getEnvironmentalCheckCode(query) {
return request({
url: '/base/environmental-check/getCode',
method: 'get',
params: query
})
}

バイナリ
src/assets/images/detectionData.png ノーマルファイル

バイナリファイルは表示されません。

変更後

幅:  |  高さ:  |  サイズ: 1.6 KiB

ファイルの表示

@ -106,6 +106,9 @@ export const DICT_TYPE = {
// ============== EQUIPMENT - 设备模块 =============
MAINTAIN_TYPE: 'maintain_type',
FAULT_LEVEL: 'fault-level',
// ============== ENVIRONMENTAL - 环保模块 =============
ENVIRONMENT_CHECK_UNIT: 'environment_check_unit'
}
/**

ファイルの表示

@ -221,18 +221,30 @@ export default {
timeSelect() {
switch (this.queryParams.timeDim) {
case '1':
if (!this.timeValue) {
this.$modal.msgError('时间范围不能为空')
return false
}
if (this.timeValue[1] - this.timeValue[0] > 7*24*3600000) {
this.$modal.msgError('最大时间范围为7天请重新选择')
this.timeValue = []
}
break
case '2':
if (!this.dateValue) {
this.$modal.msgError('时间范围不能为空')
return false
}
if (this.dateValue[1] - this.dateValue[0] > 29*24*3600000) {
this.$modal.msgError('最大时间范围为30天请重新选择') // 0:00:0023:59:59
this.dateValue = []
}
break
case '4':
if (!this.monthValue) {
this.$modal.msgError('时间范围不能为空')
return false
}
if (this.monthValue[1] - this.monthValue[0] > 729*24*3600000) {
this.$modal.msgError('最大时间范围为24个月请重新选择')//
this.monthValue = []
@ -338,7 +350,7 @@ export default {
}
switch (this.queryParams.timeDim) {
case '1':
if (this.timeValue.length > 0) {
if (this.timeValue && this.timeValue.length > 0) {
this.queryParams.startTime = this.timeValue[0]
this.queryParams.endTime = this.timeValue[1] //
} else {

ファイルの表示

@ -8,7 +8,6 @@
<script>
import * as echarts from 'echarts'
import resize from '@/utils/chartMixins/resize'
import moment from 'moment'
export default {
name: "LineChart",
mixins: [resize],

ファイルの表示

@ -207,18 +207,30 @@ export default {
timeSelect() {
switch (this.queryParams.timeDim) {
case '1':
if (!this.timeValue) {
this.$modal.msgError('时间范围不能为空')
return false
}
if (this.timeValue[1] - this.timeValue[0] > 7*24*3600000) {
this.$modal.msgError('最大时间范围为7天请重新选择')
this.timeValue = []
}
break
case '2':
if (!this.dateValue) {
this.$modal.msgError('时间范围不能为空')
return false
}
if (this.dateValue[1] - this.dateValue[0] > 29*24*3600000) {
this.$modal.msgError('最大时间范围为30天请重新选择') // 0:00:0023:59:59
this.dateValue = []
}
break
case '4':
if (!this.monthValue) {
this.$modal.msgError('时间范围不能为空')
return false
}
if (this.monthValue[1] - this.monthValue[0] > 729*24*3600000) {
this.$modal.msgError('最大时间范围为24个月请重新选择')//
this.monthValue = []
@ -307,7 +319,7 @@ export default {
}
switch (this.queryParams.timeDim) {
case '1':
if (this.timeValue.length > 0) {
if (this.timeValue && this.timeValue.length > 0) {
this.queryParams.startTime = this.timeValue[0]
this.queryParams.endTime = this.timeValue[1] //
} else {
@ -316,7 +328,7 @@ export default {
}
break
case '2':
if (this.dateValue.length > 0) {
if (this.dateValue && this.dateValue.length > 0) {
this.queryParams.startTime = this.dateValue[0]
this.queryParams.endTime = this.dateValue[1] + 86399000 // 23:59:59
} else {
@ -336,7 +348,7 @@ export default {
}
break
case '4'://
if (this.monthValue.length > 0) {
if (this.monthValue && this.monthValue.length > 0) {
this.queryParams.startTime = this.monthValue[0]
this.queryParams.endTime = this.transformTime(this.monthValue[1])
} else {

ファイルの表示

@ -175,7 +175,7 @@ export default {
btnName: '删除'
}
: undefined
],
].filter((v)=>v),
//
queryParams: {
pageNo: 1,

ファイルの表示

@ -0,0 +1,150 @@
<template>
<div
id="wasteWaterLine"
style="width: 100%"
:style="{ height: chartHeight + 'px' }"
></div>
</template>
<script>
import * as echarts from 'echarts'
import resize from '@/utils/chartMixins/resize'
export default {
name: "LineChart",
mixins: [resize],
data() {
return {
chartDom: '',
chart: '',
chartHeight: this.tableHeight(420)
}
},
props: {
chartData: {
type: Object,
required: true,
default: () => {
return {}
}
},
timeDim: {
type: String,
default: ''
}
},
mounted() {
window.addEventListener('resize', () => {
this.chartHeight = this.tableHeight(420)
})
this.getChart()
},
watch: {
chartData: function () {
this.getChart()
}
},
methods: {
getChart() {
if (
this.chart !== null &&
this.chart !== '' &&
this.chart !== undefined
) {
this.chart.dispose() // Dom
}
this.chartDom = document.getElementById('wasteWaterLine');
this.chart = echarts.init(this.chartDom);
if (Object.keys(this.chartData).length === 0) {
return false
}
let legendData = []
let xData = []
let seriesData = []
for (let item in this.chartData) {
legendData.push(item)
let obj = {}
let data = []
for (let subItem in this.chartData[item]) {
data.push(this.chartData[item][subItem].checkValue)
}
obj.name = item
obj.type = 'line'
obj.stack = 'Total'
obj.symbol = 'none'
obj.data = data
seriesData.push(obj)
}
for (let i = 0; i < this.chartData[legendData[0]].length; i++) {
let time = ""
if (this.timeDim === '3') {
let year = this.chartData[legendData[0]][i].axisTime.slice(0,4)
let weak = this.chartData[legendData[0]][i].axisTime.slice(6,8)
time = year+' 第 '+weak+' 周'
} else {
time = this.chartData[legendData[0]][i].axisTime
}
xData.push(time)
}
var option = {
color: ['#63BDFF', '#7164FF', '#FF6860', '#FF9747', '#B0EB42', '#D680FF', '#0043D2'],
tooltip: {
trigger: 'axis',
formatter: function (params) {
return (
params[0].axisValue +
`<br>` +
params
.map((item) => {
let str = `<span style="display:inline-block;width:8px;height:8px;margin: 0 8px 0 -3px;border-radius:2px;background-color:${item.color};"></span>`;
let seriesNameStr = `<span style="display:inline-block;">${item.seriesName}</span>`;
let value = item.value ? item.value : '-';
let valueStr = `<span style="display:inline-block;margin-left:10px;color:rgba(0,0,0,0.45);">${value}</span>`;
return `<span style="display:flex; justify-content:space-between; margin-bottom: 2px">
<span>${str}${seriesNameStr}</span>
<span>${valueStr}</span>
</span>`;
})
.join(``)
);
}
},
legend: {
data: legendData,
right: '2%',
icon: 'rect',
itemHeight: 8,
itemWidth: 8,
textStyle: {
color: 'auto'
}
},
grid: {
left: '3%',
right: '2%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'category',
boundaryGap: false,
data: xData,
axisLabel: {
rotate: "45"
}
},
yAxis: {
type: 'value'
},
axisPointer: {
type: 'line',
lineStyle: {
color: 'rgba(11, 88, 255, 1)'
}
},
series: seriesData
};
option && this.chart.setOption(option);
}
}
}
</script>

ファイルの表示

@ -0,0 +1,378 @@
<template>
<div class="searchBarBox divHeight" ref="searchBarRef">
<el-form :inline="true" class="demo-form-inline">
<el-form-item label="时间维度" required>
<el-select v-model="queryParams.timeDim" placeholder="请选择" style="width: 80px;" size="small">
<el-option
v-for="item in getDictDatas(this.DICT_TYPE.TIME_DIM)"
:key="item.value"
:label="item.label"
:value="item.value"
size="small">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="时间范围" required>
<div v-show="queryParams.timeDim === '1'">
<el-date-picker
v-model="timeValue"
type="datetimerange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
format="yyyy-MM-dd HH:mm"
value-format="timestamp"
:picker-options="pickerOptions"
popper-class="noneMinute"
@change="timeSelect"
size="small"
style='width:350px;'
>
</el-date-picker>
</div>
<div v-show="queryParams.timeDim === '2'">
<el-date-picker
v-model="dateValue"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="timestamp"
:picker-options="pickerOptions"
@change="timeSelect"
size="small"
style='width:350px;'
>
</el-date-picker>
</div>
<div v-show="queryParams.timeDim === '3'">
<el-date-picker
v-model="weekValue1"
type="week"
format="yyyy 第 WW 周"
style='width:170px;'
:picker-options="pickerOptionsWeek"
@change="startWeek"
size="small"
placeholder="选择周">
</el-date-picker>-
<el-date-picker
v-model="weekValue2"
type="week"
format="yyyy 第 WW 周"
:picker-options="pickerOptionsWeek"
style='width:170px;'
@change="endWeek"
size="small"
placeholder="选择周">
</el-date-picker>
</div>
<div v-show="queryParams.timeDim === '4'">
<el-date-picker
v-model="monthValue"
type="monthrange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="timestamp"
:picker-options="pickerOptions"
size="small"
style='width:350px;'
@change="timeSelect"
>
</el-date-picker>
</div>
<div v-show="queryParams.timeDim === '5'">
<el-date-picker
style='width:170px;'
v-model="yearValue1"
type="year"
:picker-options="pickerOptions"
value-format="timestamp"
placeholder="选择年"
size="small"
@change="startYear"
>
</el-date-picker>-
<el-date-picker
style='width:170px;'
v-model="yearValue2"
type="year"
:picker-options="pickerOptions"
value-format="timestamp"
placeholder="选择年"
size="small"
@change="endYear"
>
</el-date-picker>
</div>
</el-form-item>
<el-form-item>
<el-button type="primary" size="small" @click="search">查询</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import moment from 'moment'
export default {
name: 'SearchArea',
data() {
return {
//
queryParams: {
timeDim: null,
startTime: null,
endTime: null
},
timeValue: [],// 7
dateValue: [],// 30
weekValue1: null,//24
weekValue2: null,
monthValue: [],//24
yearValue1: null,//10
yearValue2: null,
pickerOptions: {
disabledDate(date) {
return date.getTime() > Date.now()
}
},
pickerOptionsWeek: {
disabledDate(time) {
let day = Date.now()
let limitTime = moment(day).day(-1)
return time.getTime() > new Date(limitTime).getTime()
}
}
}
},
mounted() {
this.queryParams.timeDim = this.getDictDatas(this.DICT_TYPE.TIME_DIM)[0].value //
this.timeValue = [moment().startOf('day'), moment().endOf('day')-59*61*1000]
},
methods: {
//
timeSelect() {
switch (this.queryParams.timeDim) {
case '1':
if (!this.timeValue) {
this.$modal.msgError('时间范围不能为空')
return false
}
if (this.timeValue[1] - this.timeValue[0] > 7*24*3600000) {
this.$modal.msgError('最大时间范围为7天请重新选择')
this.timeValue = []
}
break
case '2':
if (!this.dateValue) {
this.$modal.msgError('时间范围不能为空')
return false
}
if (this.dateValue[1] - this.dateValue[0] > 29*24*3600000) {
this.$modal.msgError('最大时间范围为30天请重新选择') // 0:00:0023:59:59
this.dateValue = []
}
break
case '4':
if (!this.monthValue) {
this.$modal.msgError('时间范围不能为空')
return false
}
if (this.monthValue[1] - this.monthValue[0] > 729*24*3600000) {
this.$modal.msgError('最大时间范围为24个月请重新选择')//
this.monthValue = []
}
break
default:
}
},
//
startYear() {
if (this.yearValue2 && this.yearValue2 < this.yearValue1) {
this.$modal.msgError('开始时间不能晚于结束时间,请重新选择')
this.yearValue1 = null
return false
}
if (this.yearValue1 && this.yearValue2) {
if (this.yearValue2 - this.yearValue1 > 10*365*24*3600000) {
this.$modal.msgError('最大时间范围为10年请重新选择')
this.yearValue1 = null
return false
}
}
},
endYear() {
if (this.yearValue2 && this.yearValue2 < this.yearValue1) {
this.$modal.msgError('结束时间不能早于开始时间,请重新选择')
this.yearValue2 = null
return false
}
if (this.yearValue1 && this.yearValue2) {
if (this.yearValue2 - this.yearValue1 > 10*365*24*3600000) {
this.$modal.msgError('最大时间范围为10年请重新选择')
this.yearValue2 = null
return false
}
}
},
//
startWeek() {
if (this.weekValue1 && this.weekValue2) {
let a = new Date(this.weekValue1).getTime()
let b = new Date(this.weekValue2).getTime()
if (a > b) {
this.$modal.msgError('开始时间不能晚于结束时间,请重新选择')
this.weekValue1 = null
return false
}
if (b - a > 167*24*3600000) {
this.$modal.msgError('最大时间范围为24周请重新选择')
this.weekValue1 = null
return false
}
}
},
endWeek() {
if (this.weekValue1 && this.weekValue2) {
let a = new Date(this.weekValue1).getTime()
let b = new Date(this.weekValue2).getTime()
if (a > b) {
this.$modal.msgError('结束时间不能早于开始时间,请重新选择')
this.weekValue2 = null
return false
}
if (b - a > 167*24*3600000) {
this.$modal.msgError('最大时间范围为24周请重新选择')
this.weekValue2 = null
return false
}
}
},
//
search() {
if (!this.queryParams.timeDim) {
this.$modal.msgError('请选择时间维度')
return false
}
switch (this.queryParams.timeDim) {
case '1':
if (this.timeValue && this.timeValue.length > 0) {
this.queryParams.startTime = this.timeValue[0]
this.queryParams.endTime = this.timeValue[1] //
} else {
this.$modal.msgError('时间范围不能为空')
return false
}
break
case '2':
if (this.dateValue && this.dateValue.length > 0) {
this.queryParams.startTime = this.dateValue[0]
this.queryParams.endTime = this.dateValue[1] + 86399000 // 23:59:59
} else {
this.$modal.msgError('日范围不能为空')
return false
}
break
case '3':
if (this.weekValue1 && this.weekValue2) {
let a = moment(this.weekValue1).day(0).format('YYYY-MM-DD') + ' 00:00:00'
let b = moment(this.weekValue2).day(6).format('YYYY-MM-DD') + ' 23:59:59'
this.queryParams.startTime = new Date(a).getTime()
this.queryParams.endTime = new Date(b).getTime()
} else {
this.$modal.msgError('周范围不能为空')
return false
}
break
case '4'://
if (this.monthValue && this.monthValue.length > 0) {
this.queryParams.startTime = this.monthValue[0]
this.queryParams.endTime = this.transformTime(this.monthValue[1])
} else {
this.$modal.msgError('月范围不能为空')
return false
}
break
default://
if (this.yearValue1 && this.yearValue2) {
if (this.yearValue2 < this.yearValue1) {
this.$modal.msgError('结束时间不能早于开始时间')
return false
} else {
this.queryParams.startTime = this.yearValue1
this.queryParams.endTime = this.transformYear(this.yearValue2)
}
} else {
this.$modal.msgError('年范围不能为空')
return false
}
}
this.queryParams.startTime = this.queryParams.startTime + ''
this.queryParams.endTime = this.queryParams.endTime + ''
this.$emit('submit', this.queryParams)
},
transformTime(timeStamp) {//
let year = moment(timeStamp).format('YYYY')
let month = moment(timeStamp).format('MM')
let newData = moment(new Date(year,month,0)).format('YYYY-MM-DD') + ' 23:59:59'
let value = new Date(newData).getTime()
return value
},
transformYear(timeStamp) {//
let year = moment(timeStamp).format('YYYY')
let newData = year+'-12-31 23:59:59'
let value = new Date(newData).getTime()
return value
}
}
}
</script>
<style lang='scss'>
/* 级联选择器 */
.cascaderParent .el-cascader-panel .el-scrollbar:first-child .el-radio {
display: none;
}
/* 时间整点 */
.noneMinute .el-time-spinner__wrapper {
width: 100%;
}
.noneMinute .el-scrollbar:nth-of-type(2) {
display: none;
}
.demo-form-inline {
.el-date-editor .el-range__icon {
font-size: 16px;
color: #0B58FF;
}
.el-input__prefix .el-icon-date {
font-size: 16px;
color: #0B58FF;
}
}
</style>
<style lang="scss" scoped>
.searchBarBox .foldClass {
position: absolute;
top: 14px;
right: 0;
cursor: pointer;
font-size: 12px;
color:#0B58FF;
}
.searchBarBox .foldClass .iconfont {
font-size: 14px;
}
.divHeight {
height: 45px;
overflow: hidden;
}
.separateStyle {
display: inline-block;
width: 1px;
height: 24px;
background: #E8E8E8;
vertical-align: middle;
margin: 0 10px;
}
</style>

ファイルの表示

@ -1,8 +1,185 @@
<template>
<div>vocDetectionHistory</div>
<div class="app-container vocHis">
<!-- 搜索工作栏 -->
<search-bar
:formConfigs="formConfig"
ref="searchBarForm"
@headBtnClick="buttonClick"
/>
<!-- 列表 -->
<base-table
:page="queryParams.pageNo"
:limit="queryParams.pageSize"
:table-props="tableProps"
:table-data="list"
:max-height="tableH"
:row-class-name="tableRowClassName"
/>
<pagination
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
:total="total"
@pagination="getList"
/>
</div>
</template>
<script>
import { publicFormatter } from '@/utils/dict'
import { parseTime } from '@/utils/ruoyi'
import { environmentalCheckRecordPage, environmentalCheckRecordExport, environmentalCheckPage } from '@/api/safetyEnvironmental/environmental'
import moment from 'moment'
const tableProps = [
{
prop: 'checkName',
label: '指标名称'
},
{
prop: 'checkValue',
label: '检测数值'
},
{
prop: 'unit',
label: '单位',
filter: publicFormatter('environment_check_unit')
},
{
prop: 'checkTime',
label: '检测时间',
filter: parseTime,
minWidth: 160
},
{
prop: 'origin',
label: '来源',
filter: (val) => ['手动', '自动'][val]
},
{
prop: 'recordPerson',
label: '录入人'
},
{
prop: 'recordTime',
label: '录入时间',
filter: parseTime,
minWidth: 160
}
]
export default {
name: 'VocDetectionHistory'
name: 'VocDetectionHistory',
data() {
return {
formConfig: [
{
type: 'select',
label: '指标名称',
selectOptions: [],
param: 'checkId',
filterable: true
},
{
type: 'datePicker',
label: '时间',
dateType: 'datetimerange',
format: 'yyyy-MM-dd HH:mm:ss',
valueFormat: "timestamp",
rangeSeparator: '-',
startPlaceholder: '开始时间',
endPlaceholder: '结束时间',
param: 'timeVal',
defaultSelect: [],
width: 350
},
{
type: 'button',
btnName: '查询',
name: 'search',
color: 'primary'
},
{
type: this.$auth.hasPermi('base:voc:export') ? 'separate' : '',
},
{
type: this.$auth.hasPermi('base:voc:export') ? 'button' : '',
btnName: '导出',
name: 'export',
color: 'primary',
plain: true
}
],
//
queryParams: {
pageNo: 1,
pageSize: 20,
checkId: null,
checkType: 3,
startTime: null,
endTime: null
},
tableProps,
list: [],
total: 0,
tableH: this.tableHeight(260)
}
},
created() {
window.addEventListener('resize', () => {
this.tableH = this.tableHeight(260)
})
let end = moment(moment().format('YYYY-MM-DD 23:59:59')).valueOf()
let start = moment(moment().format('YYYY-MM-DD 00:00:00')).valueOf()
this.formConfig[1].defaultSelect = [start, end]
this.queryParams.startTime = start
this.queryParams.endTime = end
this.getSelectList()
this.getList()
},
methods: {
buttonClick(val) {
this.queryParams.pageNo = 1;
this.queryParams.checkId = val.checkId
this.queryParams.startTime = val.timeVal ? val.timeVal[0] : null
this.queryParams.endTime = val.timeVal ? val.timeVal[1] : null
if (val.btnName === 'search') {
this.getList()
} else {
this.$modal.confirm('是否确认导出').then(() => {
return environmentalCheckRecordExport({...this.queryParams});
}).then(response => {
this.$download.excel(response, '废水检测历史记录.xls');
}).catch(() => {})
}
},
getList() {
environmentalCheckRecordPage({...this.queryParams}).then(res => {
this.list = res.data.list || []
this.total = res.data.total || 0
})
},
getSelectList() {
environmentalCheckPage({
pageNo: 1,
pageSize: 100,
checkType: 3
}).then(res => {
console.log(res)
this.formConfig[0].selectOptions = res.data.list || []
})
},
tableRowClassName({row, rowIndex}) {
console.log(row)
if (row.markRed) {
return 'warning-row'
}else {
return ''
}
}
}
}
</script>
</script>
<style lang='scss'>
.vocHis {
.el-table .warning-row {
background: #fee1e1;
}
}
</style>

ファイルの表示

@ -0,0 +1,124 @@
<template>
<el-form ref="vocAddForm" :rules="rules" label-width="80px" :model="form">
<el-row :gutter="20">
<el-col :span='12'>
<el-form-item label="指标名称" prop="name">
<el-input v-model="form.name" :disabled='isEdit'></el-input>
</el-form-item>
</el-col>
<el-col :span='12'>
<el-form-item label="指标编码" prop="code">
<el-input v-model="form.code"></el-input>
</el-form-item>
</el-col>
<el-col :span='12'>
<el-form-item label="单位" prop="unit">
<el-select v-model="form.unit" placeholder="请选择" style="width: 100%;" :disabled='form.method == 2'>
<el-option
v-for="item in getDictDatas(DICT_TYPE.ENVIRONMENT_CHECK_UNIT)"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span='12'>
<el-form-item label="最小值" prop="minValue">
<el-input-number v-model="form.minValue" placeholder="最小值" :max="9999999" style="width: 100%;"></el-input-number>
</el-form-item>
</el-col>
<el-col :span='12'>
<el-form-item label="最大值" prop="maxValue">
<el-input-number v-model="form.maxValue" placeholder="最大值" :max="9999999" style="width: 100%;"></el-input-number>
</el-form-item>
</el-col>
<el-col :span='12'>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script>
import { environmentalCheckGet, environmentalCheckUpdate, environmentalCheckCreate, getEnvironmentalCheckCode } from '@/api/safetyEnvironmental/environmental'
export default {
name: 'VocAdd',
data() {
return {
form: {
id: '',
name: '',
code: '',
unit: '',
minValue: null,
maxValue: null,
remark: '',
checkType: 3
},
isEdit: false,
rules: {
name: [{ required: true, message: "指标名称不能为空", trigger: "blur" }],
code: [{ required: true, message: "指标编码不能为空", trigger: "blur" }],
// unit: [{ required: true, message: "unit", trigger: "change" }],
minValue: [{ required: true, message: "最小值不能为空", trigger: "blur" }],
maxValue: [{ required: true, message: "最大值不能为空", trigger: "blur" }]
}
}
},
methods: {
init(id) {
if (id) {
this.isEdit = true
this.form.id = id
environmentalCheckGet({id: this.form.id}).then(res => {
if (res.code === 0) {
this.form = res.data
}
})
} else {
this.isEdit = false
this.form.id = ''
//
getEnvironmentalCheckCode().then(res => {
this.form.code = res.data || ''
})
}
},
submitForm() {
this.$refs['vocAddForm'].validate((valid) => {
if (valid) {
if (this.form.minValue > this.form.maxValue) {
this.$modal.msgError('最小值不能大于最大值')
return false
}
console.log(this.form)
if (this.isEdit) {
//
environmentalCheckUpdate({ ...this.form }).then((res) => {
if (res.code === 0) {
this.$modal.msgSuccess("操作成功");
this.$emit('successSubmit')
}
})
} else {
environmentalCheckCreate({ ...this.form }).then((res) => {
if (res.code === 0) {
this.$modal.msgSuccess("操作成功");
this.$emit('successSubmit')
}
})
}
} else {
return false
}
})
},
formClear() {
this.$refs.vocAddForm.resetFields()
this.isEdit = false
}
}
}
</script>

ファイルの表示

@ -1,8 +1,205 @@
<template>
<div>vocDetectionIndication</div>
<div class="app-container">
<!-- 搜索工作栏 -->
<search-bar
:formConfigs="formConfig"
ref="searchBarForm"
@headBtnClick="buttonClick"
/>
<!-- 列表 -->
<base-table
:page="queryParams.pageNo"
:limit="queryParams.pageSize"
:table-props="tableProps"
:table-data="list"
:max-height="tableH"
>
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
:width="80"
label="操作"
:method-list="tableBtn"
@clickBtn="handleClick"
/>
</base-table>
<pagination
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
:total="total"
@pagination="getList"
/>
<!-- 新增&编辑 -->
<base-dialog
:dialogTitle="addOrEditTitle"
:dialogVisible="centervisible"
@cancel="handleCancel"
@confirm="handleConfirm"
:before-close="handleCancel"
width='60%'
>
<voc-add ref="vocAdd" @successSubmit="successSubmit" />
</base-dialog>
</div>
</template>
<script>
import { parseTime } from '@/utils/ruoyi'
import VocAdd from './components/vocAdd'
import { publicFormatter } from '@/utils/dict'
import { environmentalCheckPage, environmentalCheckDelete } from '@/api/safetyEnvironmental/environmental'
const tableProps = [
{
prop: 'name',
label: '指标名称',
minWidth: 120,
showOverflowtooltip: true
},
{
prop: 'code',
label: '指示编码',
minWidth: 120
},
{
prop: 'unit',
label: '单位',
filter: publicFormatter('environment_check_unit')
},
{
prop: 'minValue',
label: '最小值'
},
{
prop: 'maxValue',
label: '最大值'
},
{
prop: 'creator',
label: '创建人'
},
{
prop: 'createTime',
label: '创建时间',
filter: parseTime,
minWidth: 160
}
]
export default {
name: 'VocDetectionIndication'
name: 'VocDetectionIndication',
data() {
return {
formConfig: [
{
type: 'input',
label: '指标名称',
placeholder: '指标名称',
param: 'name'
},
{
type: 'button',
btnName: '查询',
name: 'search',
color: 'primary'
},
{
type: this.$auth.hasPermi('base:voc:create') ? 'separate' : '',
},
{
type: this.$auth.hasPermi('base:voc:create') ? 'button' : '',
btnName: '新增',
name: 'add',
color: 'success',
plain: true
}
],
//
queryParams: {
pageNo: 1,
pageSize: 20,
checkType: 3,
name: null
},
total: 0,
tableProps,
list: [],
tableH: this.tableHeight(260),
tableBtn: [
this.$auth.hasPermi('base:voc:update')
? {
type: 'edit',
btnName: '编辑'
}
: undefined,
this.$auth.hasPermi('base:voc:delete')
? {
type: 'delete',
btnName: '删除'
}
: undefined
].filter((v)=>v),
addOrEditTitle: '',
centervisible: false
}
},
components: { VocAdd },
mounted() {
this.getList()
},
methods: {
getList() {
environmentalCheckPage({...this.queryParams}).then(res => {
this.list = res.data.list || []
this.total = res.data.total || 0
})
},
buttonClick(val) {
console.log(val)
if (val.btnName === 'search') {
this.queryParams.name = val.name
this.getList()
} else {
this.addOrEditTitle = '新增'
this.centervisible = true
this.$nextTick(() => {
this.$refs.vocAdd.init()
})
}
},
handleClick(val) {
console.log(val)
switch (val.type) {
case 'edit':
this.addOrEditTitle = '编辑'
this.centervisible = true
this.$nextTick(() => {
this.$refs.vocAdd.init(val.data.id)
})
break
default:
this.handleDelete(val.data)
}
},
//
handleDelete(val) {
this.$modal.confirm('是否确认删除"' + val.name + '"的数据项?').then(function() {
return environmentalCheckDelete({ id: val.id })
}).then(() => {
this.getList();
this.$modal.msgSuccess("操作成功");
}).catch(() => {});
},
//
handleCancel() {
this.$refs.vocAdd.formClear()
this.centervisible = false
this.addOrEditTitle = ''
},
handleConfirm() {
this.$refs.vocAdd.submitForm()
},
successSubmit() {
this.handleCancel()
this.getList()
}
}
}
</script>

ファイルの表示

@ -1,8 +1,152 @@
<template>
<div>voc</div>
<div class="voc">
<div class="box1">
<div class="boxTitle">
<span class="blueTitle"></span>
<span>检测指标实时数据</span>
</div>
<div class="itemBox">
<div class="itemBox">
<div class="itemClass" v-for="(item, index) in realtimeList" :key='index'>
<div class="itemSub">
<p class="itemNum">{{item.checkValue}}</p>
<p class="itemDescribe">
<img src="./../../../../../assets/images/detectionData.png" alt="">
{{item.name}}</p>
</div>
</div>
</div>
</div>
</div>
<div class="box2">
<div class="boxTitle">
<span class="blueTitle"></span>
<span>检测指标趋势图</span>
</div>
<!-- 搜索工作栏 -->
<search-area @submit="getTrend"/>
<line-chart :chartData="chartData" v-show='Object.keys(chartData).length !== 0' :timeDim="queryParams.timeDim"/>
<!-- 没有数据 -->
<div class="no-data-bg" v-show='Object.keys(chartData).length === 0'></div>
</div>
</div>
</template>
<script>
import { environmentalCheckRealtime, environmentalCheckRealtimeTrend } from '@/api/safetyEnvironmental/environmental'
import LineChart from './../../components/lineChart'
import SearchArea from './../../components/searchArea'
export default {
name: 'Voc'
name: 'Voc',
data(){
return {
realtimeList:[],
queryParams:{
checkType: 1,
timeDim: null,
timeRange: []
},
chartData: {}
}
},
components: { LineChart, SearchArea },
mounted() {
this.getMsg()
},
methods: {
getMsg() {
environmentalCheckRealtime({checkType: 3}).then(res => {
console.log(res)
this.realtimeList = res.data || []
})
},
getTrend(params) {
console.log(params)
this.queryParams.timeDim = params.timeDim
this.queryParams.timeRange[0] = params.startTime
this.queryParams.timeRange[1] = params.endTime
environmentalCheckRealtimeTrend({...this.queryParams}).then(res => {
console.log(res)
if (res.code === 0) {
this.chartData = res.data
} else {
this.chartData = {}
}
})
}
}
}
</script>
</script>
<style lang='scss' scoped>
.voc {
background-color: #f2f4f9;
.box1 {
height: 172px;
padding: 12px 16px 0;
margin-bottom: 8px;
background-color: #fff;
border-radius: 9px;
.itemBox {
display: flex;
flex-flow: row nowrap;
overflow: auto;
.itemClass {
width: 198px;
height: 88px;
// border: 1px solid green;
padding: 12px 0px 12px 18px;
.itemSub {
width: 176px;
height: 65px;
padding-right: 26px;
border-right: 1px solid #E8E8E8;
P{
margin: 0;
img {
width: 24px;
height: 24px;
vertical-align: middle;
}
}
.itemNum {
font-size: 32px;
font-weight: 600;
height: 43px;
color: #3E6AF7;
text-align: right;
}
.itemDescribe {
font-size: 16px;
text-align: right;
}
}
}
}
.itemClass:last-child > .itemSub{
border: none !important;
}
}
.box2 {
background-color: #fff;
border-radius: 9px;
padding: 16px;
height: calc(100vh - 308px);
}
.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>

ファイルの表示

@ -1,8 +1,185 @@
<template>
<div>wasteGasDetectionHistory</div>
<div class="app-container wasteGasHis">
<!-- 搜索工作栏 -->
<search-bar
:formConfigs="formConfig"
ref="searchBarForm"
@headBtnClick="buttonClick"
/>
<!-- 列表 -->
<base-table
:page="queryParams.pageNo"
:limit="queryParams.pageSize"
:table-props="tableProps"
:table-data="list"
:max-height="tableH"
:row-class-name="tableRowClassName"
/>
<pagination
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
:total="total"
@pagination="getList"
/>
</div>
</template>
<script>
import { publicFormatter } from '@/utils/dict'
import { parseTime } from '@/utils/ruoyi'
import { environmentalCheckRecordPage, environmentalCheckRecordExport, environmentalCheckPage } from '@/api/safetyEnvironmental/environmental'
import moment from 'moment'
const tableProps = [
{
prop: 'checkName',
label: '指标名称'
},
{
prop: 'checkValue',
label: '检测数值'
},
{
prop: 'unit',
label: '单位',
filter: publicFormatter('environment_check_unit')
},
{
prop: 'checkTime',
label: '检测时间',
filter: parseTime,
minWidth: 160
},
{
prop: 'origin',
label: '来源',
filter: (val) => ['手动', '自动'][val]
},
{
prop: 'recordPerson',
label: '录入人'
},
{
prop: 'recordTime',
label: '录入时间',
filter: parseTime,
minWidth: 160
}
]
export default {
name: 'WasteGasDetectionHistory'
name: 'WasteGasDetectionHistory',
data() {
return {
formConfig: [
{
type: 'select',
label: '指标名称',
selectOptions: [],
param: 'checkId',
filterable: true
},
{
type: 'datePicker',
label: '时间',
dateType: 'datetimerange',
format: 'yyyy-MM-dd HH:mm:ss',
valueFormat: "timestamp",
rangeSeparator: '-',
startPlaceholder: '开始时间',
endPlaceholder: '结束时间',
param: 'timeVal',
defaultSelect: [],
width: 350
},
{
type: 'button',
btnName: '查询',
name: 'search',
color: 'primary'
},
{
type: this.$auth.hasPermi('base:waste-gas:export') ? 'separate' : '',
},
{
type: this.$auth.hasPermi('base:waste-gas:export') ? 'button' : '',
btnName: '导出',
name: 'export',
color: 'primary',
plain: true
}
],
//
queryParams: {
pageNo: 1,
pageSize: 20,
checkId: null,
checkType: 2,
startTime: null,
endTime: null
},
tableProps,
list: [],
total: 0,
tableH: this.tableHeight(260)
}
},
created() {
window.addEventListener('resize', () => {
this.tableH = this.tableHeight(260)
})
let end = moment(moment().format('YYYY-MM-DD 23:59:59')).valueOf()
let start = moment(moment().format('YYYY-MM-DD 00:00:00')).valueOf()
this.formConfig[1].defaultSelect = [start, end]
this.queryParams.startTime = start
this.queryParams.endTime = end
this.getSelectList()
this.getList()
},
methods: {
buttonClick(val) {
this.queryParams.pageNo = 1;
this.queryParams.checkId = val.checkId
this.queryParams.startTime = val.timeVal ? val.timeVal[0] : null
this.queryParams.endTime = val.timeVal ? val.timeVal[1] : null
if (val.btnName === 'search') {
this.getList()
} else {
this.$modal.confirm('是否确认导出').then(() => {
return environmentalCheckRecordExport({...this.queryParams});
}).then(response => {
this.$download.excel(response, '废气检测历史记录.xls');
}).catch(() => {})
}
},
getList() {
environmentalCheckRecordPage({...this.queryParams}).then(res => {
this.list = res.data.list || []
this.total = res.data.total || 0
})
},
getSelectList() {
environmentalCheckPage({
pageNo: 1,
pageSize: 100,
checkType: 2
}).then(res => {
console.log(res)
this.formConfig[0].selectOptions = res.data.list || []
})
},
tableRowClassName({row, rowIndex}) {
console.log(row)
if (row.markRed) {
return 'warning-row'
}else {
return ''
}
}
}
}
</script>
</script>
<style lang='scss'>
.wasteGasHis {
.el-table .warning-row {
background: #fee1e1;
}
}
</style>

ファイルの表示

@ -0,0 +1,124 @@
<template>
<el-form ref="wasteGasAddForm" :rules="rules" label-width="80px" :model="form">
<el-row :gutter="20">
<el-col :span='12'>
<el-form-item label="指标名称" prop="name">
<el-input v-model="form.name" :disabled='isEdit'></el-input>
</el-form-item>
</el-col>
<el-col :span='12'>
<el-form-item label="指标编码" prop="code">
<el-input v-model="form.code"></el-input>
</el-form-item>
</el-col>
<el-col :span='12'>
<el-form-item label="单位" prop="unit">
<el-select v-model="form.unit" placeholder="请选择" style="width: 100%;" :disabled='form.method == 2'>
<el-option
v-for="item in getDictDatas(DICT_TYPE.ENVIRONMENT_CHECK_UNIT)"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span='12'>
<el-form-item label="最小值" prop="minValue">
<el-input-number v-model="form.minValue" placeholder="最小值" :max="9999999" style="width: 100%;"></el-input-number>
</el-form-item>
</el-col>
<el-col :span='12'>
<el-form-item label="最大值" prop="maxValue">
<el-input-number v-model="form.maxValue" placeholder="最大值" :max="9999999" style="width: 100%;"></el-input-number>
</el-form-item>
</el-col>
<el-col :span='12'>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script>
import { environmentalCheckGet, environmentalCheckUpdate, environmentalCheckCreate, getEnvironmentalCheckCode } from '@/api/safetyEnvironmental/environmental'
export default {
name: 'WasteGasAdd',
data() {
return {
form: {
id: '',
name: '',
code: '',
unit: '',
minValue: null,
maxValue: null,
remark: '',
checkType: 2
},
isEdit: false,
rules: {
name: [{ required: true, message: "指标名称不能为空", trigger: "blur" }],
code: [{ required: true, message: "指标编码不能为空", trigger: "blur" }],
// unit: [{ required: true, message: "unit", trigger: "change" }],
minValue: [{ required: true, message: "最小值不能为空", trigger: "blur" }],
maxValue: [{ required: true, message: "最大值不能为空", trigger: "blur" }]
}
}
},
methods: {
init(id) {
if (id) {
this.isEdit = true
this.form.id = id
environmentalCheckGet({id: this.form.id}).then(res => {
if (res.code === 0) {
this.form = res.data
}
})
} else {
this.isEdit = false
this.form.id = ''
//
getEnvironmentalCheckCode().then(res => {
this.form.code = res.data || ''
})
}
},
submitForm() {
this.$refs['wasteGasAddForm'].validate((valid) => {
if (valid) {
if (this.form.minValue > this.form.maxValue) {
this.$modal.msgError('最小值不能大于最大值')
return false
}
console.log(this.form)
if (this.isEdit) {
//
environmentalCheckUpdate({ ...this.form }).then((res) => {
if (res.code === 0) {
this.$modal.msgSuccess("操作成功");
this.$emit('successSubmit')
}
})
} else {
environmentalCheckCreate({ ...this.form }).then((res) => {
if (res.code === 0) {
this.$modal.msgSuccess("操作成功");
this.$emit('successSubmit')
}
})
}
} else {
return false
}
})
},
formClear() {
this.$refs.wasteGasAddForm.resetFields()
this.isEdit = false
}
}
}
</script>

ファイルの表示

@ -1,8 +1,205 @@
<template>
<div>wasteGasDetectionIndication</div>
<div class="app-container">
<!-- 搜索工作栏 -->
<search-bar
:formConfigs="formConfig"
ref="searchBarForm"
@headBtnClick="buttonClick"
/>
<!-- 列表 -->
<base-table
:page="queryParams.pageNo"
:limit="queryParams.pageSize"
:table-props="tableProps"
:table-data="list"
:max-height="tableH"
>
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
:width="80"
label="操作"
:method-list="tableBtn"
@clickBtn="handleClick"
/>
</base-table>
<pagination
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
:total="total"
@pagination="getList"
/>
<!-- 新增&编辑 -->
<base-dialog
:dialogTitle="addOrEditTitle"
:dialogVisible="centervisible"
@cancel="handleCancel"
@confirm="handleConfirm"
:before-close="handleCancel"
width='60%'
>
<waste-gas-add ref="wasteGasAdd" @successSubmit="successSubmit" />
</base-dialog>
</div>
</template>
<script>
import { parseTime } from '@/utils/ruoyi'
import WasteGasAdd from './components/wasteGasAdd'
import { publicFormatter } from '@/utils/dict'
import { environmentalCheckPage, environmentalCheckDelete } from '@/api/safetyEnvironmental/environmental'
const tableProps = [
{
prop: 'name',
label: '指标名称',
minWidth: 120,
showOverflowtooltip: true
},
{
prop: 'code',
label: '指示编码',
minWidth: 120
},
{
prop: 'unit',
label: '单位',
filter: publicFormatter('environment_check_unit')
},
{
prop: 'minValue',
label: '最小值'
},
{
prop: 'maxValue',
label: '最大值'
},
{
prop: 'creator',
label: '创建人'
},
{
prop: 'createTime',
label: '创建时间',
filter: parseTime,
minWidth: 160
}
]
export default {
name: 'WasteGasDetectionIndication'
name: 'WasteGasDetectionIndication',
data() {
return {
formConfig: [
{
type: 'input',
label: '指标名称',
placeholder: '指标名称',
param: 'name'
},
{
type: 'button',
btnName: '查询',
name: 'search',
color: 'primary'
},
{
type: this.$auth.hasPermi('base:waste-gas:create') ? 'separate' : '',
},
{
type: this.$auth.hasPermi('base:waste-gas:create') ? 'button' : '',
btnName: '新增',
name: 'add',
color: 'success',
plain: true
}
],
//
queryParams: {
pageNo: 1,
pageSize: 20,
checkType: 2,
name: null
},
total: 0,
tableProps,
list: [],
tableH: this.tableHeight(260),
tableBtn: [
this.$auth.hasPermi('base:waste-gas:update')
? {
type: 'edit',
btnName: '编辑'
}
: undefined,
this.$auth.hasPermi('base:waste-gas:delete')
? {
type: 'delete',
btnName: '删除'
}
: undefined
].filter((v)=>v),
addOrEditTitle: '',
centervisible: false
}
},
components: { WasteGasAdd },
mounted() {
this.getList()
},
methods: {
getList() {
environmentalCheckPage({...this.queryParams}).then(res => {
this.list = res.data.list || []
this.total = res.data.total || 0
})
},
buttonClick(val) {
console.log(val)
if (val.btnName === 'search') {
this.queryParams.name = val.name
this.getList()
} else {
this.addOrEditTitle = '新增'
this.centervisible = true
this.$nextTick(() => {
this.$refs.wasteGasAdd.init()
})
}
},
handleClick(val) {
console.log(val)
switch (val.type) {
case 'edit':
this.addOrEditTitle = '编辑'
this.centervisible = true
this.$nextTick(() => {
this.$refs.wasteGasAdd.init(val.data.id)
})
break
default:
this.handleDelete(val.data)
}
},
//
handleDelete(val) {
this.$modal.confirm('是否确认删除"' + val.name + '"的数据项?').then(function() {
return environmentalCheckDelete({ id: val.id })
}).then(() => {
this.getList();
this.$modal.msgSuccess("操作成功");
}).catch(() => {});
},
//
handleCancel() {
this.$refs.wasteGasAdd.formClear()
this.centervisible = false
this.addOrEditTitle = ''
},
handleConfirm() {
this.$refs.wasteGasAdd.submitForm()
},
successSubmit() {
this.handleCancel()
this.getList()
}
}
}
</script>

ファイルの表示

@ -1,8 +1,152 @@
<template>
<div>wasteGas</div>
<div class="wasteGasManagement">
<div class="box1">
<div class="boxTitle">
<span class="blueTitle"></span>
<span>检测指标实时数据</span>
</div>
<div class="itemBox">
<div class="itemBox">
<div class="itemClass" v-for="(item, index) in realtimeList" :key='index'>
<div class="itemSub">
<p class="itemNum">{{item.checkValue}}</p>
<p class="itemDescribe">
<img src="./../../../../../assets/images/detectionData.png" alt="">
{{item.name}}</p>
</div>
</div>
</div>
</div>
</div>
<div class="box2">
<div class="boxTitle">
<span class="blueTitle"></span>
<span>检测指标趋势图</span>
</div>
<!-- 搜索工作栏 -->
<search-area @submit="getTrend"/>
<line-chart :chartData="chartData" v-show='Object.keys(chartData).length !== 0' :timeDim="queryParams.timeDim"/>
<!-- 没有数据 -->
<div class="no-data-bg" v-show='Object.keys(chartData).length === 0'></div>
</div>
</div>
</template>
<script>
import { environmentalCheckRealtime, environmentalCheckRealtimeTrend } from '@/api/safetyEnvironmental/environmental'
import LineChart from './../../components/lineChart'
import SearchArea from './../../components/searchArea'
export default {
name: 'WasteGas'
name: 'WasteGasManagement',
data(){
return {
realtimeList:[],
queryParams:{
checkType: 2,
timeDim: null,
timeRange: []
},
chartData: {}
}
},
components: { LineChart, SearchArea },
mounted() {
this.getMsg()
},
methods: {
getMsg() {
environmentalCheckRealtime({checkType: 2}).then(res => {
console.log(res)
this.realtimeList = res.data || []
})
},
getTrend(params) {
console.log(params)
this.queryParams.timeDim = params.timeDim
this.queryParams.timeRange[0] = params.startTime
this.queryParams.timeRange[1] = params.endTime
environmentalCheckRealtimeTrend({...this.queryParams}).then(res => {
console.log(res)
if (res.code === 0) {
this.chartData = res.data
} else {
this.chartData = {}
}
})
}
}
}
</script>
</script>
<style lang='scss' scoped>
.wasteGasManagement {
background-color: #f2f4f9;
.box1 {
height: 172px;
padding: 12px 16px 0;
margin-bottom: 8px;
background-color: #fff;
border-radius: 9px;
.itemBox {
display: flex;
flex-flow: row nowrap;
overflow: auto;
.itemClass {
width: 198px;
height: 88px;
// border: 1px solid green;
padding: 12px 0px 12px 18px;
.itemSub {
width: 176px;
height: 65px;
padding-right: 26px;
border-right: 1px solid #E8E8E8;
P{
margin: 0;
img {
width: 24px;
height: 24px;
vertical-align: middle;
}
}
.itemNum {
font-size: 32px;
font-weight: 600;
height: 43px;
color: #3E6AF7;
text-align: right;
}
.itemDescribe {
font-size: 16px;
text-align: right;
}
}
}
}
.itemClass:last-child > .itemSub{
border: none !important;
}
}
.box2 {
background-color: #fff;
border-radius: 9px;
padding: 16px;
height: calc(100vh - 308px);
}
.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>

ファイルの表示

@ -1,8 +1,185 @@
<template>
<div>wasteWaterDetectionHistory</div>
<div class="app-container wasteWaterHis">
<!-- 搜索工作栏 -->
<search-bar
:formConfigs="formConfig"
ref="searchBarForm"
@headBtnClick="buttonClick"
/>
<!-- 列表 -->
<base-table
:page="queryParams.pageNo"
:limit="queryParams.pageSize"
:table-props="tableProps"
:table-data="list"
:max-height="tableH"
:row-class-name="tableRowClassName"
/>
<pagination
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
:total="total"
@pagination="getList"
/>
</div>
</template>
<script>
import { publicFormatter } from '@/utils/dict'
import { parseTime } from '@/utils/ruoyi'
import { environmentalCheckRecordPage, environmentalCheckRecordExport, environmentalCheckPage } from '@/api/safetyEnvironmental/environmental'
import moment from 'moment'
const tableProps = [
{
prop: 'checkName',
label: '指标名称'
},
{
prop: 'checkValue',
label: '检测数值'
},
{
prop: 'unit',
label: '单位',
filter: publicFormatter('environment_check_unit')
},
{
prop: 'checkTime',
label: '检测时间',
filter: parseTime,
minWidth: 160
},
{
prop: 'origin',
label: '来源',
filter: (val) => ['手动', '自动'][val]
},
{
prop: 'recordPerson',
label: '录入人'
},
{
prop: 'recordTime',
label: '录入时间',
filter: parseTime,
minWidth: 160
}
]
export default {
name: 'WasteWaterDetectionHistory'
name: 'WasteWaterDetectionHistory',
data() {
return {
formConfig: [
{
type: 'select',
label: '指标名称',
selectOptions: [],
param: 'checkId',
filterable: true
},
{
type: 'datePicker',
label: '检测时间',
dateType: 'datetimerange',
format: 'yyyy-MM-dd HH:mm:ss',
valueFormat: "timestamp",
rangeSeparator: '-',
startPlaceholder: '开始时间',
endPlaceholder: '结束时间',
param: 'timeVal',
defaultSelect: [],
width: 350
},
{
type: 'button',
btnName: '查询',
name: 'search',
color: 'primary'
},
{
type: this.$auth.hasPermi('base:waste-water:export') ? 'separate' : '',
},
{
type: this.$auth.hasPermi('base:waste-water:export') ? 'button' : '',
btnName: '导出',
name: 'export',
color: 'primary',
plain: true
}
],
//
queryParams: {
pageNo: 1,
pageSize: 20,
checkId: null,
checkType: 1,
startTime: null,
endTime: null
},
tableProps,
list: [],
total: 0,
tableH: this.tableHeight(260)
}
},
created() {
window.addEventListener('resize', () => {
this.tableH = this.tableHeight(260)
})
let end = moment(moment().format('YYYY-MM-DD 23:59:59')).valueOf()
let start = moment(moment().format('YYYY-MM-DD 00:00:00')).valueOf()
this.formConfig[1].defaultSelect = [start, end]
this.queryParams.startTime = start
this.queryParams.endTime = end
this.getSelectList()
this.getList()
},
methods: {
buttonClick(val) {
this.queryParams.pageNo = 1;
this.queryParams.checkId = val.checkId
this.queryParams.startTime = val.timeVal ? val.timeVal[0] : null
this.queryParams.endTime = val.timeVal ? val.timeVal[1] : null
if (val.btnName === 'search') {
this.getList()
} else {
this.$modal.confirm('是否确认导出').then(() => {
return environmentalCheckRecordExport({...this.queryParams});
}).then(response => {
this.$download.excel(response, '废水检测历史记录.xls');
}).catch(() => {})
}
},
getList() {
environmentalCheckRecordPage({...this.queryParams}).then(res => {
this.list = res.data.list || []
this.total = res.data.total || 0
})
},
getSelectList() {
environmentalCheckPage({
pageNo: 1,
pageSize: 100,
checkType: 1
}).then(res => {
console.log(res)
this.formConfig[0].selectOptions = res.data.list || []
})
},
tableRowClassName({row, rowIndex}) {
console.log(row)
if (row.markRed) {
return 'warning-row'
}else {
return ''
}
}
}
}
</script>
</script>
<style lang='scss'>
.wasteWaterHis {
.el-table .warning-row {
background: #fee1e1;
}
}
</style>

ファイルの表示

@ -1,9 +1,9 @@
<template>
<el-form ref="wasteWaterAddForm" :rules="rules" label-width="130px" :model="form">
<el-form ref="wasteWaterAddForm" :rules="rules" label-width="80px" :model="form">
<el-row :gutter="20">
<el-col :span='12'>
<el-form-item label="指标名称" prop="name">
<el-input v-model="form.name"></el-input>
<el-input v-model="form.name" :disabled='isEdit'></el-input>
</el-form-item>
</el-col>
<el-col :span='12'>
@ -12,150 +12,113 @@
</el-form-item>
</el-col>
<el-col :span='12'>
<el-form-item label="指标名称" prop="name1">
<el-input v-model="form.name"></el-input>
<el-form-item label="单位" prop="unit">
<el-select v-model="form.unit" placeholder="请选择" style="width: 100%;" :disabled='form.method == 2'>
<el-option
v-for="item in getDictDatas(DICT_TYPE.ENVIRONMENT_CHECK_UNIT)"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span='12'>
<el-form-item label="最小值" prop="code11">
<el-input v-model="form.code"></el-input>
<el-form-item label="最小值" prop="minValue">
<el-input-number v-model="form.minValue" placeholder="最小值" :max="9999999" style="width: 100%;"></el-input-number>
</el-form-item>
</el-col>
<el-col :span='12'>
<el-form-item label="最大值" prop="name12">
<el-input v-model="form.name"></el-input>
<el-form-item label="最大值" prop="maxValue">
<el-input-number v-model="form.maxValue" placeholder="最大值" :max="9999999" style="width: 100%;"></el-input-number>
</el-form-item>
</el-col>
<el-col :span='12'>
<el-form-item label="备注" prop="code1122">
<el-input v-model="form.code"></el-input>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script>
import { environmentalCheckGet, environmentalCheckUpdate, environmentalCheckCreate, getEnvironmentalCheckCode } from '@/api/safetyEnvironmental/environmental'
export default {
name: 'WasteWaterAdd',
data() {
return {
// rules: {
// name: [{ required: true, message: "", trigger: "blur" }],
// code: [{ required: true, message: "", trigger: "blur" }],
// planQuantity: [{ required: true, message: "", trigger: "blur" }],
// planProductId: [{ required: true, message: "", trigger: "change" }]
// }
form: {
id: '',
name: '',
code: '',
unit: '',
minValue: null,
maxValue: null,
remark: '',
checkType: 1
},
isEdit: false,
rules: {
name: [{ required: true, message: "指标名称不能为空", trigger: "blur" }],
code: [{ required: true, message: "指标编码不能为空", trigger: "blur" }],
// unit: [{ required: true, message: "unit", trigger: "change" }],
minValue: [{ required: true, message: "最小值不能为空", trigger: "blur" }],
maxValue: [{ required: true, message: "最大值不能为空", trigger: "blur" }]
}
}
},
methods: {
// init(id) {
// this.getList()
// if (id) {
// this.isEdit = true
// this.form.id = id
// getOrderById({id: this.form.id}).then(res => {
// if (res.code === 0) {
// this.form.name = res.data.name
// this.form.code = res.data.code
// this.form.planQuantity = res.data.planQuantity
// this.form.planProductId = res.data.planProductId
// this.form.price = res.data.price
// this.form.customerId = res.data.customerId
// this.form.priority = res.data.priority ? res.data.priority + '' : ''
// this.form.planStartTime = res.data.planStartTime ? res.data.planStartTime : null
// this.form.packSpec = res.data.packSpec ? res.data.packSpec+'' : ''
// this.form.workers = res.data.workers
// this.form.processFlowId = res.data.processFlowId
// this.form.materialMethod = res.data.materialMethod
// this.form.planFinishTime = res.data.planFinishTime ? res.data.planFinishTime : null
// this.form.remark = res.data.remark
// // this.form.description = res.data.description
// }
// })
// } else {
// this.isEdit = false
// this.form.id = ''
// //
// getOrderCode().then(res => {
// this.form.code = res.data || ''
// })
// }
// },
// getList() {
// //
// getProductAll().then(res => {
// this.productList = res.data || []
// })
// //
// getCustomerList().then(res => {
// this.customerList = res.data || []
// })
// //
// getProcessFlowList().then(res => {
// this.processFlowList = res.data || []
// })
// },
// timeChange() {
// if (this.form.planStartTime && this.form.planFinishTime) {
// if (this.form.planStartTime > this.form.planFinishTime) {
// this.$modal.msgError('')
// }
// }
// },
// //
// materialMethodChange(val) {
// if (val === 2 && !this.form.processFlowId) {
// this.form.materialMethod = 1
// this.$modal.msgError("");
// }
// },
// //
// processFlowIdChange(val) {
// console.log(val)
// if (!val) {
// this.form.materialMethod = 1
// }
// },
// submitForm() {
// this.$refs['orderAddForm'].validate((valid) => {
// if (valid) {
// if (this.form.planStartTime && this.form.planFinishTime) {
// if (this.form.planStartTime > this.form.planFinishTime) {
// this.$modal.msgError('')
// return false
// }
// }
// // console.log(this.form)
// if (this.isEdit) {
// //
// orderUpdate({ ...this.form }).then((res) => {
// if (res.code === 0) {
// this.$modal.msgSuccess("");
// this.$emit('successSubmit')
// }
// })
// } else {
// this.form.status = 1
// this.form.triggerOrigin = 1
// orderCreate({ ...this.form }).then((res) => {
// if (res.code === 0) {
// this.$modal.msgSuccess("");
// this.$emit('successSubmit')
// }
// })
// }
// } else {
// return false
// }
// })
// },
// formClear() {
// this.$refs.orderAddForm.resetFields()
// this.form.materialMethod = 1
// this.form.price = 0.00
// this.form.planQuantity = 0
// this.isEdit = false
// }
init(id) {
if (id) {
this.isEdit = true
this.form.id = id
environmentalCheckGet({id: this.form.id}).then(res => {
if (res.code === 0) {
this.form = res.data
}
})
} else {
this.isEdit = false
this.form.id = ''
//
getEnvironmentalCheckCode().then(res => {
this.form.code = res.data || ''
})
}
},
submitForm() {
this.$refs['wasteWaterAddForm'].validate((valid) => {
if (valid) {
if (this.form.minValue > this.form.maxValue) {
this.$modal.msgError('最小值不能大于最大值')
return false
}
console.log(this.form)
if (this.isEdit) {
//
environmentalCheckUpdate({ ...this.form }).then((res) => {
if (res.code === 0) {
this.$modal.msgSuccess("操作成功");
this.$emit('successSubmit')
}
})
} else {
environmentalCheckCreate({ ...this.form }).then((res) => {
if (res.code === 0) {
this.$modal.msgSuccess("操作成功");
this.$emit('successSubmit')
}
})
}
} else {
return false
}
})
},
formClear() {
this.$refs.wasteWaterAddForm.resetFields()
this.isEdit = false
}
}
}
</script>

ファイルの表示

@ -17,7 +17,7 @@
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
:width="120"
:width="80"
label="操作"
:method-list="tableBtn"
@clickBtn="handleClick"
@ -44,11 +44,13 @@
</template>
<script>
import { parseTime } from '@/utils/ruoyi'
// import { publicFormatter } from '@/utils/dict'
import WasteWaterAdd from './components/wasteWaterAdd'
import { publicFormatter } from '@/utils/dict'
import { environmentalCheckPage, environmentalCheckDelete } from '@/api/safetyEnvironmental/environmental'
const tableProps = [
{
prop: 'name',
label: '指名称',
label: '指名称',
minWidth: 120,
showOverflowtooltip: true
},
@ -58,26 +60,22 @@ const tableProps = [
minWidth: 120
},
{
prop: 'customerId',
label: '单位'
prop: 'unit',
label: '单位',
filter: publicFormatter('environment_check_unit')
},
{
prop: 'customerId1',
prop: 'minValue',
label: '最小值'
},
{
prop: 'customerId2',
prop: 'maxValue',
label: '最大值'
},
{
prop: 'customerId3',
prop: 'creator',
label: '创建人'
},
// {
// prop: 'triggerOrigin',
// label: '',
// filter: publicFormatter('order_Origin')
// },
{
prop: 'createTime',
label: '创建时间',
@ -91,11 +89,9 @@ export default {
return {
formConfig: [
{
type: 'select',
type: 'input',
label: '指标名称',
selectOptions: this.getDictDatas(this.DICT_TYPE.ORDER_STATUS),
labelField: 'label',
valueField: 'value',
placeholder: '指标名称',
param: 'name'
},
{
@ -105,10 +101,10 @@ export default {
color: 'primary'
},
{
type: this.$auth.hasPermi('base:order-manage:create') ? 'separate' : '',
type: this.$auth.hasPermi('base:waste-water:create') ? 'separate' : '',
},
{
type: this.$auth.hasPermi('base:order-manage:create') ? 'button' : '',
type: this.$auth.hasPermi('base:waste-water:create') ? 'button' : '',
btnName: '新增',
name: 'add',
color: 'success',
@ -119,35 +115,42 @@ export default {
queryParams: {
pageNo: 1,
pageSize: 20,
name: null,
status: null
checkType: 1,
name: null
},
total: 0,
tableProps,
list: [
{name:'1111'}
],
list: [],
tableH: this.tableHeight(260),
tableBtn: [
this.$auth.hasPermi('base:order-manage:edit')
this.$auth.hasPermi('base:waste-water:update')
? {
type: 'edit',
btnName: '编辑'
}
: undefined,
this.$auth.hasPermi('base:order-manage:delete')
this.$auth.hasPermi('base:waste-water:delete')
? {
type: 'delete',
btnName: '删除'
}
: undefined
],
].filter((v)=>v),
addOrEditTitle: '',
centervisible: false
}
},
components: { WasteWaterAdd },
mounted() {
this.getList()
},
methods: {
getList() {},
getList() {
environmentalCheckPage({...this.queryParams}).then(res => {
this.list = res.data.list || []
this.total = res.data.total || 0
})
},
buttonClick(val) {
console.log(val)
if (val.btnName === 'search') {
@ -178,7 +181,7 @@ export default {
//
handleDelete(val) {
this.$modal.confirm('是否确认删除"' + val.name + '"的数据项?').then(function() {
// return wasteWaterDelete({ id: val.id })
return environmentalCheckDelete({ id: val.id })
}).then(() => {
this.getList();
this.$modal.msgSuccess("操作成功");

ファイルの表示

@ -1,8 +1,150 @@
<template>
<div>wasteWater</div>
<div class="wasteWaterManagement">
<div class="box1">
<div class="boxTitle">
<span class="blueTitle"></span>
<span>检测指标实时数据</span>
</div>
<div class="itemBox">
<div class="itemClass" v-for="(item, index) in realtimeList" :key='index'>
<div class="itemSub">
<p class="itemNum">{{item.checkValue}}</p>
<p class="itemDescribe">
<img src="./../../../../../assets/images/detectionData.png" alt="">
{{item.name}}</p>
</div>
</div>
</div>
</div>
<div class="box2">
<div class="boxTitle">
<span class="blueTitle"></span>
<span>检测指标趋势图</span>
</div>
<!-- 搜索工作栏 -->
<search-area @submit="getTrend"/>
<line-chart :chartData="chartData" v-show='Object.keys(chartData).length !== 0' :timeDim="queryParams.timeDim"/>
<!-- 没有数据 -->
<div class="no-data-bg" v-show='Object.keys(chartData).length === 0'></div>
</div>
</div>
</template>
<script>
import { environmentalCheckRealtime, environmentalCheckRealtimeTrend } from '@/api/safetyEnvironmental/environmental'
import LineChart from './../../components/lineChart'
import SearchArea from './../../components/searchArea'
export default {
name: 'WasteWater'
name: 'WasteWaterManagement',
data(){
return {
realtimeList:[],
queryParams:{
checkType: 1,
timeDim: null,
timeRange: []
},
chartData: {}
}
},
components: { LineChart, SearchArea },
mounted() {
this.getMsg()
},
methods: {
getMsg() {
environmentalCheckRealtime({checkType: 1}).then(res => {
console.log(res)
this.realtimeList = res.data || []
})
},
getTrend(params) {
console.log(params)
this.queryParams.timeDim = params.timeDim
this.queryParams.timeRange[0] = params.startTime
this.queryParams.timeRange[1] = params.endTime
environmentalCheckRealtimeTrend({...this.queryParams}).then(res => {
console.log(res)
if (res.code === 0) {
this.chartData = res.data
} else {
this.chartData = {}
}
})
}
}
}
</script>
</script>
<style lang='scss' scoped>
.wasteWaterManagement {
background-color: #f2f4f9;
.box1 {
height: 172px;
padding: 12px 16px 0;
margin-bottom: 8px;
background-color: #fff;
border-radius: 9px;
.itemBox {
display: flex;
flex-flow: row nowrap;
overflow: auto;
.itemClass {
width: 198px;
height: 88px;
// border: 1px solid green;
padding: 12px 0px 12px 18px;
.itemSub {
width: 176px;
height: 65px;
padding-right: 26px;
border-right: 1px solid #E8E8E8;
P{
margin: 0;
img {
width: 24px;
height: 24px;
vertical-align: middle;
}
}
.itemNum {
font-size: 32px;
font-weight: 600;
height: 43px;
color: #3E6AF7;
text-align: right;
}
.itemDescribe {
font-size: 16px;
text-align: right;
}
}
}
}
.itemClass:last-child > .itemSub{
border: none !important;
}
}
.box2 {
background-color: #fff;
border-radius: 9px;
padding: 16px;
height: calc(100vh - 308px);
}
.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>

1624
yarn.lock

ファイル差分が大きすぎるため省略します 差分を読み込み