This commit is contained in:
ruyinjuan 2025-03-31 10:01:53 +08:00
parent 9761ce29ab
commit df5c821b10
10 changed files with 600 additions and 32 deletions

521
src/api/Gantt/gantt.js Executable file → Normal file
View File

@ -1,26 +1,525 @@
import { defAxios as request } from '@/utils/http'
const baseUrl = `${window.settings.apis}/gantt`
const ddList = {
code: 200,
message: '成功',
data: {
list: [
{
id: 1,
name: '民兵3',
model: null,
countryName: '美国',
remark: null,
children: null,
},
{
id: 2,
name: '三叉戟II',
model: 'D5',
countryName: '美国',
remark: null,
children: null,
},
{
id: 3,
name: '火星-15',
model: null,
countryName: '朝鲜',
remark: null,
children: null,
},
{
id: 4,
name: '东风-5甲',
model: null,
countryName: '中国',
remark: null,
children: null,
},
{
id: 5,
name: '东风-5乙',
model: null,
countryName: '中国',
remark: null,
children: null,
},
{
id: 6,
name: '东风-31',
model: null,
countryName: '中国',
remark: null,
children: null,
},
{
id: 7,
name: 'SS-18“撒旦”',
model: null,
countryName: '俄罗斯',
remark: null,
children: null,
},
{
id: 8,
name: 'M51',
model: null,
countryName: '法国',
remark: null,
children: null,
},
],
},
}
const sub = {
code: 200,
message: '成功',
data: {
list: [
{
id: 1,
name: '飞机',
level: 2,
pid: 1,
children: [
{
id: 2,
name: '轰炸机',
level: 3,
pid: 1,
children: [
{
id: 10,
activityId: 1,
name: '轰炸合计',
equipModel: '歼-15',
describe: null,
reportSite: null,
startTime: '2026-11-30 16:00:00',
endTime: '2025-03-27 16:00:00',
fileUrl:
'/upload/1741082451927/Snipaste_2026-12-26_09-53-15.png',
oneType: 1,
twoType: 2,
twoTypeName: '轰炸机',
level: 4,
pid: 2,
status: 1,
},
],
},
{
id: 1,
name: '战斗机',
level: 3,
pid: 1,
children: [
{
id: 4,
activityId: 1,
name: 'cehi',
equipModel: '歼-15',
describe: null,
reportSite: null,
startTime: '2025-01-31 16:00:00',
endTime: '2025-04-28 16:00:00',
fileUrl:
'/upload/1741078260582/Snipaste_2026-12-26_09-53-15.png',
oneType: 1,
twoType: 1,
twoTypeName: '战斗机',
level: 4,
pid: 1,
status: 1,
},
{
id: 3,
activityId: 1,
name: 'rr',
equipModel: '歼-20',
describe: null,
reportSite: null,
startTime: '2026-12-31 16:00:00',
endTime: '2025-04-09 16:00:00',
fileUrl:
'/upload/1741078034784/Snipaste_2026-12-26_09-53-15.png',
oneType: 1,
twoType: 1,
twoTypeName: '战斗机',
level: 4,
pid: 1,
status: 1,
},
{
id: 2,
activityId: 1,
name: '测试战斗机',
equipModel: 'adsf',
describe: null,
reportSite: null,
startTime: '2025-03-04 16:00:00',
endTime: '2025-04-09 16:00:00',
fileUrl:
'/upload/1741077889066/Snipaste_2026-12-26_09-53-15.png',
oneType: 1,
twoType: 1,
twoTypeName: '战斗机',
level: 4,
pid: 1,
status: 2,
},
{
id: 1,
activityId: 1,
name: '起飞',
equipModel: '歼-20',
describe: '飞机起飞',
reportSite: '北京站',
startTime: '2025-03-03 09:21:34',
endTime: '2025-03-03 09:21:34',
fileUrl: 'https://www.iocoder.cn',
oneType: 1,
twoType: 1,
twoTypeName: '战斗机',
level: 4,
pid: 1,
status: 2,
},
],
},
],
},
{
id: 2,
name: '舰船',
level: 2,
pid: 1,
children: [
{
id: 7,
name: '驱逐舰',
level: 3,
pid: 2,
children: [
{
id: 9,
activityId: 1,
name: '优惠',
equipModel: '歼-15',
describe: null,
reportSite: null,
startTime: '2025-02-28 16:00:00',
endTime: '2025-03-04 16:00:00',
fileUrl:
'/upload/1741080337527/Snipaste_2026-12-26_09-53-15.png',
oneType: 2,
twoType: 7,
twoTypeName: '驱逐舰',
level: 4,
pid: 7,
status: 1,
},
],
},
],
},
{
id: 3,
name: '遥感',
level: 2,
pid: 1,
children: [],
},
{
id: 4,
name: '公开源',
level: 2,
pid: 1,
children: [],
},
{
id: 5,
name: '航警',
level: 2,
pid: 1,
children: [],
},
{
id: 6,
name: '频谱&组网',
level: 2,
pid: 1,
children: [],
},
{
id: 7,
name: '声音&视频&流量&告警',
level: 2,
pid: 1,
children: [],
},
],
},
}
const main = {
code: 200,
message: '成功',
data: {
list: [
{
id: 1,
name: '民兵3',
model: null,
countryName: '美国',
remark: null,
children: [
{
id: 22,
targetId: 1,
name: 'sdfas',
code: null,
describe: 'adfdf',
startTime: '2025-03-05 00:00:00',
endTime: '2025-05-01 00:00:00',
fileUrl: null,
source: null,
publishTime: null,
status: null,
},
{
id: 15,
targetId: 1,
name: '朝鲜发射火星-18洲际弹道导弹事件',
code: null,
describe:
'2025年10月4日朝鲜发射火星-18洲际弹道导弹这是一种固体燃料的洲际弹道导弹。\n导弹发射后美国、日本、韩国强烈谴责认为此举加剧地区紧张同时联合国呼吁朝鲜遵守安理会决议停止导弹试验。',
startTime: '2025-10-03 16:00:00',
endTime: '2025-10-03 16:00:00',
fileUrl: null,
source: null,
publishTime: null,
status: null,
},
{
id: 3,
targetId: 1,
name: '美国民兵3发射试验2',
code: null,
describe: '美国民兵3在太平洋发射试验2',
startTime: '2026-03-05 13:14:58',
endTime: '2026-03-13 13:15:10',
fileUrl: null,
source: null,
publishTime: null,
status: null,
},
{
id: 2,
targetId: 1,
name: '美国民兵3发射试验1',
code: null,
describe: '美国民兵3在太平洋发射试验1',
startTime: '2026-05-04 13:14:05',
endTime: '2026-05-05 13:14:14',
fileUrl: null,
source: null,
publishTime: null,
status: null,
},
{
id: 1,
targetId: 1,
name: '美国民兵3发射试验',
code: null,
describe: '美国民兵3在太平洋发射试验',
startTime: '2025-01-04 13:12:40',
endTime: '2025-01-05 13:12:50',
fileUrl: null,
source: null,
publishTime: null,
status: null,
},
{
id: 12,
targetId: 1,
name: '测试添加---编辑',
code: null,
describe: '测试添加描述---编辑',
startTime: '2025-03-01 00:00:00',
endTime: '2025-03-03 00:00:00',
fileUrl: null,
source: null,
publishTime: null,
status: null,
},
{
id: 21,
targetId: 1,
name: '0307测试事件',
code: null,
describe: '1111111111',
startTime: '2025-03-07 00:00:00',
endTime: '2025-03-07 00:00:00',
fileUrl: null,
source: null,
publishTime: null,
status: null,
},
],
},
],
},
}
const main2 = {
code: 200,
message: '成功',
data: {
list: [
{
id: 1,
name: '民兵3',
model: null,
countryName: '美国',
remark: null,
children: [
{
id: 22,
targetId: 1,
name: 'sdfas123',
code: null,
describe: 'adfdf',
startTime: '2025-03-27 00:00:00',
endTime: '2025-05-01 00:00:00',
fileUrl: null,
source: null,
publishTime: null,
status: null,
},
{
id: 12,
targetId: 1,
name: '测试添加-12--编辑',
code: null,
describe: '测试添加描述---编辑',
startTime: '2025-04-01 00:00:00',
endTime: '2025-04-03 00:00:00',
fileUrl: null,
source: null,
publishTime: null,
status: null,
},
{
id: 21,
targetId: 1,
name: '0307测试12事件',
code: null,
describe: '1111111111',
startTime: '2025-04-07 00:00:00',
endTime: '2025-04-07 00:00:00',
fileUrl: null,
source: null,
publishTime: null,
status: null,
},
{
id: 1,
targetId: 1,
name: '美国民兵3发射12试验',
code: null,
describe: '美国民兵3在太平洋发射试验',
startTime: '2025-06-04 13:12:40',
endTime: '2025-06-05 13:12:50',
fileUrl: null,
source: null,
publishTime: null,
status: null,
},
{
id: 15,
targetId: 1,
name: '朝鲜发射火星-18洲123际弹道导弹事件',
code: null,
describe:
'2025年10月4日朝鲜发射火星-18洲际弹道导弹这是一种固体燃料的洲际弹道导弹。\n导弹发射后美国、日本、韩国强烈谴责认为此举加剧地区紧张同时联合国呼吁朝鲜遵守安理会决议停止导弹试验。',
startTime: '2025-10-03 16:00:00',
endTime: '2025-10-03 16:00:00',
fileUrl: null,
source: null,
publishTime: null,
status: null,
},
{
id: 3,
targetId: 1,
name: '美国民兵3发射试123验2',
code: null,
describe: '美国民兵3在太平洋发射试验2',
startTime: '2026-03-05 13:14:58',
endTime: '2026-03-13 13:15:10',
fileUrl: null,
source: null,
publishTime: null,
status: null,
},
{
id: 2,
targetId: 1,
name: '美国民兵3发射123试验1',
code: null,
describe: '美国民兵3在太平洋发射试验1',
startTime: '2026-05-04 13:14:05',
endTime: '2026-05-05 13:14:14',
fileUrl: null,
source: null,
publishTime: null,
status: null,
},
],
},
],
},
}
export function getDDList() {
return request({
url: `${baseUrl}/gantt/target-info/simp-list`,
method: 'get',
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(ddList)
}, 200)
})
// return request({
// url: `${baseUrl}/gantt/target-info/simp-list`,
// method: 'get',
// })
}
export function getMainGantt(data = {}) {
return request({
url: `${baseUrl}/gantt/target-info/gantt-list`,
method: 'post',
data,
return new Promise((resolve, reject) => {
setTimeout(() => {
if (data.status === 1) {
resolve(main)
} else {
resolve(main2)
}
}, 200)
})
// return request({
// url: `${baseUrl}/gantt/target-info/gantt-list`,
// method: 'post',
// data,
// })
}
export function getSubGantt(params) {
return request({
url: `${baseUrl}/gantt/activity-event/gantt-list`,
method: 'get',
params,
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(sub)
}, 200)
})
// return request({
// url: `${baseUrl}/gantt/activity-event/gantt-list`,
// method: 'get',
// params,
// })
}

