节能减排增加风险预警

This commit is contained in:
BianLzhaoMin 2026-01-24 10:18:26 +08:00
parent 5fd2b135bb
commit d8495b68f0
3 changed files with 533 additions and 47 deletions

View File

@ -2,36 +2,73 @@ import request from '@/utils/request'
// 获取节能减排列表
export function getEnergySavingListAPI(data) {
return request({
url: '/background/sj/energy/list',
method: 'get',
params: data,
})
return request({
url: '/background/sj/energy/list',
method: 'get',
params: data,
})
}
// 新增节能减排
export function addEnergySavingAPI(data) {
return request({
url: '/background/sj/energy/addData',
method: 'post',
data,
})
return request({
url: '/background/sj/energy/addData',
method: 'post',
data,
})
}
// 编辑节能减排
export function editEnergySavingAPI(data) {
return request({
url: '/background/sj/energy/updateData',
method: 'post',
data,
})
return request({
url: '/background/sj/energy/updateData',
method: 'post',
data,
})
}
// 删除节能减排
export function deleteEnergySavingAPI(data) {
return request({
url: '/background/sj/energy/delete',
method: 'post',
data,
})
return request({
url: '/background/sj/energy/delete',
method: 'post',
data,
})
}
// 风险预警相关API
// 获取风险预警列表
export function getRiskWarningListAPI(data) {
return request({
url: '/background/sj/energy/getWarnList',
method: 'get',
params: data,
})
}
// 新增风险预警
export function addRiskWarningAPI(data) {
return request({
url: '/background/sj/energy/addWarnData',
method: 'post',
data,
})
}
// 编辑风险预警
export function editRiskWarningAPI(data) {
return request({
url: '/background/sj/energy/updateWarnData',
method: 'post',
data,
})
}
// 删除风险预警
export function deleteRiskWarningAPI(data) {
return request({
url: '/background/sj/energy/deleteWarnData',
method: 'post',
data,
})
}

View File

