import { defineStore } from 'pinia'
|
import { ref } from 'vue'
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
import { createSimData } from '@/api/trApi';
|
import dayjs from 'dayjs'
|
|
export const SimAPIStore = defineStore('SimAPI', () => {
|
|
// 定时器
|
const shouldPoll = ref(false)
|
|
const selectTab = ref("行政区划仿真")
|
|
const isLoading = ref(false)
|
|
const handleClickTab = (data) => {
|
selectTab.value = data
|
}
|
|
// 获取区域类型
|
const getAreaType = (tabName) => {
|
switch (tabName) {
|
case '行政区划仿真': return 1
|
case '重点区域仿真': return 2
|
case '重点沟仿真': return 3
|
default: return 0
|
}
|
}
|
|
// 验证表单
|
const validateForm = (forms) => {
|
if (!forms?.name) {
|
ElMessage.warning('请输入方案名称')
|
return false
|
}
|
|
if (forms.type === 1 || forms.type === 3) {
|
if (!forms.geom) {
|
ElMessage.warning('请选择模拟区域')
|
return false
|
}
|
if (!forms.rainfall && !forms.intensity && !forms.duration && (forms.rainfall.length > 0 && !forms.intensityUnit)) {
|
ElMessage.warning('请确保表单均已填写');
|
return false;
|
}
|
}
|
if (forms.type === 2) {
|
if (!forms.geom) {
|
ElMessage.warning('请选择模拟区域')
|
return false
|
}
|
if (forms.gauges.length === 0) {
|
ElMessage.warning('请选择雨量计设备')
|
return false
|
}
|
}
|
return true
|
}
|
|
// 保存方案逻辑
|
const saveScheme = async (forms) => {
|
if (isLoading.value) {
|
ElMessage.warning('正在保存,请稍候...')
|
return
|
}
|
|
isLoading.value = true
|
|
try {
|
const params = {
|
geom: forms.geom.value,
|
areaName: forms.geom.label,
|
areaType: getAreaType(selectTab.value),
|
createTime: Date.now(),
|
name: forms.name,
|
type: forms.type,
|
status: 0,
|
data: JSON.stringify({
|
startTime: Array.isArray(forms.hours)
|
? dayjs(forms.hours[0]).format("YYYY-MM-DD HH:mm:ss")
|
: dayjs(forms.hours).format("YYYY-MM-DD HH:mm:ss"),
|
type: forms.type,
|
total: parseFloat(forms.rainfall),
|
duration: parseFloat(forms.duration),
|
intensity: parseFloat(forms.intensity),
|
prediction: forms.prediction,
|
history: forms.history,
|
mode: forms.mode,
|
gauges: forms.gauges,
|
rainfalls: forms.rainFallList,
|
// intensityUnit: forms.intensityUnit
|
intensityUnit: forms.intensityUnit || 'mm/15min'
|
})
|
}
|
// console.log(params, '保存方案参数')
|
const res = await createSimData(params)
|
ElMessage.success('方案保存成功')
|
return res
|
} catch (error) {
|
console.error('保存失败:', error)
|
ElMessage.error('保存失败: ' + (error.message || '请稍后重试'))
|
throw error
|
} finally {
|
isLoading.value = false
|
}
|
}
|
|
// 保存方案弹窗
|
const addSimCheme = async (forms) => {
|
// 表单验证
|
if (!validateForm(forms)) {
|
throw new Error('表单验证未通过'); // 抛出错误,阻止继续执行
|
}
|
|
try {
|
await ElMessageBox.confirm('确定要保存当前方案吗?', '新建方案', {
|
confirmButtonText: '确定',
|
cancelButtonText: '取消',
|
})
|
// 用户确认后执行保存,并返回结果
|
const res = await saveScheme(forms); // 执行保存并接收结果
|
return res; // 返回保存的结果
|
} catch (error) {
|
if (error !== 'cancel') {
|
console.error('保存出错:', error)
|
ElMessage.error('保存过程中出现错误')
|
} else {
|
ElMessage.info('已取消保存')
|
}
|
throw error // 保证外部能捕获到错误
|
}
|
}
|
|
|
|
return {
|
selectTab,
|
isLoading,
|
shouldPoll,
|
handleClickTab,
|
addSimCheme,
|
saveScheme,
|
}
|
})
|