0
src/api/Gantt/index.js Executable file → Normal file
View File

0
src/assets/fonts/digital.ttf Executable file → Normal file
View File

View File

@ -0,0 +1,13 @@
<script lang="ts">
import { useDialog } from 'naive-ui'
import { defineComponent } from 'vue'
// content
export default defineComponent({
setup() {
window.$dialog = useDialog()
},
})
</script>
<template></template>

View File

@ -4,6 +4,7 @@ export const useTree = () => {
getAllKeys,
getLeafNodeIds,
getLeafNode,
getTimeRangeForTree,
}
}
@ -72,3 +73,36 @@ function getLeafNode(tree) {
return leafNodes
}
function getTimeRangeForTree(tree) {
let earliestStartTime = null
let latestEndTime = null
function traverse(node) {
if ('startTime' in node) {
const nodeStartTime = new Date(node.startTime).getTime()
const nodeEndTime = new Date(node.endTime).getTime()
if (
earliestStartTime === null ||
nodeStartTime < new Date(earliestStartTime).getTime()
) {
earliestStartTime = node.startTime
}
if (
latestEndTime === null ||
nodeEndTime > new Date(latestEndTime).getTime()
) {
latestEndTime = node.endTime
}
}
if (
node.children &&
Array.isArray(node.children) &&
node.children.length > 0
) {
node.children.forEach(child => traverse(child))
}
}
tree.forEach(rootNode => traverse(rootNode))
return [earliestStartTime, latestEndTime]
}