@ -27,8 +27,17 @@
size="mini"
type="primary"
@click="onHandleAddProject"
>新增</el-button
>
新增
</el-button>
<el-button
size="mini"
type="warning"
icon="el-icon-warning-outline"
@click="onHandleRiskWarning"
>
风险预警
</el-button>
</el-form-item>
</el-form>
@ -68,7 +77,7 @@
width="50%"
v-if="addAndEditDialogVisible"
:visible.sync="addAndEditDialogVisible"
:title="`${addAndEditDialogTitle}工程质量`"
:title="`${addAndEditDialogTitle}节能减排`"
>
<AddAndEditForm
ref="addAndEditFormRef"
@ -85,6 +94,175 @@
</el-button>
</div>
</el-dialog>
<!-- 风险预警弹框 -->
<el-dialog
append-to-body
width="80%"
v-if="riskWarningDialogVisible"
:visible.sync="riskWarningDialogVisible"
title="风险预警"
>
<el-form inline class="mb10">
<el-form-item label="综合查询">
<el-input
v-model="riskWarningQueryParams.keyWord"
placeholder="请输入关键字"
clearable
style="width: 200px"
@keyup.enter.native="onHandleRiskWarningQuery"
/>
</el-form-item>
<el-form-item>
<el-button
size="mini"
type="primary"
icon="el-icon-search"
@click="onHandleRiskWarningQuery"
>
查询
</el-button>
<el-button
size="mini"
type="primary"
icon="el-icon-plus"
@click="onHandleAddRiskWarning"
>
新增
</el-button>
</el-form-item>
</el-form>
<el-table
border
:data="riskWarningList"
v-loading="riskWarningLoading"
>
<el-table-column
label="序号"
type="index"
width="60"
align="center"
/>
<el-table-column
label="工程名称"
prop="proName"
align="center"
/>
<el-table-column
label="提醒类型"
prop="txType"
align="center"
/>
<el-table-column
label="提醒时间"
prop="txTime"
align="center"
/>
<el-table-column
label="分析提醒内容"
prop="content"
align="center"
show-overflow-tooltip
/>
<el-table-column label="操作" align="center" width="140">
<template slot-scope="scope">
<el-button
type="primary"
size="mini"
style="padding: 6px 6px"
@click="onHandleEditRiskWarning(scope.row)"
>
编辑
</el-button>
<el-button
type="danger"
size="mini"
style="padding: 6px 6px"
@click="onHandleDeleteRiskWarning(scope.row)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<pagination
:total="riskWarningTotal"
:page.sync="riskWarningQueryParams.pageNum"
:limit.sync="riskWarningQueryParams.pageSize"
@pagination="onRiskWarningPageChange"
/>
</el-dialog>
<!-- 风险预警新增/编辑弹框 -->
<el-dialog
append-to-body
width="500px"
v-if="riskWarningFormDialogVisible"
:visible.sync="riskWarningFormDialogVisible"
:title="`${riskWarningFormDialogTitle}风险预警`"
>
<el-form
:model="riskWarningForm"
:rules="riskWarningRules"
ref="riskWarningFormRef"
label-width="100px"
>
<el-form-item label="工程名称" prop="bidCode">
<el-select
v-model="riskWarningForm.bidCode"
placeholder="请选择工程名称"
style="width: 100%"
>
<el-option
v-for="item in projectSelectList"
:key="item.bidCode"
:label="item.proName"
:value="item.bidCode"
/>
</el-select>
</el-form-item>
<el-form-item label="提醒类型" prop="txType">
<el-input
v-model="riskWarningForm.txType"
placeholder="请输入提醒类型"
clearable
/>
</el-form-item>
<el-form-item label="预警时间" prop="txTime">
<el-date-picker
v-model="riskWarningForm.txTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择预警时间"
style="width: 100%"
/>
</el-form-item>
<el-form-item label="预警内容" prop="content">
<el-input
v-model="riskWarningForm.content"
type="textarea"
:rows="4"
placeholder="请输入分析预警内容"
clearable
/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="riskWarningFormDialogVisible = false">
取消
</el-button>
<el-button
type="primary"
:loading="riskWarningSubmitting"
@click="onHandleSubmitRiskWarning"
>
确定
</el-button>
</div>
</el-dialog>
</div>
</template>
@ -92,12 +270,16 @@
import {
getEnergySavingListAPI,
deleteEnergySavingAPI,
} from '@/api/dataAnalysis/energySaving'
getRiskWarningListAPI,
addRiskWarningAPI,
editRiskWarningAPI,
deleteRiskWarningAPI,
} from '@/api/dataManage/energySaving'
import { getProjectSelectListAPI } from '@/api/dataManage/common'
import AddAndEditForm from './components/addAndEditForm.vue'
export default {
name: 'ProjectQuality',
name: 'EnergySaving',
components: {
AddAndEditForm,
},
@ -107,6 +289,7 @@ export default {
editRow: {},
detailsId: '',
projectList: [],
projectSelectList: [],
addAndEditDialogVisible: false,
addAndEditDialogTitle: '',
tableColumns: [
@ -129,14 +312,79 @@ export default {
type: '',
createTime: '',
},
//
riskWarningDialogVisible: false,
riskWarningLoading: false,
riskWarningList: [],
riskWarningTotal: 0,
riskWarningQueryParams: {
pageNum: 1,
pageSize: 10,
keyWord: '',
},
riskWarningFormDialogVisible: false,
riskWarningFormDialogTitle: '新增',
riskWarningSubmitting: false,
riskWarningEditId: null,
riskWarningForm: {
bidCode: '',
txType: '',
txTime: '',
content: '',
},
riskWarningRules: {
bidCode: [
{
required: true,
message: '请选择工程名称',
trigger: 'change',
},
],
txType: [
{
required: true,
message: '请输入提醒类型',
trigger: 'blur',
},
],
txTime: [
{
required: true,
message: '请选择预警时间',
trigger: 'change',
},
],
content: [
{
required: true,
message: '请输入分析预警内容',
trigger: 'blur',
},
],
},
}
},
created() {
this.getProjectList()
this.getProjectSelectList()
},
methods: {
//
async getProjectSelectList() {
try {
const res = await getProjectSelectListAPI()
if (res.code === 200) {
this.projectSelectList = res.data || []
} else {
this.projectSelectList = res.data || []
}
} catch (error) {
this.projectSelectList = []
}
},
onHandleQuery() {
this.getProjectList()
},
@ -146,14 +394,14 @@ export default {
this.addAndEditDialogVisible = true
this.addAndEditDialogTitle = '新增'
},
//
//
async getProjectList() {
const res = await getEnergySavingListAPI(this.queryParams)
this.projectList = res.rows
this.total = res.total
},
//
//
onHandleEditProject(row) {
this.detailsId = row.id
this.editRow = row
@ -161,7 +409,7 @@ export default {
this.addAndEditDialogTitle = '编辑'
},
//
//
onHandleDeleteProject(row) {
this.$confirm('此操作将永久删除该节能减排, 是否继续?', '提示', {
confirmButtonText: '确定',
@ -180,7 +428,7 @@ export default {
.catch(() => {})
},
//
//
async onHandleSubmit() {
const res = await this.$refs.addAndEditFormRef.submitForm()
if (res) {
@ -191,6 +439,130 @@ export default {
this.$message.error('提交失败')
}
},
//
onHandleRiskWarning() {
this.riskWarningDialogVisible = true
this.getRiskWarningList()
},
//
//
async getRiskWarningList() {
this.riskWarningLoading = true
try {
const res = await getRiskWarningListAPI(
this.riskWarningQueryParams,
)
this.riskWarningList = res.rows || []
this.riskWarningTotal = res.total || 0
} catch (error) {
this.$message.error('获取风险预警列表失败')
} finally {
this.riskWarningLoading = false
}
},
//
onHandleRiskWarningQuery() {
this.riskWarningQueryParams.pageNum = 1
this.getRiskWarningList()
},
//
onRiskWarningPageChange() {
this.getRiskWarningList()
},
//
onHandleAddRiskWarning() {
this.riskWarningFormDialogTitle = '新增'
this.riskWarningEditId = null
this.riskWarningForm = {
bidCode: '',
txType: '',
txTime: '',
content: '',
}
this.$nextTick(() => {
if (this.$refs.riskWarningFormRef) {
this.$refs.riskWarningFormRef.clearValidate()
}
})
this.riskWarningFormDialogVisible = true
},
//
onHandleEditRiskWarning(row) {
this.riskWarningFormDialogTitle = '编辑'
this.riskWarningEditId = row.id
this.riskWarningForm = {
bidCode: row.bidCode || '',
txType: row.txType || '',
txTime: row.txTime || '',
content: row.content || '',
}
this.$nextTick(() => {
if (this.$refs.riskWarningFormRef) {
this.$refs.riskWarningFormRef.clearValidate()
}
})
this.riskWarningFormDialogVisible = true
},
//
onHandleDeleteRiskWarning(row) {
this.$confirm('此操作将永久删除该风险预警记录, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(async () => {
try {
const res = await deleteRiskWarningAPI({ id: row.id })
if (res.code === 200) {
this.$message.success('删除成功')
this.getRiskWarningList()
} else {
this.$message.error(res.msg || '删除失败')
}
} catch (error) {
this.$message.error('删除失败')
}
})
.catch(() => {})
},
//
async onHandleSubmitRiskWarning() {
this.$refs.riskWarningFormRef.validate(async (valid) => {
if (!valid) return
this.riskWarningSubmitting = true
try {
const params = { ...this.riskWarningForm }
if (this.riskWarningEditId) {
params.id = this.riskWarningEditId
}
const API = this.riskWarningEditId
? editRiskWarningAPI
: addRiskWarningAPI
const res = await API(params)
if (res.code === 200) {
this.$message.success(
this.riskWarningEditId ? '编辑成功' : '新增成功',
)
this.riskWarningFormDialogVisible = false
this.getRiskWarningList()
} else {
this.$message.error(res.msg || '操作失败')
}
} catch (error) {
this.$message.error('操作失败')
} finally {
this.riskWarningSubmitting = false
}
})
},
},
}
</script>

View File

@ -22,8 +22,8 @@
placeholder="请选择"
v-model="taskQueryParams.isYq"
>
<el-option label="是" value="是" />
<el-option label="否" value="否" />
<el-option label="未延期" :value="0" />
<el-option label="延期" :value="1" />
</el-select>
</el-form-item>
<el-form-item>
@ -83,7 +83,11 @@
label="任务状态"
prop="taskStatus"
align="center"
/>
>
<template slot-scope="scope">
{{ getTaskStatusText(scope.row.taskStatus) }}
</template>
</el-table-column>
<el-table-column
label="计划开始时间"
prop="planStartTime"
@ -99,7 +103,15 @@
prop="endTime"
align="center"
/>
<el-table-column label="是否延期" prop="isYq" align="center" />
<el-table-column label="是否延期" prop="isYq" align="center">
<template slot-scope="scope">
{{
scope.row.isYq === 1 || scope.row.isYq === '1'
? '延期'
: '未延期'
}}
</template>
</el-table-column>
<el-table-column label="延期天数" prop="yaDay" align="center" />
<el-table-column label="操作" align="center" width="140">
<template slot-scope="scope">
@ -293,9 +305,10 @@
placeholder="请选择任务状态"
style="width: 100%"
>
<el-option label="未开始" value="未开始" />
<el-option label="进行中" value="进行中" />
<el-option label="已完成" value="已完成" />
<el-option label="未开始" value="3" />
<el-option label="进行中" value="2" />
<el-option label="已完成" value="1" />
<el-option label="延期" value="4" />
</el-select>
</el-form-item>
<el-form-item label="计划开始时间" prop="planStartTime">
@ -327,6 +340,20 @@
@change="calculateDelayInfo"
/>
</el-form-item>
<el-form-item label="是否延期">
<el-input
:value="taskForm.isYq === 1 ? '延期' : '未延期'"
disabled
style="width: 100%"
/>
</el-form-item>
<el-form-item label="延期天数">
<el-input
:value="taskForm.yaDay || 0"
disabled
style="width: 100%"
/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
@ -441,7 +468,7 @@ export default {
pageNum: 1,
pageSize: 10,
userName: '',
isYq: '',
isYq: null,
},
taskDialogVisible: false,
taskDialogTitle: '新增',
@ -456,12 +483,11 @@ export default {
teamId: '',
workContent: '',
taskStatus: '',
taskStatus: '',
planStartTime: '',
planEndTime: '',
endTime: '',
isYq: '', //
yaDay: '', //
isYq: 0, // 0- 1-
yaDay: 0, //
},
taskRules: {
bidCode: [
@ -606,7 +632,7 @@ export default {
pageNum: 1,
pageSize: 10,
userName: '',
isYq: '',
isYq: null,
}
this.getWorkerTaskList()
},
@ -630,6 +656,8 @@ export default {
planStartTime: '',
planEndTime: '',
endTime: '',
isYq: 0,
yaDay: 0,
}
this.$nextTick(() => {
if (this.$refs.taskFormRef) {
@ -643,17 +671,35 @@ export default {
onHandleEditTask(row) {
this.taskDialogTitle = '编辑'
this.taskEditId = row.id
// isYq 01
let isYq = 0
if (
row.isYq !== null &&
row.isYq !== undefined &&
row.isYq !== ''
) {
isYq = row.isYq === 1 || row.isYq === '1' ? 1 : 0
}
// taskStatus
let taskStatus = ''
if (
row.taskStatus !== null &&
row.taskStatus !== undefined &&
row.taskStatus !== ''
) {
taskStatus = String(row.taskStatus)
}
this.taskForm = {
bidCode: row.bidCode || '',
userName: row.userName || '',
teamId: row.teamId || '',
teamName: row.teamName || '',
workContent: row.workContent || '',
taskStatus: row.taskStatus || '',
taskStatus: taskStatus,
planStartTime: row.planStartTime || '',
planEndTime: row.planEndTime || '',
endTime: row.endTime || '',
isYq: row.isYq || '否', //
isYq: isYq, // 0- 1-
yaDay: row.yaDay || 0, //
}
//
@ -664,6 +710,13 @@ export default {
if (this.$refs.taskFormRef) {
this.$refs.taskFormRef.clearValidate()
}
//
if (
(!row.isYq && row.isYq !== 0) ||
(!row.yaDay && row.yaDay !== 0)
) {
this.calculateDelayInfo()
}
})
this.taskDialogVisible = true
},
@ -696,7 +749,7 @@ export default {
const { planEndTime, endTime } = this.taskForm
if (!planEndTime) {
this.taskForm.isYq = '否'
this.taskForm.isYq = 0
this.taskForm.yaDay = 0
return
}
@ -718,12 +771,12 @@ export default {
const diffTime = compareDate - planEndDate
const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24))
//
// 0-1-
if (diffDays > 0) {
this.taskForm.isYq = '是'
this.taskForm.isYq = 1
this.taskForm.yaDay = diffDays
} else {
this.taskForm.isYq = '否'
this.taskForm.isYq = 0
this.taskForm.yaDay = 0
}
},
@ -739,6 +792,17 @@ export default {
this.taskSubmitting = true
try {
const params = { ...this.taskForm }
// isYq
params.isYq = Number(params.isYq) || 0
// yaDay
params.yaDay = Number(params.yaDay) || 0
// taskStatus
if (
params.taskStatus !== null &&
params.taskStatus !== undefined
) {
params.taskStatus = String(params.taskStatus)
}
if (this.taskEditId) {
params.id = this.taskEditId
}
@ -909,6 +973,19 @@ export default {
this.taskForm.teamName = ''
}
},
//
getTaskStatusText(status) {
const statusMap = {
1: '已完成',
2: '进行中',
3: '未开始',
4: '延期',
}
//
const statusStr = String(status)
return statusMap[statusStr] || status || '-'
},
},
}
</script>