Files
emsfront/src/views/ems/dzjk/clpz/xftg/AddTemplate.vue

317 lines
11 KiB
Vue
Raw Normal View History

2025-06-26 16:49:55 +08:00
<template>
2025-07-13 16:13:45 +08:00
<el-dialog :visible.sync="dialogTableVisible" class="ems-dialog" :title="mode === 'add'?'新增模板':`编辑模板` ">
2025-06-26 16:49:55 +08:00
<el-form ref="addTempForm" :model="formData" :rules="rules" size="medium" label-width="100px">
2025-07-13 16:13:45 +08:00
<el-form-item label="模板名称" prop="templateName">
<el-input v-model="formData.templateName" placeholder="请输入" clearable :style="{width: '100%'}">
2025-06-26 16:49:55 +08:00
</el-input>
</el-form-item>
2025-07-13 16:13:45 +08:00
<el-form-item label="soc限制" prop="sdcLimit" required>
<el-switch :active-value="1" :inactive-value="0" v-model="formData.sdcLimit"></el-switch>
2025-06-26 16:49:55 +08:00
</el-form-item>
2025-07-13 16:13:45 +08:00
<!-- <template v-if="formData.sdcLimit === 1">-->
<el-form-item label="soc下限" prop="sdcDown">
<el-input v-model="formData.sdcDown" placeholder="请输入" clearable :style="{width: '100%'}"></el-input>
</el-form-item>
<el-form-item label="soc上限" prop="sdcUp">
<el-input v-model="formData.sdcUp" placeholder="请输入" clearable :style="{width: '100%'}"></el-input>
</el-form-item>
<!-- </template>-->
2025-06-26 16:49:55 +08:00
</el-form>
<el-button type="primary" size="mini" @click="addTime">新增</el-button>
<!-- 新增时间段表单-->
<el-collapse-transition>
<el-card v-show="showAddTime" shadow="always" class="common-card-container" style="margin-top:25px;">
<el-form class="add-time-form transition-box" ref="addTimeForm" :model="formInline" :rules="formInlineRule" label-width="100px" style="margin-top:25px">
<el-form-item label="开始时间" prop="startTime">
<el-time-select
placeholder="开始时间"
v-model="formInline.startTime"
:picker-options="{
start: '00:00',
step: '01:00',
end: '23:00',
}">
</el-time-select>
</el-form-item>
<el-form-item label="结束时间" prop="endTime">
<el-time-select
placeholder="结束时间"
v-model="formInline.endTime"
:picker-options="{
start: '00:00',
step: '01:00',
2025-07-13 16:13:45 +08:00
end: '23:00',
2025-07-13 17:40:24 +08:00
minTime: formInline.startTime
2025-06-26 16:49:55 +08:00
}">
</el-time-select>
</el-form-item>
2025-07-13 16:13:45 +08:00
<el-form-item label="冲放功率" prop="chargeDischargePower">
<el-input v-model="formInline.chargeDischargePower" placeholder="请输入"></el-input>
2025-06-26 16:49:55 +08:00
</el-form-item>
2025-07-13 16:13:45 +08:00
<el-form-item label="充电状态" prop="chargeStatus">
<el-select v-model="formInline.chargeStatus" placeholder="请选择">
<el-option v-for="(value,key) in chargeStatusOptions" :key="key+'chargeStatusOptions'" :label="value" :value="key"></el-option>
2025-06-26 16:49:55 +08:00
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" size="mini" @click="saveTime">保存</el-button>
<el-button size="mini" @click="cancelAddTime">取消</el-button>
</el-form-item>
</el-form>
</el-card>
</el-collapse-transition>
<el-table
:data="tableData"
border
style="width: 100%;margin-top:25px">
<!-- todo 如果要在span-method中使用column.property 在表格中必须定义prop="xxx"属性-->
<el-table-column
prop="startTime"
label="开始时间">
</el-table-column>
<el-table-column
prop="endTime"
label="结束时间">
</el-table-column>
<el-table-column
2025-07-13 16:13:45 +08:00
prop="chargeDischargePower"
2025-06-26 16:49:55 +08:00
label="充放功率kW">
</el-table-column>
<el-table-column
2025-07-13 16:13:45 +08:00
prop="chargeStatus"
2025-06-26 16:49:55 +08:00
label="充电状态">
<template slot-scope="scope">
2025-07-13 16:13:45 +08:00
{{chargeStatusOptions[scope.row.chargeStatus]}}
2025-06-26 16:49:55 +08:00
</template>
</el-table-column>
<el-table-column
fixed="right"
label="操作"
width="120">
<template slot-scope="scope">
<el-button
@click.native.prevent="deleteRow(scope.$index, tableData)"
type="warning"
size="mini">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<div slot="footer">
<el-button @click="closeDialog">取消</el-button>
<el-button type="primary" @click="saveDialog">确定</el-button>
</div>
</el-dialog>
</template>
<script>
2025-07-13 16:13:45 +08:00
import {mapState} from 'vuex'
import {addStrategyTemp,editStrategyTemp,getStrategyTempDetail} from '@/api/ems/dzjk'
2025-06-26 16:49:55 +08:00
export default {
2025-07-13 16:13:45 +08:00
inject:['$home'],
2025-06-26 16:49:55 +08:00
data() {
return {
2025-07-13 16:13:45 +08:00
mode:'',
editTempId:'',
2025-06-26 16:49:55 +08:00
dialogTableVisible:false,
formData: {
2025-07-13 16:13:45 +08:00
templateName: '',
sdcLimit: false,
sdcDown: '',
sdcUp: '',
2025-06-26 16:49:55 +08:00
},
rules: {
2025-07-13 16:13:45 +08:00
templateName: [{
2025-06-26 16:49:55 +08:00
required: true,
message: '请输入',
trigger: 'blur'
}],
2025-07-13 16:13:45 +08:00
sdcDown: [
{required: true,message: '请输入', trigger: 'blur'},
{ pattern: /^(0|[1-9]\d*)(\.\d+)?$/, message: '请输入合法数字或小数' }
],
sdcUp: [
{required: true,message: '请输入', trigger: 'blur'},
{ pattern: /^(0|[1-9]\d*)(\.\d+)?$/, message: '请输入合法数字或小数' }
],
2025-06-26 16:49:55 +08:00
},
showAddTime: false,
formInline:{
2025-07-13 16:13:45 +08:00
startTime:'',endTime:'',chargeDischargePower:'',chargeStatus:''
2025-06-26 16:49:55 +08:00
},
formInlineRule:{
startTime: [{
required: true,
message: '请选择开始时间',
trigger: 'change'
}],
endTime: [{
required: true,
message: '请选择结束时间',
trigger: 'change'
}],
2025-07-13 16:13:45 +08:00
chargeDischargePower: [{
required: true,
message: '请输入冲放功率',
trigger: 'blur'
},
{ pattern: /^(0|[1-9]\d*)(\.\d+)?$/, message: '请输入合法数字或小数' }
],
chargeStatus:[{
2025-06-26 16:49:55 +08:00
required: true,
2025-07-13 16:13:45 +08:00
message: '请选择充放状态',
trigger: ['blur','change']
}
]
2025-06-26 16:49:55 +08:00
},
tableData:[],
}
},
2025-07-13 16:13:45 +08:00
computed: {
...mapState({
chargeStatusOptions: state => state?.ems?.chargeStatusOptions || {},
})
},
2025-06-26 16:49:55 +08:00
watch: {
"formInline.startTime":{
2025-07-13 17:40:24 +08:00
handler(newVal){
2025-06-26 16:49:55 +08:00
if(newVal && this.formInline.endTime){
const endTime = parseInt((this.formInline.endTime).split(':')[0] || 0)
const startTime =parseInt(newVal.split(':')[0])
if(endTime<=startTime){
this.formInline.endTime = `${startTime+1 <=9 ? '0'+(startTime+1) : startTime+1}:00`
}
}
},
deep:true
2025-07-13 16:13:45 +08:00
},
2025-06-26 16:49:55 +08:00
},
methods: {
2025-07-13 16:13:45 +08:00
changeSiteId(){
this.dialogTableVisible=false
this.mode=''
this.editTempId=''
this.formData={
templateName: '',
sdcLimit: false,
sdcDown: '',
sdcUp: '',
}
this.formInline={
startTime:'',endTime:'',chargeDischargePower:'',chargeStatus:''
}
this.showAddTime = false
this.tableData=[]
},
show({mode = 'add', editTempId = ''}){
this.$nextTick(() => {
this.dialogTableVisible = true
this.mode = mode
this.editTempId=editTempId
if(mode === 'edit' && editTempId){
getStrategyTempDetail(this.editTempId).then(response => {
const data=JSON.parse(JSON.stringify(response?.data || []));
if(data.length>0){
const {templateName,sdcLimit,sdcDown,sdcUp} =JSON.parse(JSON.stringify( data[0]));
this.formData.templateName=templateName
this.formData.sdcLimit=sdcLimit
this.formData.sdcDown=sdcDown
this.formData.sdcUp=sdcUp
}
if(data.length === 1){
const {startTime,endTime}=data;
if(!startTime || !endTime){
this.tableData = []
}else{
this.tableData= data
}
}else{
this.tableData= data
}
})
}
})
},
2025-06-26 16:49:55 +08:00
addTime(){
this.showAddTime=true
},
cancelAddTime(){
this.$refs.addTimeForm.resetFields()
this.showAddTime=false
2025-07-13 16:13:45 +08:00
this.formInline = {startTime:'',endTime:'',chargeDischargePower:'',chargeStatus:''}
2025-06-26 16:49:55 +08:00
},
saveTime(){
//表单校验校验成功添加到tableData里
this.$refs.addTimeForm.validate(valid => {
if (!valid) return
this.tableData.push(JSON.parse(JSON.stringify(this.formInline)));
this.$nextTick(() => {this.cancelAddTime()})
})
},
2025-07-13 17:40:24 +08:00
deleteRow(index){
2025-06-26 16:49:55 +08:00
this.tableData.splice(index,1)
},
saveDialog() {
this.$refs.addTempForm.validate(valid => {
if (!valid) return
2025-07-13 17:40:24 +08:00
//校验时间选择范围是否冲突
let status = true
this.tableData.forEach((outer,outerIndex)=>{
const {startTime, endTime}=outer
const outerStart = parseInt(startTime),outerEnd = parseInt(endTime)
if(outerStart>outerEnd){
status = false
}else{
this.tableData.forEach((inner,innerIndex)=>{
if(innerIndex !== outerIndex){
const {startTime:innerStartTime, endTime:innerEndTime}=inner
const innerStart = parseInt(innerStartTime),innerEnd = parseInt(innerEndTime)
if((innerStart<outerStart && innerEnd>outerEnd) || !((innerStart<outerStart && innerEnd<=outerStart) || (innerStart>=outerEnd && innerEnd>outerEnd))){
status=false
}
}
})
2025-07-13 16:13:45 +08:00
}
})
2025-07-13 17:40:24 +08:00
if(!status){
return this.$message.error('时间选择范围冲突');
}
const {templateName,sdcLimit,sdcDown,sdcUp} = this.formData
const {siteId,updateStrategyId} =this.$home
const {tableData} = this
if(this.mode==='edit'){
editStrategyTemp({siteId,strategyId:updateStrategyId,templateId:this.editTempId,templateName,sdcLimit,sdcDown,sdcUp,timeConfigList:tableData}).then(response=>{
if(response?.code === 200){
this.closeDialog()
this.$emit('update')
this.$emit('updateTimeSetting')
}
})
}else{
addStrategyTemp({siteId,strategyId:updateStrategyId,templateName,sdcLimit,sdcDown,sdcUp,timeConfigList:tableData}).then(response=>{
if(response?.code === 200){
this.closeDialog()
this.$emit('update')
}
})
}
2025-06-26 16:49:55 +08:00
})
},
closeDialog(){
// 清空所有数据
this.$refs.addTempForm.resetFields()
this.formData={
2025-07-13 16:13:45 +08:00
templateName: '',
sdcLimit:0,
sdcDown: '',
sdcUp: '',
2025-06-26 16:49:55 +08:00
}
this.tableData=[]
this.cancelAddTime()
this.dialogTableVisible=false
}
}
}
</script>