View File

@ -26,6 +26,7 @@ const useGantt = ({ router, route }: GanttParams) => {
const timeRange = ref([])
const plans = ref()
const happen = ref()
// onMounted(() => {
// getGanttData()
// })
@ -83,12 +84,12 @@ const useGantt = ({ router, route }: GanttParams) => {
const date = new Date(mainEvent.startTime)
const year = date.getFullYear()
const month = date.getMonth()
//const startOfMonth = new Date(year, month, 1)
const startOfMonth = new Date(year, month, mainEvent.startTime)
const startOfMonth = new Date(year, month, 1)
// const startOfMonth = new Date(year, month, mainEvent.startTime)
startOfMonth.setHours(0, 0, 0, 0)
// const lastDayOfMonth = new Date(year, month + 1, 0)
const lastDayOfMonth = new Date(year, month ,mainEvent.startTime)
const lastDayOfMonth = new Date(year, month + 1, 0)
// const lastDayOfMonth = new Date(year, month ,mainEvent.startTime)
const endOfMonth = new Date(
year,
month,
@ -230,7 +231,7 @@ const useGantt = ({ router, route }: GanttParams) => {
const columns = [
{
field: 'name',
title: subId ? '事件类型' : '事件主体',
title: subId ? '目标' : '事件主体',
width: '120',
mergeCell: true,
customLayout: args => {
@ -284,12 +285,12 @@ const useGantt = ({ router, route }: GanttParams) => {
},
]
if (subId) {
columns.unshift({
field: 'parentName',
title: '事件分类',
width: '120',
mergeCell: true,
})
// columns.unshift({
// field: 'parentName',
// title: '事件分类',
// width: '120',
// mergeCell: true,
// })
// columns.unshift({
// field: 'isChecked',
// title: '',
@ -538,7 +539,7 @@ const useGantt = ({ router, route }: GanttParams) => {
})
container.add(end)
// 事件条
if (plans.value == 'hour') {
if (happen.value == 2) {
const rect = new Rect({
width: width,
height: 7,
@ -609,8 +610,9 @@ const useGantt = ({ router, route }: GanttParams) => {
return new Image(opt)
}
function changeTimeScales(scale: TYPES.ITimelineScale['unit']) {
function changeTimeScales(scale: TYPES.ITimelineScale['unit'], val: number) {
plans.value = scale
happen.value = val
const scales = getTimeScales(scale)
ganttInstance && ganttInstance.updateScales(scales)
}

View File

@ -8,7 +8,11 @@ export default defineComponent({
props: {
scale: {
type: String,
default: 'day',
default: 'year',
},
happen: {
type: Number,
default: 1,
},
dateRange: {
type: Array,
@ -61,6 +65,7 @@ export default defineComponent({
ids: props.types,
startTime: props.dateRange ? props.dateRange[0] : null,
endTime: props.dateRange ? props.dateRange[1] : null,
status: props.happen, //12
})
stopRefresh()
@ -72,7 +77,13 @@ export default defineComponent({
watch(
() => props.scale,
val => {
changeTimeScales(val)
changeTimeScales(val, props.happen)
}
)
watch(
() => props.happen,
val => {
changeTimeScales(props.scale, val)
}
)
@ -90,6 +101,7 @@ export default defineComponent({
ids: props.types,
startTime: props.dateRange ? props.dateRange[0] : null,
endTime: props.dateRange ? props.dateRange[1] : null,
status: props.happen, //12
})
updateMarkLine()

View File

@ -2,7 +2,7 @@ import { Group, Image, Text, CheckBox, Rect } from '@visactor/vtable/es/vrender'
import { useDialog } from 'naive-ui'
import { Gantt, tools, TYPES } from '@visactor/vtable-gantt'
import { getMainGantt, getSubGantt } from '@/api/Gantt'
import { getMainGantt, getSubGantt } from '@/api/Gantt/gantt'
type GanttParams = {
route?: any

View File

@ -13,8 +13,8 @@ import { onBeforeMount } from 'vue'
export default defineComponent({
setup() {
const range = ref([new Date('2000-01-01 00:00:00').getTime(), Date.now()])
//const value = ref('year')
const value = ref('day')
const happen = ref(1)
const types = ref([])
const router = useRouter()
@ -40,6 +40,9 @@ export default defineComponent({
function searchGanttData() {
ganttRef.value.refresh = true
}
function changeHappen() {
range.value = [Date.now(), new Date('2027-01-01 00:00:00').getTime()]
}
return () => (
<>
@ -54,9 +57,13 @@ export default defineComponent({
<NRadioButton value="hour" label="日" />
<NRadioButton value="day" label="月" />
</NRadioGroup> */}
<NRadioGroup v-model:value={value.value} name="radiobuttongroup">
<NRadioButton value="hour" label="已发生" />
<NRadioButton value="day" label="未来计划" />
<NRadioGroup
v-model:value={happen.value}
name="radiobuttongroup"
onChange={changeHappen}
>
<NRadioButton value={1} label="已发生" />
<NRadioButton value={2} label="未来计划" />
</NRadioGroup>
<NSelect
v-model:value={types.value}
@ -76,6 +83,7 @@ export default defineComponent({
<GanttCom
ref={ganttRef}
scale={value.value}
happen={happen.value}
dateRange={range.value}
types={types.value}
/>

View File

@ -1,6 +1,6 @@
import { NForm, NFormItem, NInput, NDataTable, NButton } from 'naive-ui'
import ModalCom from '@/components/Modal/index.vue'
import { getMainGantt } from '@/api/gantt'
import { getMainGantt } from '@/api/Gantt/gantt'
import useTask from './hooks'
export default defineComponent({
// props: {