l3能源成本分摊(部分完成留存)

This commit is contained in:
2025-12-07 17:23:47 +08:00
parent b6328a94da
commit 59951b77c3
100 changed files with 14350 additions and 847 deletions

View File

@@ -0,0 +1,311 @@
<template>
<div class="allocation-task-page">
<!-- 查询条件 -->
<el-card class="search-card">
<el-form :model="queryParams" label-width="120px" size="small">
<el-row :gutter="20">
<el-col :xs="24" :sm="12" :md="6">
<el-form-item label="任务日期:">
<el-date-picker v-model="queryParams.taskDate" type="date" placeholder="选择任务日期" value-format="yyyy-MM-dd" @change="handleQuery"></el-date-picker>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="6">
<el-form-item label="能源类型:">
<el-select v-model="queryParams.energyTypeId" placeholder="请选择能源类型" clearable @change="handleQuery">
<el-option v-for="item in energyTypeList" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="6">
<el-form-item label="任务状态:">
<el-select v-model="queryParams.status" placeholder="请选择任务状态" clearable @change="handleQuery">
<el-option label="待执行" :value="0"></el-option>
<el-option label="执行中" :value="1"></el-option>
<el-option label="已完成" :value="2"></el-option>
<el-option label="失败" :value="3"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="6">
<el-button type="primary" icon="el-icon-search" size="small" @click="handleQuery">查询</el-button>
<el-button icon="el-icon-refresh" size="small" @click="resetQuery">重置</el-button>
<el-button type="success" icon="el-icon-plus" size="small" @click="openAddDialog">新增任务</el-button>
</el-col>
</el-row>
</el-form>
</el-card>
<!-- 任务列表 -->
<el-card class="list-card" v-loading="loading">
<div slot="header" class="clearfix">
<span class="card-title">能源分摊任务列表</span>
</div>
<el-table :data="taskList" stripe border>
<el-table-column prop="taskId" label="任务ID" width="100"></el-table-column>
<el-table-column prop="taskDate" label="任务日期" width="120"></el-table-column>
<el-table-column prop="energyTypeName" label="能源类型" width="100"></el-table-column>
<el-table-column prop="allocationScope" label="分摊范围" width="100"></el-table-column>
<el-table-column prop="status" label="任务状态" width="100">
<template slot-scope="scope">
<el-tag v-if="scope.row.status === 0" type="info">待执行</el-tag>
<el-tag v-else-if="scope.row.status === 1" type="warning">执行中</el-tag>
<el-tag v-else-if="scope.row.status === 2" type="success">已完成</el-tag>
<el-tag v-else type="danger">失败</el-tag>
</template>
</el-table-column>
<el-table-column prop="executeMode" label="执行方式" width="100"></el-table-column>
<el-table-column prop="totalConsumption" label="总消耗量" width="120">
<template slot-scope="scope">
{{ formatNumber(scope.row.totalConsumption, 2) }}
</template>
</el-table-column>
<el-table-column prop="totalCost" label="总成本" width="120">
<template slot-scope="scope">
¥ {{ formatNumber(scope.row.totalCost, 2) }}
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建时间" width="180"></el-table-column>
<el-table-column label="操作" width="200" fixed="right">
<template slot-scope="scope">
<el-button
v-if="scope.row.status === 0 || scope.row.status === 3"
type="primary"
size="mini"
@click="runTask(scope.row)">
执行
</el-button>
<el-button
v-if="scope.row.status === 2"
type="warning"
size="mini"
@click="rerunTask(scope.row)">
重新执行
</el-button>
<el-button type="info" size="mini" @click="viewDetail(scope.row)">详情</el-button>
<el-button type="danger" size="mini" @click="deleteTask(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<el-pagination
:current-page="queryParams.pageNum"
:page-sizes="[10, 20, 50, 100]"
:page-size="queryParams.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
@size-change="handlePageSizeChange"
@current-change="handlePageChange"
style="margin-top: 20px; text-align: right;"
></el-pagination>
</el-card>
<!-- 新增任务对话框 -->
<el-dialog title="新增分摊任务" :visible.sync="addDialogVisible" width="500px" @close="closeAddDialog">
<el-form :model="addForm" label-width="120px" size="small" ref="addFormRef">
<el-form-item label="任务日期:" prop="taskDate">
<el-date-picker v-model="addForm.taskDate" type="date" placeholder="选择任务日期" value-format="yyyy-MM-dd"></el-date-picker>
</el-form-item>
<el-form-item label="能源类型:" prop="energyTypeId">
<el-select v-model="addForm.energyTypeId" placeholder="请选择能源类型(留空则全部)">
<el-option label="全部能源类型" :value="null"></el-option>
<el-option v-for="item in energyTypeList" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="分摊范围:" prop="allocationScope">
<el-select v-model="addForm.allocationScope" placeholder="请选择分摊范围">
<el-option label="按库区" value="warehouse"></el-option>
<el-option label="按仪表" value="meter"></el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="closeAddDialog">取消</el-button>
<el-button type="primary" @click="submitAddTask">确定</el-button>
</span>
</el-dialog>
<!-- 详情对话框 -->
<el-dialog title="任务详情" :visible.sync="detailDialogVisible" width="600px" @close="closeDetailDialog">
<el-descriptions :column="2" border v-if="selectedTask">
<el-descriptions-item label="任务ID">{{ selectedTask.taskId }}</el-descriptions-item>
<el-descriptions-item label="任务日期">{{ selectedTask.taskDate }}</el-descriptions-item>
<el-descriptions-item label="能源类型">{{ selectedTask.energyTypeName }}</el-descriptions-item>
<el-descriptions-item label="分摊范围">{{ selectedTask.allocationScope }}</el-descriptions-item>
<el-descriptions-item label="任务状态">
<el-tag v-if="selectedTask.status === 0" type="info">待执行</el-tag>
<el-tag v-else-if="selectedTask.status === 1" type="warning">执行中</el-tag>
<el-tag v-else-if="selectedTask.status === 2" type="success">已完成</el-tag>
<el-tag v-else type="danger">失败</el-tag>
</el-descriptions-item>
<el-descriptions-item label="执行方式">{{ selectedTask.executeMode }}</el-descriptions-item>
<el-descriptions-item label="总消耗量">{{ formatNumber(selectedTask.totalConsumption, 2) }}</el-descriptions-item>
<el-descriptions-item label="总成本">¥ {{ formatNumber(selectedTask.totalCost, 2) }}</el-descriptions-item>
<el-descriptions-item label="创建时间" :span="2">{{ selectedTask.createTime }}</el-descriptions-item>
<el-descriptions-item label="错误信息" :span="2" v-if="selectedTask.message">
<el-alert :title="selectedTask.message" type="error" :closable="false"></el-alert>
</el-descriptions-item>
</el-descriptions>
</el-dialog>
</div>
</template>
<script>
import { listEnergyTask } from '@/api/ems/energyAllocation'
export default {
name: 'AllocationTask',
data() {
return {
loading: false,
total: 0,
queryParams: {
taskDate: null,
energyTypeId: null,
status: null,
pageNum: 1,
pageSize: 20
},
taskList: [],
energyTypeList: [
{ id: 1, name: '电' },
{ id: 2, name: '水' },
{ id: 3, name: '气' }
],
addDialogVisible: false,
addForm: {
taskDate: null,
energyTypeId: null,
allocationScope: 'warehouse'
},
detailDialogVisible: false,
selectedTask: null
};
},
mounted() {
this.handleQuery();
},
methods: {
handleQuery() {
this.loading = true;
listEnergyTask(this.queryParams).then(response => {
this.taskList = response.rows || [];
this.total = response.total || 0;
}).catch(() => {
this.$message.error('加载任务列表失败');
}).finally(() => {
this.loading = false;
});
},
resetQuery() {
this.queryParams = {
taskDate: null,
energyTypeId: null,
status: null,
pageNum: 1,
pageSize: 20
};
this.handleQuery();
},
handlePageChange(page) {
this.queryParams.pageNum = page;
this.handleQuery();
},
handlePageSizeChange(size) {
this.queryParams.pageSize = size;
this.handleQuery();
},
openAddDialog() {
this.addForm = {
taskDate: null,
energyTypeId: null,
allocationScope: 'warehouse'
};
this.addDialogVisible = true;
},
closeAddDialog() {
this.addDialogVisible = false;
this.$refs.addFormRef && this.$refs.addFormRef.clearValidate();
},
submitAddTask() {
if (!this.addForm.taskDate) {
this.$message.error('请选择任务日期');
return;
}
// TODO: 调用后端API创建任务
this.$message.success('任务创建成功');
this.closeAddDialog();
this.handleQuery();
},
runTask(row) {
this.$confirm('确定要执行该任务吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
// TODO: 调用后端API执行任务
this.$message.success('任务已提交执行');
this.handleQuery();
}).catch(() => {});
},
rerunTask(row) {
this.$confirm('确定要重新执行该任务吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
// TODO: 调用后端API重新执行任务
this.$message.success('任务已重新提交执行');
this.handleQuery();
}).catch(() => {});
},
viewDetail(row) {
this.selectedTask = row;
this.detailDialogVisible = true;
},
closeDetailDialog() {
this.detailDialogVisible = false;
this.selectedTask = null;
},
deleteTask(row) {
this.$confirm('确定删除该任务吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
// TODO: 调用后端API删除任务
this.$message.success('删除成功');
this.handleQuery();
}).catch(() => {});
},
formatNumber(value, decimals = 2) {
if (value === null || value === undefined) return '0.00';
return parseFloat(value).toFixed(decimals);
}
}
};
</script>
<style scoped>
.allocation-task-page {
padding: 20px;
}
.search-card {
margin-bottom: 20px;
}
.list-card {
margin-bottom: 20px;
}
.card-title {
font-size: 16px;
font-weight: bold;
}
.dialog-footer {
text-align: right;
}
</style>