问题列表修改

This commit is contained in:
pengjunchao 2026-07-27 10:18:13 +08:00
parent 3572fe2c11
commit f2053c4375
16 changed files with 272 additions and 83 deletions

View File

@ -253,8 +253,8 @@
background-color: #409eff !important; /* 高亮色,与背景区分 */ background-color: #409eff !important; /* 高亮色,与背景区分 */
} }
.el-select-dropdown .el-select-dropdown__item.selected { .el-select-dropdown .el-select-dropdown__item.selected, .el-select-dropdown .el-select-dropdown__item.is-selected {
background-color: #409eff !important; /* 选中色 */ background-color: #297CD1 !important; /* 选中色 */
} }
.el-popper { .el-popper {

View File

@ -45,7 +45,8 @@ export interface mapRightMenu {
pointData?: () => void; pointData?: () => void;
// 二三维切换 // 二三维切换
ts3D?: () => void; ts3D?: () => void;
// gif
gif?: () => void;
} }
// 定位参数接口 // 定位参数接口

View File

@ -67,6 +67,7 @@ export function setMultiplier(num: number) {
// 设置动画时间 // 设置动画时间
export function setAnimationTime(opt: any) { export function setAnimationTime(opt: any) {
if (olClock && opt) { if (olClock && opt) {
if (!opt.startTime || !opt.endTime) { return }
olClock.startTime = JulianDate.fromDate(new Date(opt.startTime)); olClock.startTime = JulianDate.fromDate(new Date(opt.startTime));
olClock.currentTime = JulianDate.fromDate(new Date(opt.startTime)); olClock.currentTime = JulianDate.fromDate(new Date(opt.startTime));
olClock.stopTime = JulianDate.fromDate(new Date(opt.endTime)); olClock.stopTime = JulianDate.fromDate(new Date(opt.endTime));

View File

@ -4,15 +4,20 @@
import type { LocateParams, MapControlItem } from '@/gis/ol/interface/common'; import type { LocateParams, MapControlItem } from '@/gis/ol/interface/common';
import { domFullscreenStatus } from '@/gis/common/domHandle'; import { domFullscreenStatus } from '@/gis/common/domHandle';
import { mapRightMenuEvent } from '@/gis/ol/olRightMenu'; import { mapRightMenuEvent } from '@/gis/ol/olRightMenu';
import { getGif } from "@/utils/axios/symn";
// //
const isShowLocate = ref(false); const isShowLocate = ref(false);
const locate = ref<LocateParams>({ const locate = ref<LocateParams>({
lon: null, lon: null,
lat: null, lat: null,
}); });
// gif
const isShowGif = ref(false);
const gifSrc = ref('');
const gifParams = ref({ taskId: '', speciesId: '' });
// //
const baseList = ref<MapControlItem[]>([ const baseList = ref<MapControlItem[]>([
{ {
@ -88,7 +93,7 @@ const baseList = ref<MapControlItem[]>([
}, },
{ {
name: 'zoomOut', name: 'zoomOut',
isMargin: true, isMargin: false,
tooltip: '缩小', tooltip: '缩小',
isActive: false, isActive: false,
activeName: 'zoomOut', activeName: 'zoomOut',
@ -128,6 +133,17 @@ const yxcjTool = ref<MapControlItem[]>([
]); ]);
//
const symnTool = ref<MapControlItem[]>([
{
name: 'gif',
isMargin: false,
tooltip: 'GIF',
isActive: false,
activeName: 'gif',
}
]);
// //
const svgList = ref<MapControlItem[]>([...baseList.value]); const svgList = ref<MapControlItem[]>([...baseList.value]);
// //
@ -183,6 +199,14 @@ function handleIconClick(item: MapControlItem) {
falg, falg,
}); });
} }
// gif
else if (item.name === 'gif') {
getGif(gifParams.value,(res: any) => {
gifSrc.value = window.FSXConfig.VUE_APP_SERVER_IP + res;
isShowGif.value = true;
});
}
// //
else { else {
// //
@ -254,9 +278,10 @@ onMounted(() => {
// //
if (res.key === 'baseList') { if (res.key === 'baseList') {
svgList.value = [...baseList.value]; svgList.value = [...baseList.value];
} } else if (res.key === 'allList') {
else if (res.key === 'allList') {
svgList.value = [...baseList.value, ...yxcjTool.value]; svgList.value = [...baseList.value, ...yxcjTool.value];
} else if (res.key === 'gifIcon') {
svgList.value = [...baseList.value, ...symnTool.value];
} }
// //
if (res.key === 'dataExport') { // if (res.key === 'dataExport') { //
@ -266,6 +291,12 @@ onMounted(() => {
switchIconActive(res.key, res.falg); switchIconActive(res.key, res.falg);
} }
}); });
EventBusTool.getEventBus().subscribe('speciesChange', (res: any) => {
if (res.key === 'speciesId') {
gifParams.value = res.data;
}
});
}); });
</script> </script>
@ -301,6 +332,12 @@ onMounted(() => {
</el-col> </el-col>
</el-row> </el-row>
</Dialog> </Dialog>
<Dialog v-model="isShowGif" title="GIF" width="1340" class="config-dialog" style="min-height: 120px" @close="isShowGif=false">
<img v-if="isShowGif" :src="gifSrc" alt="GIF" style="width: 100%">
<a v-if="gifSrc" :href="gifSrc" download="gif" class="download-icon">
<el-icon size="20"><Download /></el-icon>
</a>
</Dialog>
</template> </template>
<style lang="less" scoped> <style lang="less" scoped>
@ -350,4 +387,25 @@ onMounted(() => {
} }
} }
} }
.download-icon {
position: absolute;
bottom: 20px;
right: 20px;
width: 40px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
background-color: rgba(0,0,0,0.2);
cursor: pointer;
color: black;
&:hover {
background-color: rgba(0,0,0,0.3);
}
&:active {
background-color: rgba(0,0,0,0.4);
}
}
</style> </style>

View File

@ -76,7 +76,7 @@ const isQueryData = ref<boolean>(true);
const marskType = ref<string>('hour'); const marskType = ref<string>('hour');
const start = ref<any>(dayjs('2025-09-15 00:00:00')); const start = ref<any>(dayjs('2025-09-15 00:00:00'));
const end = ref<any>(dayjs('2025-09-16 00:00:00')); const end = ref<any>(dayjs('2025-09-16 00:00:00'));
const totalHours = ref<number>(end.value.diff(start, marskType.value)); const totalHours = ref<number>(end.value.diff(start.value, marskType.value));
const value = ref<number>(0); const value = ref<number>(0);
const playFalg = ref<boolean>(false); const playFalg = ref<boolean>(false);
const slodtooltip: any = (toolNum: number) => { const slodtooltip: any = (toolNum: number) => {
@ -270,6 +270,13 @@ function setStartAndEndTime(param: any) {
// updateTimeLabel(start.value.valueOf()); // updateTimeLabel(start.value.valueOf());
} }
const speciesValueChange = () => {
EventBusTool.getEventBus().publish('speciesChange', {
key: 'speciesId',
data: { taskId: props.taskId, speciesId: speciesValue.value },
});
};
// speciesList // speciesList
watch( watch(
() => props.speciesList, () => props.speciesList,
@ -278,6 +285,10 @@ watch(
console.log(newVal); console.log(newVal);
speciesValue.value = newVal[0].value; speciesValue.value = newVal[0].value;
EventBusTool.getEventBus().publish('speciesChange', {
key: 'speciesId',
data: { taskId: props.taskId, speciesId: newVal[0].value },
});
} }
else { else {
speciesValue.value = null; speciesValue.value = null;
@ -353,7 +364,7 @@ onMounted(() => {
<el-select-v2 v-if="props.activeMenu === '核事件模拟'" v-model="layerValue" :disabled="!isQueryData" <el-select-v2 v-if="props.activeMenu === '核事件模拟'" v-model="layerValue" :disabled="!isQueryData"
:options="props.layerList" placeholder="请选择图层" style="width: 230px" /> :options="props.layerList" placeholder="请选择图层" style="width: 230px" />
<el-select-v2 v-if="props.activeMenu === '输运模拟' && speciesValue" v-model="speciesValue" :disabled="!isQueryData" <el-select-v2 v-if="props.activeMenu === '输运模拟' && speciesValue" v-model="speciesValue" :disabled="!isQueryData"
:options="props.speciesList" placeholder="请选择物种" style="width: 230px" /> :options="props.speciesList" placeholder="请选择物种" style="width: 230px" @change="speciesValueChange" />
</div> </div>
<div v-if="isShowTabs" class="tabs"> <div v-if="isShowTabs" class="tabs">
<div v-for="(v, i) in tabsList" :key="i" class="tabItem" :class="{ active: v.isActive }" @click="switchTab(v)"> <div v-for="(v, i) in tabsList" :key="i" class="tabItem" :class="{ active: v.isActive }" @click="switchTab(v)">
@ -367,6 +378,7 @@ onMounted(() => {
<SvgIcon name="stop" title="停止" width="34" height="34" /> <SvgIcon name="stop" title="停止" width="34" height="34" />
</div> </div>
<div class="slider"> <div class="slider">
<div style="color: white">value:{{ value }} ----- totalHours:{{ totalHours }}</div>
<el-slider v-model="value" :disabled="isDisabledSlider" <el-slider v-model="value" :disabled="isDisabledSlider"
:style="{ width: isShowTabs ? (props.sliderWidth ?? '58vw') : '62vw' }" :max="totalHours" :style="{ width: isShowTabs ? (props.sliderWidth ?? '58vw') : '62vw' }" :max="totalHours"
:format-tooltip="slodtooltip" :marks="marks" @input="handleChange" /> :format-tooltip="slodtooltip" :marks="marks" @input="handleChange" />

View File

@ -103,6 +103,7 @@ export class X6Graph {
// 1. 配置同步字段:新增“配置”菜单项 // 1. 配置同步字段:新增“配置”菜单项
const configItem = document.createElement('div'); const configItem = document.createElement('div');
configItem.id = 'ant-x6-menu-1';
configItem.style.cssText = ` configItem.style.cssText = `
padding: 6px 12px; padding: 6px 12px;
cursor: pointer; cursor: pointer;
@ -197,6 +198,7 @@ export class X6Graph {
// 2. 配置同步数量 // 2. 配置同步数量
const syncNumItem = document.createElement('div'); const syncNumItem = document.createElement('div');
syncNumItem.id = 'ant-x6-menu-2';
syncNumItem.style.cssText = ` syncNumItem.style.cssText = `
padding: 6px 12px; padding: 6px 12px;
cursor: pointer; cursor: pointer;
@ -226,6 +228,7 @@ export class X6Graph {
// 3. 原有“删除”菜单项(保持不变,调整顺序在配置项下方) // 3. 原有“删除”菜单项(保持不变,调整顺序在配置项下方)
const deleteItem = document.createElement('div'); const deleteItem = document.createElement('div');
deleteItem.id = 'ant-x6-menu-3';
deleteItem.style.cssText = ` deleteItem.style.cssText = `
padding: 6px 12px; padding: 6px 12px;
cursor: pointer; cursor: pointer;
@ -356,6 +359,14 @@ export class X6Graph {
if (!nodeData.level) { if (!nodeData.level) {
return; return;
} }
if (nodeData.level === 'level2') {
} else if (nodeData.level === 'level3') {
} else if (nodeData.level === 'level4') {
}
// 显示菜单(位置为点击坐标) // 显示菜单(位置为点击坐标)
this.showMenu(node.id, e.clientX, e.clientY); this.showMenu(node.id, e.clientX, e.clientY);
}); });

View File

@ -368,7 +368,7 @@ function handleSave() {
}); });
emit('cancel'); emit('cancel');
} }
}); }, 30 * 60 * 1000);
} }
else { else {
ElMessage({ ElMessage({
@ -392,18 +392,19 @@ function handleCancel() {
<ElFormItem :label="t('mode')"> <ElFormItem :label="t('mode')">
<ElSelect v-model="formData.mode" style="width: 220px" multiple :max-collapse-tags="0" collapse-tags <ElSelect v-model="formData.mode" style="width: 220px" multiple :max-collapse-tags="0" collapse-tags
collapse-tags-tooltip filterable :placeholder="t('pleaseSelect')" class="custom-select" collapse-tags-tooltip filterable :placeholder="t('pleaseSelect')" class="custom-select"
allow-create default-first-option :reserve-keyword="false"
@change="handleModeChange"> @change="handleModeChange">
<ElOption v-for="(item, index) in modeList" :key="index" :label="item.label" :value="item.value" /> <ElOption v-for="(item, index) in modeList" :key="index" :label="item.label" :value="item.value" />
</ElSelect> </ElSelect>
</ElFormItem> </ElFormItem>
<ElFormItem label="手动输入模式" v-show="!formData.mode || !formData.mode.length"> <!--<ElFormItem label="手动输入模式" v-show="!formData.mode || !formData.mode.length">
<div style="display: flex; align-items: center;"> <div style="display: flex; align-items: center;">
<ElInput v-model="manualModeInput" style="width: 160px" placeholder="输入模式名" @keyup.enter="handleAddMode" /> <ElInput v-model="manualModeInput" style="width: 160px" placeholder="输入模式名" @keyup.enter="handleAddMode" />
<ElButton type="primary" style="margin-left: 4px; height: 34px; border-radius: 4px;" @click="handleAddMode"> <ElButton type="primary" style="margin-left: 4px; height: 34px; border-radius: 4px;" @click="handleAddMode">
添加 添加
</ElButton> </ElButton>
</div> </div>
</ElFormItem> </ElFormItem>-->
<ElFormItem :label="t('dataTable')"> <ElFormItem :label="t('dataTable')">
<ElSelect ref="level3" v-model="formData.dataValue" style="width: 220px" multiple :max-collapse-tags="0" <ElSelect ref="level3" v-model="formData.dataValue" style="width: 220px" multiple :max-collapse-tags="0"
collapse-tags collapse-tags-tooltip filterable :placeholder="t('pleaseSelect')" class="custom-select" collapse-tags collapse-tags-tooltip filterable :placeholder="t('pleaseSelect')" class="custom-select"

View File

@ -9,11 +9,12 @@ import targetIconB from '@/assets/icon/targetIconB.svg';
import { setAnimationTime, setMultiplier } from '@/gis/ol/olClock'; import { setAnimationTime, setMultiplier } from '@/gis/ol/olClock';
import { classInstances } from '@/gis/ol/olHandleEntry'; import { classInstances } from '@/gis/ol/olHandleEntry';
import { sendPlaybackPostMassage } from '@/gis/worker/playbackWorkerMa'; import { sendPlaybackPostMassage } from '@/gis/worker/playbackWorkerMa';
import { add, deleteData, edit, getAllNuclearfacility, getAllStations,getReleaseDataByForwardId,saveSiteAndReleaseData,delSiteAndReleaseData, getById, getData, getTaskLog, resume, exportTemplate, importFile, pinToTopOrUnpin } from '@/utils/axios/symn'; import { add, deleteData, edit, getAllNuclearfacility, getAllStations,getReleaseDataByForwardId,saveSiteAndReleaseData,delSiteAndReleaseData, getById, getData, getTaskLog, resume, exportTemplate, importFile, pinToTop, unpin } from '@/utils/axios/symn';
import fhdfx from './compliance/index.vue'; import fhdfx from './compliance/index.vue';
import gxfx from './contribution/index.vue'; import gxfx from './contribution/index.vue';
import log from './log/index.vue'; import log from './log/index.vue';
import sxfx from './timingAnalysis/index.vue'; import sxfx from './timingAnalysis/index.vue';
import {activeMoudleInf} from "@/gis/ol";
const { t, locale } = useI18n(); const { t, locale } = useI18n();
const formEl = ref<FormInstance>(); const formEl = ref<FormInstance>();
@ -147,13 +148,13 @@ interface OptionItem {
value: number; value: number;
} }
const taskStatusList = ref<OptionItem[]>([ const taskStatusList = ref<OptionItem[]>([
// -101234 // -101234
{ label: '执行失败', value: -1 }, { label: '执行失败', value: -1 },
{ label: '未开始', value: 0 }, { label: '未开始', value: 0 },
{ label: '等待中', value: 1 }, { label: '等待中', value: 1 },
{ label: '运行中', value: 2 }, { label: '运行中', value: 2 },
{ label: '已完成', value: 3 }, { label: '已完成', value: 3 },
{ label: '任务检查未通过', value: 4 }, { label: '检查未通过', value: 4 },
]); ]);
function handleClose() { function handleClose() {
@ -255,15 +256,25 @@ function clearChild() {
childList.splice(0); childList.splice(0);
} }
// //
const pinToTopTask = (row: any) => { const pinToTopTask = (row: any, isPin: boolean) => {
pinToTopOrUnpin({ id: row.id }, (res) => { if (!isPin) {
pinToTop({ taskId: row.id }, (res) => {
if (res.code === 200) { if (res.code === 200) {
ElMessage.success('操作成功!'); ElMessage.success('置顶成功!');
getList(); getList();
} }
}); });
} else {
unpin({ taskId: row.id }, (res) => {
if (res.code === 200) {
ElMessage.success('取消置顶成功!');
getList();
}
});
}
}; };
function viewTask(task: any) { function viewTask(task: any) {
debugger
console.log('查看任务:', task); console.log('查看任务:', task);
handleClose(); handleClose();
form.value = { form.value = {
@ -281,6 +292,11 @@ function viewTask(task: any) {
key: 'isQueryData', key: 'isQueryData',
value: true, value: true,
}); });
if (task.taskMode === 1) {
EventBusTool.getEventBus().publish('mapRightMenuUIEvent', {
key: 'gifIcon'
});
}
// //
classInstances.olTarget?.clearMarkers(); classInstances.olTarget?.clearMarkers();
@ -546,7 +562,7 @@ function handleSizeChangeLog(val: number) {
} }
function handleCurrentChangeLog(val: number) { function handleCurrentChangeLog(val: number) {
console.log(`current page: ${val}`); console.log(`current page: ${val}`);
currentPage.value = val; currentPageLog.value = val;
getTaskLog({ getTaskLog({
taskId: logId.value, taskId: logId.value,
pageNum:currentPageLog.value, pageNum:currentPageLog.value,
@ -646,6 +662,9 @@ watch(drawerVisible, (newValue) => {
console.log('抽屉状态变化:', newValue); console.log('抽屉状态变化:', newValue);
if (newValue === false) { if (newValue === false) {
dialogVisible.value = true; dialogVisible.value = true;
EventBusTool.getEventBus().publish('mapRightMenuUIEvent', {
key: 'baseList'
});
} }
}); });
@ -960,7 +979,7 @@ getStations();
<el-input v-if="form.taskStatus === 1" value="等待中" /> <el-input v-if="form.taskStatus === 1" value="等待中" />
<el-input v-if="form.taskStatus === 2" value="运行中" /> <el-input v-if="form.taskStatus === 2" value="运行中" />
<el-input v-if="form.taskStatus === 3" value="已完成" /> <el-input v-if="form.taskStatus === 3" value="已完成" />
<el-input v-if="form.taskStatus === 4" value="任务检查未通过" /> <el-input v-if="form.taskStatus === 4" value="检查未通过" />
</el-form-item> </el-form-item>
<el-form-item :label="t('dataSource')"> <el-form-item :label="t('dataSource')">
<el-input v-if="form.useMetType === 1" value="盘古模型" /> <el-input v-if="form.useMetType === 1" value="盘古模型" />
@ -1158,7 +1177,7 @@ getStations();
<div v-if="scope.row.taskStatus === 1" style="color:#ffcb40;">等待中</div> <div v-if="scope.row.taskStatus === 1" style="color:#ffcb40;">等待中</div>
<div v-if="scope.row.taskStatus === 2" style="color:#ffcb40;">运行中</div> <div v-if="scope.row.taskStatus === 2" style="color:#ffcb40;">运行中</div>
<div v-if="scope.row.taskStatus === 3" style="color:#2af442;">已完成</div> <div v-if="scope.row.taskStatus === 3" style="color:#2af442;">已完成</div>
<div v-if="scope.row.taskStatus === 4" style="color:#f42a2a;">任务检查未通过</div> <div v-if="scope.row.taskStatus === 4" style="color:#f42a2a;">检查未通过</div>
</template> </template>
</ElTableColumn> </ElTableColumn>
<ElTableColumn :label="t('dataSource')"> <ElTableColumn :label="t('dataSource')">
@ -1196,40 +1215,44 @@ getStations();
<ElTableColumn prop="createTime" :label="t('creationTime')" /> <ElTableColumn prop="createTime" :label="t('creationTime')" />
<ElTableColumn :label="t('operation')" width="330"> <ElTableColumn :label="t('operation')" width="330">
<template #default="scope"> <template #default="scope">
<ElButton v-if="scope.row.taskStatus === 1" type="text" class="table-btn" @click="pinToTopTask(scope)"> <ElButton v-if="scope.row.taskStatus === 1" type="text" class="table-btn" @click="pinToTopTask(scope, scope.topTask)">
{{ true ? t('pinToTop') : t('unpin') }} {{ !scope.topTask ? t('pinToTop') : t('unpin') }}
</ElButton> </ElButton>
<ElButton v-else type="text" style="color:#588589;cursor:no-drop"> <ElButton v-else type="text" style="color:#588589;cursor:no-drop">
{{ true ? t('pinToTop') : t('unpin') }} {{ !scope.topTask ? t('pinToTop') : t('unpin') }}
</ElButton> </ElButton>
<!-- -1执行失败0未开始1等待中2运行中3已完成4任务检查未通过--> <!-- -1执行失败0未开始1等待中2运行中3已完成4检查未通过-->
<!--任务处于等待中运行中状态时不能编辑和删除处于未开始已完成检查未通过时可以删除处于已完成状态时也不能编辑--> <!--任务处于等待中运行中状态时不能编辑和删除处于未开始已完成检查未通过时可以删除处于已完成状态时也不能编辑-->
<ElButton type="text" class="custom-text-btn" @click="viewTask(scope.row)"> <ElButton v-if="scope.row.taskStatus === -1 || scope.row.taskStatus === 0 || scope.row.taskStatus === 4" type="text" class="custom-text-btn" @click="start(scope.row.id)">
{{ t('startOperation') }}
</ElButton>
<ElButton v-else type="text" style="color:#588589;cursor:no-drop">
{{ t('startOperation') }}
</ElButton>
<ElButton v-if="scope.row.taskStatus === 3" type="text" class="custom-text-btn" @click="viewTask(scope.row)">
{{ t('view') }} {{ t('view') }}
</ElButton> </ElButton>
<ElButton v-if="scope.row.taskStatus !== 1 && scope.row.taskStatus !== 2 && scope.row.taskStatus !== 3" type="text" class="custom-text-btn" @click="editTask(scope.row, scope.$index)"> <ElButton v-else type="text" style="color:#588589;cursor:no-drop">
{{ t('view') }}
</ElButton>
<ElButton v-if="scope.row.taskStatus === -1 || scope.row.taskStatus === 0 && scope.row.taskStatus === 4" type="text" class="custom-text-btn" @click="editTask(scope.row, scope.$index)">
{{ t('edit') }} {{ t('edit') }}
</ElButton> </ElButton>
<ElButton v-else type="text" style="color:#588589;cursor:no-drop"> <ElButton v-else type="text" style="color:#588589;cursor:no-drop">
{{ t('edit') }} {{ t('edit') }}
</ElButton> </ElButton>
<ElButton v-if="scope.row.taskStatus == 0 || scope.row.taskStatus === 3 || scope.row.taskStatus === 4" type="text" class="custom-text-btn" @click="deleteTask(scope.row)"> <ElButton v-if="scope.row.taskStatus == -1 || scope.row.taskStatus == 0 || scope.row.taskStatus === 3 || scope.row.taskStatus === 4" type="text" class="custom-text-btn" @click="deleteTask(scope.row)">
{{ t('delete') }} {{ t('delete') }}
</ElButton> </ElButton>
<ElButton v-else type="text" style="color:#588589;cursor:no-drop"> <ElButton v-else type="text" style="color:#588589;cursor:no-drop">
{{ t('delete') }} {{ t('delete') }}
</ElButton> </ElButton>
<ElButton type="text" class="custom-text-btn" @click="showLog(scope.row.id)"> <ElButton v-if="scope.row.taskStatus === -1 || scope.row.taskStatus === 0 || scope.row.taskStatus === 1 || scope.row.taskStatus === 2 || scope.row.taskStatus === 3 || scope.row.taskStatus === 4" type="text" class="custom-text-btn" @click="showLog(scope.row.id)">
{{ t('operationLog') }} {{ t('operationLog') }}
</ElButton> </ElButton>
<ElButton v-if="scope.row.taskStatus === 2 || scope.row.taskStatus === 1" type="text" <ElButton v-else type="text" style="color:#588589;cursor:no-drop">
style="color:#588589;cursor:no-drop"> {{ t('operationLog') }}
{{ t('startOperation') }}
</ElButton> </ElButton>
<ElButton v-else type="text" class="custom-text-btn" @click="start(scope.row.id)">
{{ t('startOperation') }}
</ElButton>
</template> </template>
</ElTableColumn> </ElTableColumn>

View File

@ -5,6 +5,7 @@ import { gisImgOpt, tqycAnimationType, weathFlag } from '@/gis/ol/index';
import { playbackSearchData, weatherDataLine, weatherPreview } from '@/utils/axios/tqyb/data/index'; import { playbackSearchData, weatherDataLine, weatherPreview } from '@/utils/axios/tqyb/data/index';
import tab1 from './tab-1/index.vue'; import tab1 from './tab-1/index.vue';
import tab2 from './tab-2/index.vue'; import tab2 from './tab-2/index.vue';
import tab3 from './tab-3/index.vue';
import WindRose from './WindRose.vue'; import WindRose from './WindRose.vue';
const { t } = useI18n(); const { t } = useI18n();
@ -238,7 +239,7 @@ onMounted(() => {
<tab2 v-if="tabActive === '公开气象数据'" type="gkqx" @playback="handleSendData" @preview="weatherPreviewHandle" /> <tab2 v-if="tabActive === '公开气象数据'" type="gkqx" @playback="handleSendData" @preview="weatherPreviewHandle" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane :label="t('associateMeteorologicalData')" name="关联气象数据"> <el-tab-pane :label="t('associateMeteorologicalData')" name="关联气象数据">
建设中... <tab3 />
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</Dialog> </Dialog>

View File

@ -42,13 +42,13 @@ interface OptionItem {
value: number; value: number;
} }
const taskStatusList = ref<OptionItem[]>([ const taskStatusList = ref<OptionItem[]>([
// -101234 // -101234
{ label: '执行失败', value: -1 }, { label: '执行失败', value: -1 },
{ label: '未开始', value: 0 }, { label: '未开始', value: 0 },
{ label: '等待中', value: 1 }, { label: '等待中', value: 1 },
{ label: '运行中', value: 2 }, { label: '运行中', value: 2 },
{ label: '已完成', value: 3 }, { label: '已完成', value: 3 },
{ label: '任务检查未通过', value: 4 }, { label: '检查未通过', value: 4 },
]); ]);
function search() { function search() {
@ -509,7 +509,7 @@ getList();
<div v-if="scope.row.taskStatus === 1" style="color:#ffcb40;">等待中</div> <div v-if="scope.row.taskStatus === 1" style="color:#ffcb40;">等待中</div>
<div v-if="scope.row.taskStatus === 2" style="color:#ffcb40;">运行中</div> <div v-if="scope.row.taskStatus === 2" style="color:#ffcb40;">运行中</div>
<div v-if="scope.row.taskStatus === 3" style="color:#2af442;">已完成</div> <div v-if="scope.row.taskStatus === 3" style="color:#2af442;">已完成</div>
<div v-if="scope.row.taskStatus === 4" style="color:#f42a2a;">任务检查未通过</div> <div v-if="scope.row.taskStatus === 4" style="color:#f42a2a;">检查未通过</div>
</template> </template>
</ElTableColumn> </ElTableColumn>
<ElTableColumn prop="model" :label="t('predictionModel')"> <ElTableColumn prop="model" :label="t('predictionModel')">
@ -568,7 +568,7 @@ getList();
<ElButton v-else type="text" style="color:#588589;cursor:no-drop"> <ElButton v-else type="text" style="color:#588589;cursor:no-drop">
{{ true ? t('pinToTop') : t('unpin') }} {{ true ? t('pinToTop') : t('unpin') }}
</ElButton> </ElButton>
<!-- -1执行失败0未开始1等待中2运行中3已完成4任务检查未通过--> <!-- -1执行失败0未开始1等待中2运行中3已完成4检查未通过-->
<!--任务处于等待中运行中状态时不能编辑和删除处于未开始已完成检查未通过时可以删除处于已完成状态时也不能编辑--> <!--任务处于等待中运行中状态时不能编辑和删除处于未开始已完成检查未通过时可以删除处于已完成状态时也不能编辑-->
<ElButton v-if="scope.row.taskStatus === 0 || scope.row.taskStatus === -1" type="text" class="custom-text-btn" <ElButton v-if="scope.row.taskStatus === 0 || scope.row.taskStatus === -1" type="text" class="custom-text-btn"
@click="start(scope.row, scope.$index)"> @click="start(scope.row, scope.$index)">

View File

@ -99,7 +99,7 @@ function getList() {
}]; }];
} }
if (propsWithDefaults.type === 'gkqx') { if (propsWithDefaults.type === 'gkqx') {
dataS = '6'; dataS = '';
selectOption.value = [{ selectOption.value = [{
value: '6', value: '6',
label: 't1h', label: 't1h',
@ -408,6 +408,9 @@ getList();
</ElSelect> </ElSelect>
<el-date-picker v-model="pickerValue" unlink-panels type="datetimerange" :default-time="new Date()" <el-date-picker v-model="pickerValue" unlink-panels type="datetimerange" :default-time="new Date()"
range-separator="至" :start-placeholder="t('startDate')" :end-placeholder="t('endDate')" range-separator="至" :start-placeholder="t('startDate')" :end-placeholder="t('endDate')"
:disabled-minutes="() => Array.from({ length: 60 }, (_, i) => i)"
:disabled-seconds="() => Array.from({ length: 60 }, (_, i) => i)"
value-format="YYYY-MM-DD HH:00:00"
:disabled-hours="disabledHour" /> :disabled-hours="disabledHour" />
</div> </div>

View File

@ -9,6 +9,11 @@ import { nextTick, onMounted, ref, watch } from 'vue';
import { useECharts } from '@/hooks/useECharts'; import { useECharts } from '@/hooks/useECharts';
// import axios from 'axios' // import axios from 'axios'
import { getBivariate } from '@/utils/axios/yxcj'; import { getBivariate } from '@/utils/axios/yxcj';
const props = defineProps({
taskId: Number,
});
// ======================== 1. ======================== // ======================== 1. ========================
interface DataPoint { interface DataPoint {
lon: number; // lon: number; //
@ -224,7 +229,7 @@ const { updateChart: startAndStopChartStruUpdate } = useECharts({
}); });
function getlist() { function getlist() {
getBivariate({ taskId: 8 }, (result) => { getBivariate({ taskId: props.taskId }, (result) => {
// axios.get('/mokedata.json').then(result => { // axios.get('/mokedata.json').then(result => {
console.log(result); console.log(result);
const res = result.result; const res = result.result;

View File

@ -5,7 +5,7 @@ import { ElButton, ElCol, ElDatePicker, ElForm, ElFormItem, ElInput, ElLoading,
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import Table from '@/components/Table/index.vue'; import Table from '@/components/Table/index.vue';
import { activeMoudleInf } from '@/gis/ol/index'; import { activeMoudleInf } from '@/gis/ol/index';
import { createTask, deleteTask as deleteData, exportAcTimeSeriesTxt, exportBayesProbLocTxt, exportBivariateTxt, exportTemplate, exportUnivariateTxt, getBayesProbLoc, getById, getIdDetail, getPage, getTaskLog, importTask, runTask, updateTask, pinToTopOrUnpin } from '@/utils/axios/yxcj'; import { createTask, deleteTask as deleteData, exportAcTimeSeriesTxt, exportBayesProbLocTxt, exportBivariateTxt, exportTemplate, exportUnivariateTxt, getBayesProbLoc, getById, getIdDetail, getPage, getTaskLog, importTask, runTask, updateTask, pinToTop, unpin } from '@/utils/axios/yxcj';
import { transformLogData } from '@/utils/index'; import { transformLogData } from '@/utils/index';
import { exportCharts } from '@/utils/index'; // import { exportCharts } from '@/utils/index'; //
import scatter from './dbvarScatter/index.vue'; import scatter from './dbvarScatter/index.vue';
@ -108,6 +108,7 @@ const exportFlag = ref('');
const monOrAnaObj = ref(); const monOrAnaObj = ref();
const dbScatterObj = ref(); const dbScatterObj = ref();
const univarBanObj = ref(); const univarBanObj = ref();
const uploadButtonShow = ref(false);
// watch // watch
watch(drawerVisible, (newValue) => { watch(drawerVisible, (newValue) => {
@ -123,13 +124,13 @@ interface OptionItem {
} }
const taskStatusList = ref<OptionItem[]>([ const taskStatusList = ref<OptionItem[]>([
// -101234 // -101234
{ label: '执行失败', value: -1 }, { label: '执行失败', value: -1 },
{ label: '未开始', value: 0 }, { label: '未开始', value: 0 },
{ label: '等待中', value: 1 }, { label: '等待中', value: 1 },
{ label: '运行中', value: 2 }, { label: '运行中', value: 2 },
{ label: '已完成', value: 3 }, { label: '已完成', value: 3 },
{ label: '任务检查未通过', value: 4 }, { label: '检查未通过', value: 4 },
]); ]);
const releaseTypeList = ref<OptionItem[]>([ const releaseTypeList = ref<OptionItem[]>([
{ label: '持续释放', value: 1 }, { label: '持续释放', value: 1 },
@ -418,6 +419,12 @@ function getDetail(id: string) {
}); });
} }
function viewDetail(row: any) { function viewDetail(row: any) {
if (row.id) {
uploadButtonShow.value = true
} else {
uploadButtonShow.value = false
}
viewDetailVisible.value = true; viewDetailVisible.value = true;
getDetail(form.value?.id || row.id); getDetail(form.value?.id || row.id);
} }
@ -440,13 +447,22 @@ function getData(id: string) {
}); });
} }
// //
const pinToTopTask = (row: any) => { const pinToTopTask = (row: any, isPin: boolean) => {
pinToTopOrUnpin({ id: row.id }, (res) => { if (!isPin) {
pinToTop({ taskId: row.id }, (res) => {
if (res.code === 200) { if (res.code === 200) {
ElMessage.success('操作成功!'); ElMessage.success('置顶成功!');
getList(); getList();
} }
}); });
} else {
unpin({ taskId: row.id }, (res) => {
if (res.code === 200) {
ElMessage.success('取消置顶成功!');
getList();
}
});
}
}; };
// //
function runTaskId(row: any) { function runTaskId(row: any) {
@ -890,6 +906,9 @@ onMounted(() => {
v-model="viewDetailVisible" :title="t('view')" width="61vw" class="view-dialog" v-model="viewDetailVisible" :title="t('view')" width="61vw" class="view-dialog"
@close="viewDetailVisible = false" @close="viewDetailVisible = false"
> >
<!--<ElFormItem :label="t('upload')" style="width: 40%;">-->
<ElButton v-if="uploadButtonShow" type="default" class="custom-btn" style="margin-bottom: 6px;" @click="listUpload">{{ t('upload') }}abc</ElButton>
<!--</ElFormItem>-->
<Table <Table
class="table" :show-index="true" :table-data="detailData" :table-header="detailColumns" class="table" :show-index="true" :table-data="detailData" :table-header="detailColumns"
:select-options="selectOptions" :page="pageNum" :select-options="selectOptions" :page="pageNum"
@ -909,7 +928,7 @@ onMounted(() => {
</ElCol> </ElCol>
<ElCol :span="5"> <ElCol :span="5">
<ElFormItem :label="t('taskStatus')" style="margin-bottom: 0;"> <ElFormItem :label="t('taskStatus')" style="margin-bottom: 0;">
<ElSelect v-model="queryForm.taskStatus" :placeholder="t('pleaseSelect')" @change="handleTaskStatusChange"> <ElSelect v-model="queryForm.taskStatus" clearable :placeholder="t('pleaseSelect')" @change="handleTaskStatusChange">
<ElOption v-for="item in taskStatusList" :key="item.value" :label="item.label" :value="item.value" style="background-color: transparent;" /> <ElOption v-for="item in taskStatusList" :key="item.value" :label="item.label" :value="item.value" style="background-color: transparent;" />
</ElSelect> </ElSelect>
</ElFormItem> </ElFormItem>
@ -950,33 +969,33 @@ onMounted(() => {
@pagination="handlePagination" @pagination="handlePagination"
> >
<template #operate="{ scope }"> <template #operate="{ scope }">
<ElButton v-if="scope.taskStatus === 1" type="text" class="table-btn" @click="pinToTopTask(scope)"> <ElButton v-if="scope.taskStatus === 1" type="text" class="table-btn" @click="pinToTopTask(scope, scope.topTask)">
{{ true ? t('pinToTop') : t('unpin') }} {{ !scope.topTask ? t('pinToTop') : t('unpin') }}
</ElButton> </ElButton>
<ElButton v-else type="text" style="color:#588589;cursor:no-drop"> <ElButton v-else type="text" style="color:#588589;cursor:no-drop">
{{ true ? t('pinToTop') : t('unpin') }} {{ !scope.topTask ? t('pinToTop') : t('unpin') }}
</ElButton> </ElButton>
<!-- -1执行失败0未开始1等待中2运行中3已完成4任务检查未通过--> <!-- -1执行失败0未开始1等待中2运行中3已完成4检查未通过-->
<!--任务处于等待中运行中状态时不能编辑和删除处于未开始已完成检查未通过时可以删除处于已完成状态时也不能编辑--> <!--任务处于等待中运行中状态时不能编辑和删除处于未开始已完成检查未通过时可以删除处于已完成状态时也不能编辑-->
<ElButton v-if="scope.taskStatus === 0" type="text" class="table-btn" @click="runTaskId(scope)"> <ElButton v-if="scope.taskStatus === -1 || scope.taskStatus === 0 || scope.taskStatus === 4" type="text" class="table-btn" @click="runTaskId(scope)">
{{ t('start') }} {{ t('start') }}
</ElButton> </ElButton>
<ElButton v-else type="text" style="color:#588589;cursor:no-drop"> <ElButton v-else type="text" style="color:#588589;cursor:no-drop">
{{ t('start') }} {{ t('start') }}
</ElButton> </ElButton>
<ElButton v-if="scope.taskStatus === 2" type="text" class="table-btn" @click="viewTask(scope)"> <ElButton v-if="scope.taskStatus === 3" type="text" class="table-btn" @click="viewTask(scope)">
{{ t('view') }} {{ t('view') }}
</ElButton> </ElButton>
<ElButton v-else type="text" style="color:#588589;cursor:no-drop"> <ElButton v-else type="text" style="color:#588589;cursor:no-drop">
{{ t('view') }} {{ t('view') }}
</ElButton> </ElButton>
<ElButton v-if="scope.taskStatus !== 1 && scope.taskStatus !== 2 && scope.taskStatus !== 3" type="text" class="table-btn" @click="editTask(scope)"> <ElButton v-if="scope.taskStatus === -1 || scope.taskStatus === 0 || scope.taskStatus === 4" type="text" class="table-btn" @click="editTask(scope)">
{{ t('edit') }} {{ t('edit') }}
</ElButton> </ElButton>
<ElButton v-else type="text" style="color:#588589;cursor:no-drop"> <ElButton v-else type="text" style="color:#588589;cursor:no-drop">
{{ t('edit') }} {{ t('edit') }}
</ElButton> </ElButton>
<ElButton v-if="scope.taskStatus == 0 || scope.taskStatus === 3 || scope.taskStatus === 4" type="text" class="table-btn" @click="deleteTask(scope)"> <ElButton v-if="scope.taskStatus === -1 || scope.taskStatus === 0 || scope.taskStatus === 3 || scope.taskStatus === 4" type="text" class="table-btn" @click="deleteTask(scope)">
{{ t('delete') }} {{ t('delete') }}
</ElButton> </ElButton>
<ElButton v-else type="text" style="color:#588589;cursor:no-drop"> <ElButton v-else type="text" style="color:#588589;cursor:no-drop">
@ -988,10 +1007,16 @@ onMounted(() => {
<ElButton v-else type="text" style="color:#588589;cursor:no-drop"> <ElButton v-else type="text" style="color:#588589;cursor:no-drop">
{{ t('upload') }} {{ t('upload') }}
</ElButton>--> </ElButton>-->
<ElButton type="text" class="table-btn" @click="getLog(scope)"> <ElButton v-if="scope.taskStatus === -1 || scope.taskStatus === 0 || scope.taskStatus === 1 || scope.taskStatus === 2 || scope.taskStatus === 3 || scope.taskStatus === 4" type="text" class="table-btn" @click="getLog(scope)">
{{ t('operationLog') }} {{ t('operationLog') }}
</ElButton> </ElButton>
<ElButton type="text" class="table-btn" @click="viewDetail(scope)"> <ElButton v-else type="text" style="color:#588589;cursor:no-drop">
{{ t('operationLog') }}
</ElButton>
<ElButton v-if="scope.taskStatus === -1 || scope.taskStatus === 0 || scope.taskStatus === 1 || scope.taskStatus === 2 || scope.taskStatus === 3 || scope.taskStatus === 4" type="text" class="table-btn" @click="viewDetail(scope)">
{{ t('monitoringData') }}
</ElButton>
<ElButton v-else type="text" style="color:#588589;cursor:no-drop">
{{ t('monitoringData') }} {{ t('monitoringData') }}
</ElButton> </ElButton>
</template> </template>
@ -1014,7 +1039,7 @@ onMounted(() => {
<ElFormItem :label="t('taskName')" prop="taskName" style="width: 40%;"> <ElFormItem :label="t('taskName')" prop="taskName" style="width: 40%;">
<ElInput v-model="detailForm.taskName" :placeholder="t('pleaseEnter')" /> <ElInput v-model="detailForm.taskName" :placeholder="t('pleaseEnter')" />
</ElFormItem> </ElFormItem>
<ElFormItem :label="t('taskStatus')" prop="taskStatus" style="width: 40%;"> <ElFormItem v-if="!(taskFlag==='add' || taskFlag==='edit')" :label="t('taskStatus')" prop="taskStatus" style="width: 40%;">
<ElSelect v-model="detailForm.taskStatus" :placeholder="t('pleaseSelect')" disabled> <ElSelect v-model="detailForm.taskStatus" :placeholder="t('pleaseSelect')" disabled>
<ElOption v-for="item in taskStatusList" :key="item.value" :label="item.label" :value="item.value" /> <ElOption v-for="item in taskStatusList" :key="item.value" :label="item.label" :value="item.value" />
</ElSelect> </ElSelect>
@ -1087,10 +1112,6 @@ onMounted(() => {
<ElInput v-model="detailForm.sourceStrength" type="number" :placeholder="t('pleaseEnter')" /> <ElInput v-model="detailForm.sourceStrength" type="number" :placeholder="t('pleaseEnter')" />
</ElFormItem> </ElFormItem>
<ElFormItem :label="t('upload')" style="width: 40%;">
<ElButton type="default" class="custom-btn" @click="listUpload">{{ t('upload') }}</ElButton>
</ElFormItem>
<!-- <ElFormItem label="耗时"> <!-- <ElFormItem label="耗时">
<ElInput v-model="detailForm.time" :placeholder="t('pleaseEnter')" /> <ElInput v-model="detailForm.time" :placeholder="t('pleaseEnter')" />
</ElFormItem> --> </ElFormItem> -->

View File

@ -81,16 +81,33 @@ export async function delSiteAndReleaseData(params: any, callback?: (data: any)
} }
/** /**
* @method * @method
* @param {string} [params.id] - id * @param {string} [params.id] - id
* @returns {Promise<any>} * @returns {Promise<any>}
*/ */
export async function pinToTopOrUnpin(params: { export async function pinToTop(params: {
id: string; taskId: string;
}, callback?: (data: any) => void): Promise<any> { }, callback?: (data: any) => void): Promise<any> {
const response = await request({ const response = await request({
url: `${serverIp}${baseURL}/source/uuuuuuuuuu`, url: `${serverIp}${baseURL}/transportTask/setTaskTop`,
method: 'GET', method: 'PUT',
params,
});
// 执行回调(如果存在)
callback?.(response);
}
/**
* @method
* @param {string} [params.id] - id
* @returns {Promise<any>}
*/
export async function unpin(params: {
taskId: string;
}, callback?: (data: any) => void): Promise<any> {
const response = await request({
url: `${serverIp}${baseURL}/transportTask/setCancelTaskTop`,
method: 'PUT',
params, params,
}); });
// 执行回调(如果存在) // 执行回调(如果存在)
@ -428,3 +445,19 @@ export async function importFile(
callback?.(response.result); callback?.(response.result);
} }
} }
/**
* gif
*/
export async function getGif(param: any, callback?: (data: any) => void): Promise<any> {
const response = await request({
url: `${serverIp}${baseURL}/transportResult/getTaskGifAddr`,
method: 'GET',
params: param,
});
// 执行回调(如果存在)
if (callback && typeof callback === 'function') {
callback(response.result);
}
}

View File

@ -235,11 +235,13 @@ export async function targetSourceUser(params: any, callback?: (data: any) => vo
export async function createTargetTables( export async function createTargetTables(
data: any, data: any,
callback?: (data: any) => void, callback?: (data: any) => void,
timeout?: number,
): Promise<any> { ): Promise<any> {
const response = await request({ const response = await request({
url: `${serverIp}${baseURL}/syncStrategy/createTargetTables`, url: `${serverIp}${baseURL}/syncStrategy/createTargetTables`,
method: 'POST', method: 'POST',
data, data,
timeout: timeout || 300000
}); });
if (response.success && response.code === 200) { if (response.success && response.code === 200) {

View File

@ -211,16 +211,33 @@ export async function deleteTask(params: {
} }
/** /**
* @method * @method
* @param {string} [params.id] - id * @param {string} [params.id] - id
* @returns {Promise<any>} * @returns {Promise<any>}
*/ */
export async function pinToTopOrUnpin(params: { export async function pinToTop(params: {
id: string; taskId: string;
}, callback?: (data: any) => void): Promise<any> { }, callback?: (data: any) => void): Promise<any> {
const response = await request({ const response = await request({
url: `${serverIp}${baseURL}/source/xxxxxxxxx`, url: `${serverIp}${baseURL}/source/setTaskTop`,
method: 'GET', method: 'PUT',
params,
});
// 执行回调(如果存在)
callback?.(response);
}
/**
* @method
* @param {string} [params.id] - id
* @returns {Promise<any>}
*/
export async function unpin(params: {
taskId: string;
}, callback?: (data: any) => void): Promise<any> {
const response = await request({
url: `${serverIp}${baseURL}/source/setCancelTaskTop`,
method: 'PUT',
params, params,
}); });
// 执行回调(如果存在) // 执行回调(如果存在)