feat:新增了gantt,新增天气显示,header组件
This commit is contained in:
		
							parent
							
								
									167b49ea00
								
							
						
					
					
						commit
						f7e20bca6a
					
				@ -7,13 +7,13 @@
 | 
				
			|||||||
    <!-- <script src="baseConfig.js"></script> -->
 | 
					    <!-- <script src="baseConfig.js"></script> -->
 | 
				
			||||||
    <!-- <script src="GV/thirdParty/thirdParty.js"></script> -->
 | 
					    <!-- <script src="GV/thirdParty/thirdParty.js"></script> -->
 | 
				
			||||||
    <!-- <script src="GV/GEOVIS.web.js"></script> -->
 | 
					    <!-- <script src="GV/GEOVIS.web.js"></script> -->
 | 
				
			||||||
    <script src="baseConfig.js"></script>
 | 
					    <script src="/baseConfig.js"></script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <!-- <link href="GV/thirdParty/CesiumManager/Widgets/widgets.css" /> -->
 | 
					    <!-- <link href="GV/thirdParty/CesiumManager/Widgets/widgets.css" /> -->
 | 
				
			||||||
    <script src="js/Cesium/Cesium.js"></script>
 | 
					    <script src="/js/Cesium/Cesium.js"></script>
 | 
				
			||||||
    <link rel="stylesheet" href="js/Cesium/Widgets/widgets.css" />
 | 
					    <link rel="stylesheet" href="/js/Cesium/Widgets/widgets.css" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <script src="js/cesium-sensor-volumes.js"></script>
 | 
					    <script src="/js/cesium-sensor-volumes.js"></script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <title>Vite App</title>
 | 
					    <title>Vite App</title>
 | 
				
			||||||
  </head>
 | 
					  </head>
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										3086
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										3086
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -15,6 +15,8 @@
 | 
				
			|||||||
    "@cesium-extends/heat": "^1.0.3",
 | 
					    "@cesium-extends/heat": "^1.0.3",
 | 
				
			||||||
    "@cesium-extends/subscriber": "^1.1.0",
 | 
					    "@cesium-extends/subscriber": "^1.1.0",
 | 
				
			||||||
    "@turf/turf": "^7.1.0",
 | 
					    "@turf/turf": "^7.1.0",
 | 
				
			||||||
 | 
					    "@visactor/vtable": "^1.13.2",
 | 
				
			||||||
 | 
					    "@visactor/vtable-gantt": "^1.13.2",
 | 
				
			||||||
    "@vueuse/core": "^9.9.0",
 | 
					    "@vueuse/core": "^9.9.0",
 | 
				
			||||||
    "@wenrenfangge/cesium-draw": "^1.0.4",
 | 
					    "@wenrenfangge/cesium-draw": "^1.0.4",
 | 
				
			||||||
    "axios": "^1.2.1",
 | 
					    "axios": "^1.2.1",
 | 
				
			||||||
@ -42,6 +44,7 @@
 | 
				
			|||||||
    "@vicons/tabler": "^0.12.0",
 | 
					    "@vicons/tabler": "^0.12.0",
 | 
				
			||||||
    "@vitejs/plugin-legacy": "^4.0.1",
 | 
					    "@vitejs/plugin-legacy": "^4.0.1",
 | 
				
			||||||
    "@vitejs/plugin-vue": "^4.0.0",
 | 
					    "@vitejs/plugin-vue": "^4.0.0",
 | 
				
			||||||
 | 
					    "@vitejs/plugin-vue-jsx": "^4.1.1",
 | 
				
			||||||
    "@vue/eslint-config-prettier": "^7.0.0",
 | 
					    "@vue/eslint-config-prettier": "^7.0.0",
 | 
				
			||||||
    "@vue/eslint-config-typescript": "^11.0.0",
 | 
					    "@vue/eslint-config-typescript": "^11.0.0",
 | 
				
			||||||
    "@vue/tsconfig": "^0.1.3",
 | 
					    "@vue/tsconfig": "^0.1.3",
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										
											BIN
										
									
								
								public/images/icons/base/weather.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								public/images/icons/base/weather.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 1.7 KiB  | 
							
								
								
									
										346
									
								
								src/api/Gantt/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										346
									
								
								src/api/Gantt/index.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,346 @@
 | 
				
			|||||||
 | 
					const main = [
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: 0,
 | 
				
			||||||
 | 
					    name: '任务-1',
 | 
				
			||||||
 | 
					    start: '2024-11-15',
 | 
				
			||||||
 | 
					    end: '2024-11-21',
 | 
				
			||||||
 | 
					    children: [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 1,
 | 
				
			||||||
 | 
					        name: '事件-1-1',
 | 
				
			||||||
 | 
					        start: '2024-11-15',
 | 
				
			||||||
 | 
					        end: '2024-11-17',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/wolf.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 2,
 | 
				
			||||||
 | 
					        name: '事件-1-2',
 | 
				
			||||||
 | 
					        start: '2024-11-17',
 | 
				
			||||||
 | 
					        end: '2024-11-18',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/bear.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 3,
 | 
				
			||||||
 | 
					        name: '事件-1-3',
 | 
				
			||||||
 | 
					        start: '2024-11-19',
 | 
				
			||||||
 | 
					        end: '2024-11-20',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/bear.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 4,
 | 
				
			||||||
 | 
					        name: '事件-1-4',
 | 
				
			||||||
 | 
					        start: '2024-11-18',
 | 
				
			||||||
 | 
					        end: '2024-11-19',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/wolf.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: 300,
 | 
				
			||||||
 | 
					    name: '任务-2',
 | 
				
			||||||
 | 
					    children: [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 5,
 | 
				
			||||||
 | 
					        name: '事件-2-1',
 | 
				
			||||||
 | 
					        start: '2024-11-18',
 | 
				
			||||||
 | 
					        end: '2024-11-21',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/rabbit.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    name: '任务-3',
 | 
				
			||||||
 | 
					    children: [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 6,
 | 
				
			||||||
 | 
					        name: '事件-3-1',
 | 
				
			||||||
 | 
					        start: '2024-11-21',
 | 
				
			||||||
 | 
					        end: '2024-11-22',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/cat.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 7,
 | 
				
			||||||
 | 
					        name: '事件-3-2',
 | 
				
			||||||
 | 
					        start: '2024-11-18',
 | 
				
			||||||
 | 
					        end: '2024-11-19',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/flower.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    name: '任务-4',
 | 
				
			||||||
 | 
					    children: [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 8,
 | 
				
			||||||
 | 
					        name: '事件-4-1',
 | 
				
			||||||
 | 
					        start: '2024-11-20',
 | 
				
			||||||
 | 
					        end: '2024-11-21',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/bear.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 9,
 | 
				
			||||||
 | 
					        name: '事件-4-2',
 | 
				
			||||||
 | 
					        start: '2024-11-25',
 | 
				
			||||||
 | 
					        end: '2024-11-26',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/wolf.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 10,
 | 
				
			||||||
 | 
					        name: '事件-4-3',
 | 
				
			||||||
 | 
					        start: '2024-11-17',
 | 
				
			||||||
 | 
					        end: '2024-11-18',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/bear.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 11,
 | 
				
			||||||
 | 
					        name: '事件-4-4',
 | 
				
			||||||
 | 
					        start: '2024-11-22',
 | 
				
			||||||
 | 
					        end: '2024-11-25',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/wolf.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 12,
 | 
				
			||||||
 | 
					        name: '事件-4-5',
 | 
				
			||||||
 | 
					        start: '2024-11-23',
 | 
				
			||||||
 | 
					        end: '2024-11-24',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/bear.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    name: '任务-5',
 | 
				
			||||||
 | 
					    children: [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 13,
 | 
				
			||||||
 | 
					        name: '事件-5-1',
 | 
				
			||||||
 | 
					        start: '2024-11-22',
 | 
				
			||||||
 | 
					        end: '2024-11-25',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/rabbit.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 14,
 | 
				
			||||||
 | 
					        name: '事件-5-2',
 | 
				
			||||||
 | 
					        start: '2024-11-27',
 | 
				
			||||||
 | 
					        end: '2024-11-30',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/cat.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 15,
 | 
				
			||||||
 | 
					        name: '事件-5-3',
 | 
				
			||||||
 | 
					        start: '2024-12-10',
 | 
				
			||||||
 | 
					        end: '2024-12-18',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/flower.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    name: '任务-6',
 | 
				
			||||||
 | 
					    children: [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 16,
 | 
				
			||||||
 | 
					        name: '事件-6-1',
 | 
				
			||||||
 | 
					        start: '2024-11-20',
 | 
				
			||||||
 | 
					        end: '2024-11-30',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/bear.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 17,
 | 
				
			||||||
 | 
					        name: '事件-6-2',
 | 
				
			||||||
 | 
					        start: '2024-12-02',
 | 
				
			||||||
 | 
					        end: '2024-12-18',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/wolf.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    name: '任务-7',
 | 
				
			||||||
 | 
					    children: [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 18,
 | 
				
			||||||
 | 
					        name: '事件-7-1',
 | 
				
			||||||
 | 
					        start: '2024-12-22',
 | 
				
			||||||
 | 
					        end: '2024-12-28',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/rabbit.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    name: '任务-8',
 | 
				
			||||||
 | 
					    children: [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 19,
 | 
				
			||||||
 | 
					        name: '事件-8-1',
 | 
				
			||||||
 | 
					        start: '2024-11-25',
 | 
				
			||||||
 | 
					        end: '2024-11-30',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/cat.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 20,
 | 
				
			||||||
 | 
					        name: '事件-8-2',
 | 
				
			||||||
 | 
					        start: '2024-12-01',
 | 
				
			||||||
 | 
					        end: '2024-12-18',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/flower.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const sub = [
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: 0,
 | 
				
			||||||
 | 
					    name: 'DD',
 | 
				
			||||||
 | 
					    start: '2024-11-15',
 | 
				
			||||||
 | 
					    end: '2024-11-21',
 | 
				
			||||||
 | 
					    children: [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 1,
 | 
				
			||||||
 | 
					        name: '发射',
 | 
				
			||||||
 | 
					        start: '2024-11-15',
 | 
				
			||||||
 | 
					        end: '2024-11-17',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/wolf.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 2,
 | 
				
			||||||
 | 
					        name: '脱离-1',
 | 
				
			||||||
 | 
					        start: '2024-11-17',
 | 
				
			||||||
 | 
					        end: '2024-11-18',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/bear.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 3,
 | 
				
			||||||
 | 
					        name: '脱落-2',
 | 
				
			||||||
 | 
					        start: '2024-11-19',
 | 
				
			||||||
 | 
					        end: '2024-11-20',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/bear.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 4,
 | 
				
			||||||
 | 
					        name: '落地-3',
 | 
				
			||||||
 | 
					        start: '2024-11-18',
 | 
				
			||||||
 | 
					        end: '2024-11-19',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/wolf.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: 300,
 | 
				
			||||||
 | 
					    name: '飞机',
 | 
				
			||||||
 | 
					    children: [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 5,
 | 
				
			||||||
 | 
					        name: '起飞',
 | 
				
			||||||
 | 
					        start: '2024-11-18',
 | 
				
			||||||
 | 
					        end: '2024-11-21',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/rabbit.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    name: '舰船',
 | 
				
			||||||
 | 
					    children: [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 6,
 | 
				
			||||||
 | 
					        name: '停留',
 | 
				
			||||||
 | 
					        start: '2024-11-21',
 | 
				
			||||||
 | 
					        end: '2024-11-22',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/cat.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 7,
 | 
				
			||||||
 | 
					        name: '扫描',
 | 
				
			||||||
 | 
					        start: '2024-11-18',
 | 
				
			||||||
 | 
					        end: '2024-11-19',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/flower.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    name: '航J',
 | 
				
			||||||
 | 
					    children: [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 8,
 | 
				
			||||||
 | 
					        name: '航J事件',
 | 
				
			||||||
 | 
					        start: '2024-11-20',
 | 
				
			||||||
 | 
					        end: '2024-11-21',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/bear.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 9,
 | 
				
			||||||
 | 
					        name: '航J事件-2',
 | 
				
			||||||
 | 
					        start: '2024-11-25',
 | 
				
			||||||
 | 
					        end: '2024-11-26',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/wolf.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    name: 'xx',
 | 
				
			||||||
 | 
					    children: [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 13,
 | 
				
			||||||
 | 
					        name: 'xx-事件-1',
 | 
				
			||||||
 | 
					        start: '2024-11-22',
 | 
				
			||||||
 | 
					        end: '2024-11-25',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/rabbit.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 14,
 | 
				
			||||||
 | 
					        name: 'xx-事件-2',
 | 
				
			||||||
 | 
					        start: '2024-11-27',
 | 
				
			||||||
 | 
					        end: '2024-11-30',
 | 
				
			||||||
 | 
					        avatar:
 | 
				
			||||||
 | 
					          'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/cat.jpg',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function getMainGantt(data = {}) {
 | 
				
			||||||
 | 
					  return new Promise((resolve, reject) => {
 | 
				
			||||||
 | 
					    setTimeout(() => {
 | 
				
			||||||
 | 
					      resolve(main)
 | 
				
			||||||
 | 
					    }, 1000)
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function getSubGantt(subId) {
 | 
				
			||||||
 | 
					  return new Promise((resolve, reject) => {
 | 
				
			||||||
 | 
					    setTimeout(() => {
 | 
				
			||||||
 | 
					      resolve(sub)
 | 
				
			||||||
 | 
					    }, 1000)
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -54,6 +54,8 @@
 | 
				
			|||||||
    #08ffff77,
 | 
					    #08ffff77,
 | 
				
			||||||
    #71ffff77
 | 
					    #71ffff77
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  --color-bg: #1a222966;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@media (prefers-color-scheme: dark) {
 | 
					@media (prefers-color-scheme: dark) {
 | 
				
			||||||
 | 
				
			|||||||
@ -37,12 +37,12 @@ const props = defineProps({
 | 
				
			|||||||
          <polygon
 | 
					          <polygon
 | 
				
			||||||
            id="polygon1"
 | 
					            id="polygon1"
 | 
				
			||||||
            points="6,66 6,18 12,12 18,12 24,6 27,6 30,9 36,9 39,6 84,6 81,9 75,9 73.2,7 40.8,7 37.8,10.2 24,10.2 12,21 12,24 9,27 9,51 7.8,54 7.8,63"
 | 
					            points="6,66 6,18 12,12 18,12 24,6 27,6 30,9 36,9 39,6 84,6 81,9 75,9 73.2,7 40.8,7 37.8,10.2 24,10.2 12,21 12,24 9,27 9,51 7.8,54 7.8,63"
 | 
				
			||||||
            fill="#4284aa"
 | 
					            fill="#3F91C1"
 | 
				
			||||||
          >
 | 
					          >
 | 
				
			||||||
            <!-- #3f79b0#235fa7;#4fd2dd#4b5f87 -->
 | 
					            <!-- #3f79b0#235fa7;#4fd2dd#4b5f87 -->
 | 
				
			||||||
            <animate
 | 
					            <animate
 | 
				
			||||||
              attributeName="fill"
 | 
					              attributeName="fill"
 | 
				
			||||||
              values="#4fd2dd;#3f79b0;#4284aa;#3f79b0;#4fd2dd;"
 | 
					              values="#4fd2dd;#3f79b0;#3F91C1;#3f79b0;#4fd2dd;"
 | 
				
			||||||
              dur="3s"
 | 
					              dur="3s"
 | 
				
			||||||
              begin="0s"
 | 
					              begin="0s"
 | 
				
			||||||
              repeatCount="indefinite"
 | 
					              repeatCount="indefinite"
 | 
				
			||||||
@ -51,14 +51,14 @@ const props = defineProps({
 | 
				
			|||||||
          <polygon
 | 
					          <polygon
 | 
				
			||||||
            id="polygon2"
 | 
					            id="polygon2"
 | 
				
			||||||
            points="27.599999999999998,4.8 38.4,4.8 35.4,7.8 30.599999999999998,7.8"
 | 
					            points="27.599999999999998,4.8 38.4,4.8 35.4,7.8 30.599999999999998,7.8"
 | 
				
			||||||
            fill="#4284aa"
 | 
					            fill="#3F91C1"
 | 
				
			||||||
          ></polygon>
 | 
					          ></polygon>
 | 
				
			||||||
          <!-- #235fa7 4fd2dd -->
 | 
					          <!-- #235fa7 4fd2dd -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          <polygon
 | 
					          <polygon
 | 
				
			||||||
            id="polygon3"
 | 
					            id="polygon3"
 | 
				
			||||||
            points="9,54 9,63 7.199999999999999,66 7.199999999999999,75 7.8,78 7.8,110 8.4,110 8.4,66 9.6,66 9.6,54"
 | 
					            points="9,54 9,63 7.199999999999999,66 7.199999999999999,75 7.8,78 7.8,110 8.4,110 8.4,66 9.6,66 9.6,54"
 | 
				
			||||||
            fill="#4284aa"
 | 
					            fill="#3F91C1"
 | 
				
			||||||
          ></polygon>
 | 
					          ></polygon>
 | 
				
			||||||
        </g>
 | 
					        </g>
 | 
				
			||||||
      </defs>
 | 
					      </defs>
 | 
				
			||||||
@ -102,8 +102,10 @@ $radius: 2rem;
 | 
				
			|||||||
    height: calc(100% - 1rem + 2px);
 | 
					    height: calc(100% - 1rem + 2px);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  .warp-bg {
 | 
					  .warp-bg {
 | 
				
			||||||
    background-color: #1a222966;
 | 
					    background-color: var(--color-bg);
 | 
				
			||||||
 | 
					    // background-color: #fff55;
 | 
				
			||||||
    border-radius: $radius;
 | 
					    border-radius: $radius;
 | 
				
			||||||
 | 
					    // backdrop-filter: blur(10px);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  .border-content {
 | 
					  .border-content {
 | 
				
			||||||
    // z-index: 10;
 | 
					    // z-index: 10;
 | 
				
			||||||
@ -114,11 +116,11 @@ $radius: 2rem;
 | 
				
			|||||||
    // width: calc(100% - 1rem);
 | 
					    // width: calc(100% - 1rem);
 | 
				
			||||||
    // height: calc(100% - 1rem + 2px);
 | 
					    // height: calc(100% - 1rem + 2px);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    box-shadow: inset 0 0 15px 2px #40c8ee4d;
 | 
					    box-shadow: inset 0 0 15px 2px #40c8ee77;
 | 
				
			||||||
    .content-title {
 | 
					    .content-title {
 | 
				
			||||||
      @apply h-9 px-5 leading-9 tracking-[5px];
 | 
					      @apply h-9 px-5 leading-9 tracking-[5px];
 | 
				
			||||||
      border-radius: $radius $radius 0 0;
 | 
					      border-radius: $radius $radius 0 0;
 | 
				
			||||||
      background: linear-gradient(to right, #4fd2dd33, #4b877400);
 | 
					      background: linear-gradient(to right, #4fd2dd55, #4b877400);
 | 
				
			||||||
      .title-text {
 | 
					      .title-text {
 | 
				
			||||||
        @apply font-bold italic;
 | 
					        @apply font-bold italic;
 | 
				
			||||||
        color: transparent;
 | 
					        color: transparent;
 | 
				
			||||||
 | 
				
			|||||||
@ -13,20 +13,27 @@ class SatelliteEntity {
 | 
				
			|||||||
    this.tleLine2 = tleLine2.trim()
 | 
					    this.tleLine2 = tleLine2.trim()
 | 
				
			||||||
    this.satrec = twoline2satrec(this.tleLine1, this.tleLine2)
 | 
					    this.satrec = twoline2satrec(this.tleLine1, this.tleLine2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.totalSeconds = 86400 // 24小时
 | 
					    this.totalSeconds = 7 * 86400 // 24小时
 | 
				
			||||||
    this.stepSeconds = 100
 | 
					    this.stepSeconds = 100
 | 
				
			||||||
    this.leadTime = parseInt((24 * 3600) / circle)
 | 
					    this.leadTime = parseInt((24 * 3600) / circle)
 | 
				
			||||||
    this.trailTime = 0
 | 
					    this.trailTime = 0
 | 
				
			||||||
    this.sensor = false
 | 
					    this.sensor = false
 | 
				
			||||||
    this.entity = null
 | 
					    this.entity = null
 | 
				
			||||||
 | 
					    this.sensorType = 'rectangle'
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  get sensor() {
 | 
					  get sensor() {
 | 
				
			||||||
    return this.sensor
 | 
					    return this.sensor
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  set sensor(showSensor) {
 | 
					  set sensor(showSensor) {
 | 
				
			||||||
    console.log(showSensor, 'showSensor')
 | 
					    console.log(showSensor, 'showSensor')
 | 
				
			||||||
 | 
					    if (showSensor) {
 | 
				
			||||||
    showSensor && this.createRectangleSensor(this.entity)
 | 
					      if (this.sensorType === 'conic') {
 | 
				
			||||||
 | 
					        this.createConicSensor(this.entity)
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        this.createRectangleSensor(this.entity)
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    //showSensor &&
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _checkTle(tle) {
 | 
					  _checkTle(tle) {
 | 
				
			||||||
@ -104,7 +111,7 @@ class SatelliteEntity {
 | 
				
			|||||||
        // material: color,
 | 
					        // material: color,
 | 
				
			||||||
        material: new Cesium.PolylineTrailLinkMaterialProperty({
 | 
					        material: new Cesium.PolylineTrailLinkMaterialProperty({
 | 
				
			||||||
          color,
 | 
					          color,
 | 
				
			||||||
          duration: 8640,
 | 
					          duration: 86400 * 1000,
 | 
				
			||||||
        }),
 | 
					        }),
 | 
				
			||||||
      }),
 | 
					      }),
 | 
				
			||||||
      label: {
 | 
					      label: {
 | 
				
			||||||
@ -284,6 +291,38 @@ class SatelliteEntity {
 | 
				
			|||||||
    )
 | 
					    )
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  createConicSensor(satellite) {
 | 
				
			||||||
 | 
					    let position = Cesium.Property.getValueOrUndefined(
 | 
				
			||||||
 | 
					      satellite.position,
 | 
				
			||||||
 | 
					      viewer.clock.currentTime,
 | 
				
			||||||
 | 
					      new Cesium.Cartesian3()
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    // const conicSensor = new CesiumSensorVolumes.ConicSensorGraphics()
 | 
				
			||||||
 | 
					    // conicSensor.radius = 20000000.0
 | 
				
			||||||
 | 
					    // conicSensor.modelMatrix = this.getModelMatrix(position)
 | 
				
			||||||
 | 
					    // conicSensor.intersectionColor = new Cesium.ConstantProperty(
 | 
				
			||||||
 | 
					    //   new Cesium.Color(0.1, 0.2, 0.3, 0.4)
 | 
				
			||||||
 | 
					    // )
 | 
				
			||||||
 | 
					    const customSensor = new CesiumSensorVolumes.CustomSensorVolume()
 | 
				
			||||||
 | 
					    customSensor.modelMatrix = this.getModelMatrix(position)
 | 
				
			||||||
 | 
					    customSensor.radius = 20000000.0
 | 
				
			||||||
 | 
					    // customSensor.directions = directions;
 | 
				
			||||||
 | 
					    viewer.scene.primitives.add(customSensor)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    viewer.scene.preRender.addEventListener((scene, time) => {
 | 
				
			||||||
 | 
					      customSensor.show = false
 | 
				
			||||||
 | 
					      let position = Cesium.Property.getValueOrUndefined(
 | 
				
			||||||
 | 
					        satellite.position,
 | 
				
			||||||
 | 
					        time,
 | 
				
			||||||
 | 
					        new Cesium.Cartesian3()
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
 | 
					      customSensor.modelMatrix = this.getModelMatrix(position)
 | 
				
			||||||
 | 
					      customSensor.show = true
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    viewer.scene.primitives.add(customSensor)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // createSensor(satellite) {
 | 
					  // createSensor(satellite) {
 | 
				
			||||||
  //   // let sensor = new Sensor({
 | 
					  //   // let sensor = new Sensor({
 | 
				
			||||||
  //   //   position: satellite.position,
 | 
					  //   //   position: satellite.position,
 | 
				
			||||||
 | 
				
			|||||||
@ -8,6 +8,24 @@ const router = createRouter({
 | 
				
			|||||||
      name: 'Home',
 | 
					      name: 'Home',
 | 
				
			||||||
      component: () => import('@/views/Home/index.vue'),
 | 
					      component: () => import('@/views/Home/index.vue'),
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      path: '/gantt',
 | 
				
			||||||
 | 
					      name: 'Gantt',
 | 
				
			||||||
 | 
					      component: () => import('@/views/Gantt'),
 | 
				
			||||||
 | 
					      redirect: '/gantt/main',
 | 
				
			||||||
 | 
					      children: [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          path: 'main',
 | 
				
			||||||
 | 
					          name: 'MainGantt',
 | 
				
			||||||
 | 
					          component: () => import('@/views/Gantt/components/MainGantt'),
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          path: 'sub/:subId',
 | 
				
			||||||
 | 
					          name: 'SubGantt',
 | 
				
			||||||
 | 
					          component: () => import('@/views/Gantt/components/SubGantt'),
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -78,7 +78,7 @@
 | 
				
			|||||||
    <stop offset="0.5" style="stop-color:#29baf1" />
 | 
					    <stop offset="0.5" style="stop-color:#29baf1" />
 | 
				
			||||||
    <stop offset="1" style="stop-color:#29baf1;stop-opacity:0.3" />
 | 
					    <stop offset="1" style="stop-color:#29baf1;stop-opacity:0.3" />
 | 
				
			||||||
  </linearGradient>
 | 
					  </linearGradient>
 | 
				
			||||||
  <path id="polygon" style="fill:rgba(26, 34, 41, 0.4);" d="
 | 
					  <path id="polygon" style="fill:#1a222966;" d="
 | 
				
			||||||
  M0,28.4c0,0,538.6,3.2,575.7,3.2c30.5,0,25.5,43.3,70.1,43.3c21.4,0,596.3,0,629.4,0c44.9,0,33.1-43.3,75.1-43.3
 | 
					  M0,28.4c0,0,538.6,3.2,575.7,3.2c30.5,0,25.5,43.3,70.1,43.3c21.4,0,596.3,0,629.4,0c44.9,0,33.1-43.3,75.1-43.3
 | 
				
			||||||
  c36.2,0,569.7-3.2,569.7-3.2" />
 | 
					  c36.2,0,569.7-3.2,569.7-3.2" />
 | 
				
			||||||
  <path id="line" style="fill:none;stroke:url(#line_00000023994454057530153110000010704537899013655470_);stroke-width:3;stroke-miterlimit:10;" d="
 | 
					  <path id="line" style="fill:none;stroke:url(#line_00000023994454057530153110000010704537899013655470_);stroke-width:3;stroke-miterlimit:10;" d="
 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB  | 
							
								
								
									
										74
									
								
								src/views/Content/components/Header/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								src/views/Content/components/Header/index.vue
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,74 @@
 | 
				
			|||||||
 | 
					<script lang="ts" setup>
 | 
				
			||||||
 | 
					const worldTime = ref('')
 | 
				
			||||||
 | 
					const getTime = () => {
 | 
				
			||||||
 | 
					  worldTime.value = new Date().toLocaleString()
 | 
				
			||||||
 | 
					  requestAnimationFrame(getTime)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					onMounted(() => {
 | 
				
			||||||
 | 
					  getTime()
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div class="header-bg absolute z-20 h-[100px] w-full"></div>
 | 
				
			||||||
 | 
					  <div
 | 
				
			||||||
 | 
					    class="time-bg z-20 mb-1 flex h-[30px] w-full items-center justify-between px-5 text-2xl"
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					    <div class="time-container">
 | 
				
			||||||
 | 
					      <div class="time-title">世界时</div>
 | 
				
			||||||
 | 
					      <div class="bgc-animation">
 | 
				
			||||||
 | 
					        {{ worldTime }}
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div class="time-container bgc-animation">
 | 
				
			||||||
 | 
					      <div class="bgc-animation">{{ worldTime }}</div>
 | 
				
			||||||
 | 
					      <div class="time-title">作战时</div>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					  <div class="title-container bgc-animation">xxxxx平台</div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style type="scss" scoped>
 | 
				
			||||||
 | 
					.time-bg {
 | 
				
			||||||
 | 
					  background-color: var(--color-bg);
 | 
				
			||||||
 | 
					  .time-container {
 | 
				
			||||||
 | 
					    @apply flex items-center justify-center gap-2;
 | 
				
			||||||
 | 
					    font-family: Digital;
 | 
				
			||||||
 | 
					    .time-title {
 | 
				
			||||||
 | 
					      @apply h-6 border border-[#29baf1] px-2 text-sm leading-5 text-[#29baf1];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.bgc-animation {
 | 
				
			||||||
 | 
					  background: var(--gradient-bg);
 | 
				
			||||||
 | 
					  background-size: 200% 200%;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  animation: gradientAnimation 3s ease infinite alternate;
 | 
				
			||||||
 | 
					  background-clip: text;
 | 
				
			||||||
 | 
					  color: transparent;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@keyframes gradientAnimation {
 | 
				
			||||||
 | 
					  0% {
 | 
				
			||||||
 | 
					    background-position: 200% 50%;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  50% {
 | 
				
			||||||
 | 
					    background-position: 100% 50%;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  100% {
 | 
				
			||||||
 | 
					    background-position: 0% 50%;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.header-bg {
 | 
				
			||||||
 | 
					  background: url('./header.svg') no-repeat;
 | 
				
			||||||
 | 
					  background-size: 100% 100%;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.title-container {
 | 
				
			||||||
 | 
					  @apply absolute left-[50%] top-3 z-20 h-20 text-5xl font-bold tracking-[18px];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  transform: translateX(-50%);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
@ -1,5 +1,6 @@
 | 
				
			|||||||
<script setup>
 | 
					<script setup>
 | 
				
			||||||
import { RepeatSharp } from '@vicons/ionicons5'
 | 
					import { RepeatSharp } from '@vicons/ionicons5'
 | 
				
			||||||
 | 
					import HeaderCom from './components/Header/index.vue'
 | 
				
			||||||
import Panel from '@/components/Panel/index.vue'
 | 
					import Panel from '@/components/Panel/index.vue'
 | 
				
			||||||
// import Header from './components/Header.vue'
 | 
					// import Header from './components/Header.vue'
 | 
				
			||||||
import Satellite from '../Satellite/index.vue'
 | 
					import Satellite from '../Satellite/index.vue'
 | 
				
			||||||
@ -17,6 +18,7 @@ import HeatMap from '../Mubiao/components/HeatMap/index.vue'
 | 
				
			|||||||
import { useTextReport } from '../TextReport/hooks/text'
 | 
					import { useTextReport } from '../TextReport/hooks/text'
 | 
				
			||||||
import { useHisImage } from '../BaseMB/components/HisImages/hooks/hisImage'
 | 
					import { useHisImage } from '../BaseMB/components/HisImages/hooks/hisImage'
 | 
				
			||||||
import { useMBTrajectory } from '../Mubiao/components/HisTrajectory/hooks/mbTraj'
 | 
					import { useMBTrajectory } from '../Mubiao/components/HisTrajectory/hooks/mbTraj'
 | 
				
			||||||
 | 
					import { useWeather } from '../Weather/hooks/weather'
 | 
				
			||||||
import DetailsModal from './components/DetailsModal/index.vue'
 | 
					import DetailsModal from './components/DetailsModal/index.vue'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const { getTextConfigs, initWebSocket } = useTextReport()
 | 
					const { getTextConfigs, initWebSocket } = useTextReport()
 | 
				
			||||||
@ -49,20 +51,21 @@ const types = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
const showPanelName = ref('ss')
 | 
					const showPanelName = ref('ss')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const worldTime = ref('')
 | 
					// const worldTime = ref('')
 | 
				
			||||||
const getTime = () => {
 | 
					// const getTime = () => {
 | 
				
			||||||
  worldTime.value = new Date().toLocaleString()
 | 
					//   worldTime.value = new Date().toLocaleString()
 | 
				
			||||||
  requestAnimationFrame(getTime)
 | 
					//   requestAnimationFrame(getTime)
 | 
				
			||||||
}
 | 
					// }
 | 
				
			||||||
onMounted(() => {
 | 
					// onMounted(() => {
 | 
				
			||||||
  getTime()
 | 
					//   getTime()
 | 
				
			||||||
})
 | 
					// })
 | 
				
			||||||
 | 
					const { showWeather } = useWeather()
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
  <div class="flex flex-col w-h-full">
 | 
					  <div class="flex flex-col w-h-full">
 | 
				
			||||||
    <!-- <div class="absolute z-20 h-8 w-full bg-[#1a222988]"></div> -->
 | 
					    <!-- <div class="absolute z-20 h-8 w-full bg-[#1a222988]"></div> -->
 | 
				
			||||||
 | 
					    <header-com />
 | 
				
			||||||
    <div class="header-bg absolute z-20 h-[100px] w-full"></div>
 | 
					    <!-- <div class="header-bg absolute z-20 h-[100px] w-full"></div>
 | 
				
			||||||
    <div
 | 
					    <div
 | 
				
			||||||
      class="time-bg z-20 mb-1 flex h-[30px] w-full items-center justify-between px-5 text-2xl"
 | 
					      class="time-bg z-20 mb-1 flex h-[30px] w-full items-center justify-between px-5 text-2xl"
 | 
				
			||||||
    >
 | 
					    >
 | 
				
			||||||
@ -77,9 +80,9 @@ onMounted(() => {
 | 
				
			|||||||
        <div class="time-title">作战时</div>
 | 
					        <div class="time-title">作战时</div>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
    <div class="title-container bgc-animation">xxxxx平台</div>
 | 
					    <div class="title-container bgc-animation">xxxxx平台</div> -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <div class="grid flex-1 grid-cols-[1.5fr_3fr_1.5fr] grid-rows-1 gap-1 p-2">
 | 
					    <div class="grid flex-1 grid-cols-[1.3fr_3fr_1.3fr] grid-rows-1 gap-1 p-2">
 | 
				
			||||||
      <div class="left-panel pl-8">
 | 
					      <div class="left-panel pl-8">
 | 
				
			||||||
        <div
 | 
					        <div
 | 
				
			||||||
          class="radio-group absolute top-[50%] -left-7 z-30 flex w-14 translate-y-[-50%] transform flex-col"
 | 
					          class="radio-group absolute top-[50%] -left-7 z-30 flex w-14 translate-y-[-50%] transform flex-col"
 | 
				
			||||||
@ -162,6 +165,14 @@ onMounted(() => {
 | 
				
			|||||||
        </transition>
 | 
					        </transition>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
      <div class="flex h-full flex-col justify-end">
 | 
					      <div class="flex h-full flex-col justify-end">
 | 
				
			||||||
 | 
					        <div class="absolute top-2 z-30 flex w-full justify-between">
 | 
				
			||||||
 | 
					          <div class="btn-class left"></div>
 | 
				
			||||||
 | 
					          <div
 | 
				
			||||||
 | 
					            class="btn-class right"
 | 
				
			||||||
 | 
					            :class="{ checked: showWeather }"
 | 
				
			||||||
 | 
					            @click="showWeather = !showWeather"
 | 
				
			||||||
 | 
					          ></div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
        <!-- <his-images
 | 
					        <!-- <his-images
 | 
				
			||||||
          class="transition-duration-1000 z-20 row-start-5 transition-all"
 | 
					          class="transition-duration-1000 z-20 row-start-5 transition-all"
 | 
				
			||||||
        ></his-images> -->
 | 
					        ></his-images> -->
 | 
				
			||||||
@ -258,4 +269,86 @@ onMounted(() => {
 | 
				
			|||||||
  transform: translateX(-120%) scale(0.8);
 | 
					  transform: translateX(-120%) scale(0.8);
 | 
				
			||||||
  filter: blur(4px);
 | 
					  filter: blur(4px);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.btn-class {
 | 
				
			||||||
 | 
					  @apply h-[28px] w-[110px];
 | 
				
			||||||
 | 
					  cursor: pointer;
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  align-items: center;
 | 
				
			||||||
 | 
					  justify-content: center;
 | 
				
			||||||
 | 
					  gap: 1rem;
 | 
				
			||||||
 | 
					  letter-spacing: 4px;
 | 
				
			||||||
 | 
					  color: #a7cae0;
 | 
				
			||||||
 | 
					  cursor: pointer;
 | 
				
			||||||
 | 
					  background: linear-gradient(
 | 
				
			||||||
 | 
					    90deg,
 | 
				
			||||||
 | 
					    rgba(47, 255, 255, 0.4) 0%,
 | 
				
			||||||
 | 
					    rgba(8, 77, 126, 0.4) 25%,
 | 
				
			||||||
 | 
					    rgba(8, 77, 126, 0.4) 70%,
 | 
				
			||||||
 | 
					    rgba(47, 255, 255, 0.4) 100%
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					  filter: drop-shadow(inset 0 0 0 2px red);
 | 
				
			||||||
 | 
					  clip-path: polygon(
 | 
				
			||||||
 | 
					    0% 0%,
 | 
				
			||||||
 | 
					    71.67% 0%,
 | 
				
			||||||
 | 
					    79.33% 6%,
 | 
				
			||||||
 | 
					    84% 15.33%,
 | 
				
			||||||
 | 
					    88% 28%,
 | 
				
			||||||
 | 
					    91% 41.67%,
 | 
				
			||||||
 | 
					    94.33% 59.33%,
 | 
				
			||||||
 | 
					    97% 74%,
 | 
				
			||||||
 | 
					    99% 88%,
 | 
				
			||||||
 | 
					    100% 100%,
 | 
				
			||||||
 | 
					    0% 100%
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					  border-radius: 5px;
 | 
				
			||||||
 | 
					  &:hover {
 | 
				
			||||||
 | 
					    background: linear-gradient(
 | 
				
			||||||
 | 
					        180deg,
 | 
				
			||||||
 | 
					        rgba(8, 77, 126, 0.2) 0%,
 | 
				
			||||||
 | 
					        rgba(8, 77, 126, 0.42) 100%
 | 
				
			||||||
 | 
					      ),
 | 
				
			||||||
 | 
					      rgba(47, 255, 255, 0.4);
 | 
				
			||||||
 | 
					    box-shadow: inset 0 0 12px rgba(151, 200, 255, 0.44);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  &::after {
 | 
				
			||||||
 | 
					    content: '显示天气';
 | 
				
			||||||
 | 
					    width: 100%;
 | 
				
			||||||
 | 
					    height: 100%;
 | 
				
			||||||
 | 
					    display: block;
 | 
				
			||||||
 | 
					    position: absolute;
 | 
				
			||||||
 | 
					    left: 0;
 | 
				
			||||||
 | 
					    top: 0;
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    align-items: center;
 | 
				
			||||||
 | 
					    justify-content: center;
 | 
				
			||||||
 | 
					    // color: '#a7cae0';
 | 
				
			||||||
 | 
					    // background: var(--gradient-bg);
 | 
				
			||||||
 | 
					    // background-clip: text;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.checked {
 | 
				
			||||||
 | 
					  color: #f2f7fb;
 | 
				
			||||||
 | 
					  background: linear-gradient(
 | 
				
			||||||
 | 
					      180deg,
 | 
				
			||||||
 | 
					      rgba(8, 77, 126, 0.2) 0%,
 | 
				
			||||||
 | 
					      rgba(8, 77, 126, 0.42) 100%
 | 
				
			||||||
 | 
					    ),
 | 
				
			||||||
 | 
					    rgba(47, 255, 255, 0.4);
 | 
				
			||||||
 | 
					  box-shadow: inset 0 0 12px rgba(151, 200, 255, 0.44);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.left {
 | 
				
			||||||
 | 
					  &::after {
 | 
				
			||||||
 | 
					    content: '热力图';
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					.right {
 | 
				
			||||||
 | 
					  transform: rotateY(180deg);
 | 
				
			||||||
 | 
					  &::after {
 | 
				
			||||||
 | 
					    transform: rotateY(-180deg);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
 | 
				
			|||||||
@ -16,7 +16,9 @@ onMounted(() => {
 | 
				
			|||||||
    fullscreenButton: false,
 | 
					    fullscreenButton: false,
 | 
				
			||||||
    homeButton: false,
 | 
					    homeButton: false,
 | 
				
			||||||
    imageryProvider: new Cesium.UrlTemplateImageryProvider({
 | 
					    imageryProvider: new Cesium.UrlTemplateImageryProvider({
 | 
				
			||||||
      url: 'GV/resources/theme/earthTheme/{z}/{x}/{y}.jpg',
 | 
					      url: 'http://192.168.10.201:2022/api/maptilecache/service/tms/1.0.0/img_globle1to9-PNG-4326@EPSG:4326@png/{z}/{x}/{reverseY}.png',
 | 
				
			||||||
 | 
					      // url: 'js/Cesium/Assets/Textures/NaturalEarthII/{z}/{x}/{reverseY}.jpg',
 | 
				
			||||||
 | 
					      // url: 'GV/resources/theme/earthTheme/{z}/{x}/{y}.jpg',
 | 
				
			||||||
      tilingScheme: new Cesium.GeographicTilingScheme(),
 | 
					      tilingScheme: new Cesium.GeographicTilingScheme(),
 | 
				
			||||||
    }),
 | 
					    }),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -36,7 +38,16 @@ onMounted(() => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  // 开启抗锯齿
 | 
					  // 开启抗锯齿
 | 
				
			||||||
  viewer.scene.postProcessStages.fxaa.enabled = true
 | 
					  viewer.scene.postProcessStages.fxaa.enabled = true
 | 
				
			||||||
  // viewer.scene.skyBox = GV.SkyboxTheme.getSkyBox('GV/resources/theme/skyBox/{z}/{x}/{y}.jpg',false,'jpg')
 | 
					  viewer.scene.skyBox = new Cesium.SkyBox({
 | 
				
			||||||
 | 
					    sources: {
 | 
				
			||||||
 | 
					      positiveX: 'GV/resources/theme/skyBox/PositiveX.jpg',
 | 
				
			||||||
 | 
					      negativeX: 'GV/resources/theme/skyBox/NegativeX.jpg',
 | 
				
			||||||
 | 
					      positiveY: 'GV/resources/theme/skyBox/PositiveY.jpg',
 | 
				
			||||||
 | 
					      negativeY: 'GV/resources/theme/skyBox/NegativeY.jpg',
 | 
				
			||||||
 | 
					      positiveZ: 'GV/resources/theme/skyBox/PositiveZ.jpg',
 | 
				
			||||||
 | 
					      negativeZ: 'GV/resources/theme/skyBox/NegativeZ.jpg',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
  // viewer.scene.globe.depthTestAgainstTerrain = true
 | 
					  // viewer.scene.globe.depthTestAgainstTerrain = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // addBaseFacilities()
 | 
					  // addBaseFacilities()
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										334
									
								
								src/views/Gantt/components/Gantt/hooks/gantt.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										334
									
								
								src/views/Gantt/components/Gantt/hooks/gantt.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,334 @@
 | 
				
			|||||||
 | 
					import { Group, Image, Text, CheckBox, Rect } from '@visactor/vtable/es/vrender'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { Gantt, tools, TYPES } from '@visactor/vtable-gantt'
 | 
				
			||||||
 | 
					import { getMainGantt, getSubGantt } from '@/api/Gantt'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type GanttParams = {
 | 
				
			||||||
 | 
					  route?: any
 | 
				
			||||||
 | 
					  router?: any
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					let ganttInstance: null | Gantt = null
 | 
				
			||||||
 | 
					const bgColor = '#1c202c'
 | 
				
			||||||
 | 
					const headerBgColor = '#33566f22'
 | 
				
			||||||
 | 
					const textColor = '#65c5e7'
 | 
				
			||||||
 | 
					const textColorWithOp = '#75fbfd22'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const useGantt = ({ router, route }: GanttParams) => {
 | 
				
			||||||
 | 
					  const { subId } = route.params
 | 
				
			||||||
 | 
					  const records = ref([])
 | 
				
			||||||
 | 
					  onMounted(() => {
 | 
				
			||||||
 | 
					    getGanttData(subId)
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					  async function getGanttData(subId: string) {
 | 
				
			||||||
 | 
					    if (subId) {
 | 
				
			||||||
 | 
					      const res = await getSubGantt(subId)
 | 
				
			||||||
 | 
					      records.value = res
 | 
				
			||||||
 | 
					      ganttInstance?.setRecords(records.value)
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      const res = await getMainGantt()
 | 
				
			||||||
 | 
					      // console.log(res, '----')
 | 
				
			||||||
 | 
					      records.value = res
 | 
				
			||||||
 | 
					      ganttInstance?.setRecords(records.value)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  function renderMainTask(dom: HTMLElement) {
 | 
				
			||||||
 | 
					    const option = getOption()
 | 
				
			||||||
 | 
					    ganttInstance = new Gantt(dom, option)
 | 
				
			||||||
 | 
					    // window['ganttInstance'] = ganttInstance
 | 
				
			||||||
 | 
					    console.log(ganttInstance)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  function getOption(): TYPES.GanttConstructorOptions {
 | 
				
			||||||
 | 
					    const option = {
 | 
				
			||||||
 | 
					      records: records.value,
 | 
				
			||||||
 | 
					      taskListTable: renderTaskListTable(),
 | 
				
			||||||
 | 
					      tasksShowMode: TYPES.TasksShowMode.Sub_Tasks_Arrange,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      frame: {
 | 
				
			||||||
 | 
					        outerFrameStyle: {
 | 
				
			||||||
 | 
					          borderLineWidth: 2,
 | 
				
			||||||
 | 
					          borderColor: textColor,
 | 
				
			||||||
 | 
					          cornerRadius: 3,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        // verticalSplitLineHighlight: {
 | 
				
			||||||
 | 
					        //   lineColor: 'green',
 | 
				
			||||||
 | 
					        //   lineWidth: 3
 | 
				
			||||||
 | 
					        // }
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      grid: {
 | 
				
			||||||
 | 
					        // backgroundColor: bgColor,
 | 
				
			||||||
 | 
					        horizontalLine: {
 | 
				
			||||||
 | 
					          lineWidth: 1,
 | 
				
			||||||
 | 
					          lineColor: textColorWithOp,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        verticalLine: {
 | 
				
			||||||
 | 
					          lineWidth: 1,
 | 
				
			||||||
 | 
					          lineColor: textColorWithOp,
 | 
				
			||||||
 | 
					          lineDash: [4, 8],
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      taskList: {
 | 
				
			||||||
 | 
					        // backgroundColor: bgColor,
 | 
				
			||||||
 | 
					        headerStyle: {
 | 
				
			||||||
 | 
					          borderColor: '#e1e4e8',
 | 
				
			||||||
 | 
					          borderLineWidth: 0,
 | 
				
			||||||
 | 
					          fontSize: 18,
 | 
				
			||||||
 | 
					          fontWeight: 'bold',
 | 
				
			||||||
 | 
					          color: 'red',
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      headerRowHeight: 59,
 | 
				
			||||||
 | 
					      rowHeight: subId ? 200 : 100,
 | 
				
			||||||
 | 
					      taskBar: renderTaskBar(subId),
 | 
				
			||||||
 | 
					      timelineHeader: {
 | 
				
			||||||
 | 
					        backgroundColor: headerBgColor,
 | 
				
			||||||
 | 
					        colWidth: 100,
 | 
				
			||||||
 | 
					        verticalLine: {
 | 
				
			||||||
 | 
					          lineColor: textColorWithOp,
 | 
				
			||||||
 | 
					          lineWidth: 1,
 | 
				
			||||||
 | 
					          lineDash: [4, 2],
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        horizontalLine: {
 | 
				
			||||||
 | 
					          lineColor: textColorWithOp,
 | 
				
			||||||
 | 
					          lineWidth: 1,
 | 
				
			||||||
 | 
					          lineDash: [4, 2],
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        scales: getTimeScales('day'),
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      minDate: '2024-11-14',
 | 
				
			||||||
 | 
					      maxDate: '2024-12-30',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      scrollStyle: {
 | 
				
			||||||
 | 
					        scrollRailColor: 'RGBA(246,246,246,0)',
 | 
				
			||||||
 | 
					        visible: 'focus',
 | 
				
			||||||
 | 
					        width: 6,
 | 
				
			||||||
 | 
					        scrollSliderCornerRadius: 2,
 | 
				
			||||||
 | 
					        scrollSliderColor: 'rgba(255,255,255,0.25)',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      underlayBackgroundColor: bgColor,
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return option as TYPES.GanttConstructorOptions
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  function renderColumn() {
 | 
				
			||||||
 | 
					    const columns = [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        field: 'name',
 | 
				
			||||||
 | 
					        title: '类型',
 | 
				
			||||||
 | 
					        width: '120',
 | 
				
			||||||
 | 
					        mergeCell: true,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					    if (subId) {
 | 
				
			||||||
 | 
					      columns.unshift({
 | 
				
			||||||
 | 
					        field: 'isCheck',
 | 
				
			||||||
 | 
					        title: '',
 | 
				
			||||||
 | 
					        width: '60',
 | 
				
			||||||
 | 
					        headerType: 'checkbox',
 | 
				
			||||||
 | 
					        cellType: 'checkbox',
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return columns
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  function renderTaskListTable() {
 | 
				
			||||||
 | 
					    const taskListTable = {
 | 
				
			||||||
 | 
					      columns: renderColumn(),
 | 
				
			||||||
 | 
					      // tableWidth: 'auto',
 | 
				
			||||||
 | 
					      theme: {
 | 
				
			||||||
 | 
					        underlayBackgroundColor: bgColor,
 | 
				
			||||||
 | 
					        headerStyle: {
 | 
				
			||||||
 | 
					          borderColor: textColorWithOp,
 | 
				
			||||||
 | 
					          borderLineWidth: 1,
 | 
				
			||||||
 | 
					          fontWeight: 'bold',
 | 
				
			||||||
 | 
					          color: textColor,
 | 
				
			||||||
 | 
					          bgColor: headerBgColor,
 | 
				
			||||||
 | 
					          textAlign: 'center',
 | 
				
			||||||
 | 
					          fontSize: 20,
 | 
				
			||||||
 | 
					          hover: {
 | 
				
			||||||
 | 
					            cellBgColor: 'transparent',
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        bodyStyle: {
 | 
				
			||||||
 | 
					          borderColor: textColorWithOp,
 | 
				
			||||||
 | 
					          textAlign: 'center',
 | 
				
			||||||
 | 
					          borderLineWidth: 1,
 | 
				
			||||||
 | 
					          autoWrapText: true,
 | 
				
			||||||
 | 
					          fontSize: 16,
 | 
				
			||||||
 | 
					          color: textColor,
 | 
				
			||||||
 | 
					          bgColor: bgColor,
 | 
				
			||||||
 | 
					          hover: {
 | 
				
			||||||
 | 
					            cellBgColor: textColorWithOp,
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return taskListTable
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  function renderTaskBar(subId: string) {
 | 
				
			||||||
 | 
					    const taskBar = {
 | 
				
			||||||
 | 
					      resizable: false,
 | 
				
			||||||
 | 
					      moveable: false,
 | 
				
			||||||
 | 
					      startDateField: 'start',
 | 
				
			||||||
 | 
					      endDateField: 'end',
 | 
				
			||||||
 | 
					      // progressField: 'progress',
 | 
				
			||||||
 | 
					      barStyle: { width: subId ? 180 : 60 },
 | 
				
			||||||
 | 
					      customLayout: args => {
 | 
				
			||||||
 | 
					        const { width, height, startDate, endDate, taskRecord } = args
 | 
				
			||||||
 | 
					        const container = new Group({
 | 
				
			||||||
 | 
					          width,
 | 
				
			||||||
 | 
					          height,
 | 
				
			||||||
 | 
					          fill: 'transparent',
 | 
				
			||||||
 | 
					          // stroke:true,
 | 
				
			||||||
 | 
					          // stroke: textColor,
 | 
				
			||||||
 | 
					          display: 'flex',
 | 
				
			||||||
 | 
					          flexDirection: 'column',
 | 
				
			||||||
 | 
					          justifyContent: 'center',
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        if (!subId) {
 | 
				
			||||||
 | 
					          container.addEventListener('click', event => {
 | 
				
			||||||
 | 
					            router.push({
 | 
				
			||||||
 | 
					              path: `/gantt/sub/${taskRecord.id}`,
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					          })
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (subId) {
 | 
				
			||||||
 | 
					          const image = new Image({
 | 
				
			||||||
 | 
					            image: taskRecord.avatar,
 | 
				
			||||||
 | 
					            width: 100,
 | 
				
			||||||
 | 
					            height: 100,
 | 
				
			||||||
 | 
					            x: 10,
 | 
				
			||||||
 | 
					            y: 10,
 | 
				
			||||||
 | 
					            boundsPadding: [0, 0, 10, 0],
 | 
				
			||||||
 | 
					          })
 | 
				
			||||||
 | 
					          container.add(image)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        // const checkbox = new CheckBox({
 | 
				
			||||||
 | 
					        //   width: 20,
 | 
				
			||||||
 | 
					        //   height: 20,
 | 
				
			||||||
 | 
					        //   checked: false,
 | 
				
			||||||
 | 
					        // })
 | 
				
			||||||
 | 
					        // container.add(checkbox)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // checkbox.addEventListener('click', event => {
 | 
				
			||||||
 | 
					        //   console.log(event, 'event')
 | 
				
			||||||
 | 
					        // })
 | 
				
			||||||
 | 
					        const name = new Text({
 | 
				
			||||||
 | 
					          text: taskRecord.name,
 | 
				
			||||||
 | 
					          fontSize: 16,
 | 
				
			||||||
 | 
					          fontFamily: 'sans-serif',
 | 
				
			||||||
 | 
					          fill: textColor,
 | 
				
			||||||
 | 
					          fontWeight: 'bold',
 | 
				
			||||||
 | 
					          maxLineWidth: width,
 | 
				
			||||||
 | 
					          textAlign: 'center',
 | 
				
			||||||
 | 
					          // boundsPadding: [10, 0, 0, 0],
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        container.add(name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const days = new Text({
 | 
				
			||||||
 | 
					          text: `${startDate.toLocaleDateString()} ~ ${endDate.toLocaleDateString()}`,
 | 
				
			||||||
 | 
					          fontSize: 13,
 | 
				
			||||||
 | 
					          fontFamily: 'sans-serif',
 | 
				
			||||||
 | 
					          fill: textColor,
 | 
				
			||||||
 | 
					          boundsPadding: [10, 0, 0, 0],
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        container.add(days)
 | 
				
			||||||
 | 
					        const rect = new Rect({
 | 
				
			||||||
 | 
					          width: width,
 | 
				
			||||||
 | 
					          height: 7,
 | 
				
			||||||
 | 
					          fill: {
 | 
				
			||||||
 | 
					            gradient: 'linear',
 | 
				
			||||||
 | 
					            x0: 0,
 | 
				
			||||||
 | 
					            y0: 0,
 | 
				
			||||||
 | 
					            x1: 1,
 | 
				
			||||||
 | 
					            y1: 0,
 | 
				
			||||||
 | 
					            stops: [
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                offset: 0,
 | 
				
			||||||
 | 
					                color: textColor,
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                offset: 1,
 | 
				
			||||||
 | 
					                color: textColorWithOp,
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          boundsPadding: [10, 0, 0, 0],
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        container.add(rect)
 | 
				
			||||||
 | 
					        return {
 | 
				
			||||||
 | 
					          rootContainer: container,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      hoverBarStyle: {
 | 
				
			||||||
 | 
					        cornerRadius: 2,
 | 
				
			||||||
 | 
					        barOverlayColor: textColorWithOp,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      selectedBarStyle: {
 | 
				
			||||||
 | 
					        // cornerRadius: 2,
 | 
				
			||||||
 | 
					        borderColor: textColorWithOp,
 | 
				
			||||||
 | 
					        borderLineWidth: 2,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return taskBar
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  function renderGroup(opt: IGroupGraphicAttribute) {
 | 
				
			||||||
 | 
					    return new Group(opt)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  function renderText(opt: ITextGraphicAttribute) {
 | 
				
			||||||
 | 
					    return new Text(opt)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  function renderImage(opt: IImageGraphicAttribute) {
 | 
				
			||||||
 | 
					    return new Image(opt)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  function changeTimeScales(scale: TYPES.ITimelineScale['unit']) {
 | 
				
			||||||
 | 
					    const scales = getTimeScales(scale)
 | 
				
			||||||
 | 
					    ganttInstance && ganttInstance.updateScales(scales)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  function getTimeScales(
 | 
				
			||||||
 | 
					    scale: TYPES.ITimelineScale['unit']
 | 
				
			||||||
 | 
					  ): TYPES.ITimelineScale[] {
 | 
				
			||||||
 | 
					    return [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        unit: scale,
 | 
				
			||||||
 | 
					        step: 1,
 | 
				
			||||||
 | 
					        customLayout: args => {
 | 
				
			||||||
 | 
					          const { width, height, startDate } = args
 | 
				
			||||||
 | 
					          const container = new Group({
 | 
				
			||||||
 | 
					            width,
 | 
				
			||||||
 | 
					            height,
 | 
				
			||||||
 | 
					            display: 'flex',
 | 
				
			||||||
 | 
					            flexDirection: 'row',
 | 
				
			||||||
 | 
					            flexWrap: 'nowrap',
 | 
				
			||||||
 | 
					          })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          const day = new Text({
 | 
				
			||||||
 | 
					            text:
 | 
				
			||||||
 | 
					              scale === 'day'
 | 
				
			||||||
 | 
					                ? startDate.toLocaleDateString()
 | 
				
			||||||
 | 
					                : startDate.toLocaleTimeString(),
 | 
				
			||||||
 | 
					            fontSize: 14,
 | 
				
			||||||
 | 
					            fontWeight: 'bold',
 | 
				
			||||||
 | 
					            fontFamily: 'sans-serif',
 | 
				
			||||||
 | 
					            fill: textColor,
 | 
				
			||||||
 | 
					            textAlign: 'right',
 | 
				
			||||||
 | 
					            maxLineWidth: width,
 | 
				
			||||||
 | 
					            boundsPadding: [25, 12, 10, 12],
 | 
				
			||||||
 | 
					          })
 | 
				
			||||||
 | 
					          container.add(day)
 | 
				
			||||||
 | 
					          return {
 | 
				
			||||||
 | 
					            rootContainer: container,
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return { renderMainTask, changeTimeScales }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default useGantt
 | 
				
			||||||
							
								
								
									
										29
									
								
								src/views/Gantt/components/Gantt/index.jsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/views/Gantt/components/Gantt/index.jsx
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					import useGantt from './hooks/gantt'
 | 
				
			||||||
 | 
					import { useRouter, useRoute } from 'vue-router'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default defineComponent({
 | 
				
			||||||
 | 
					  props: {
 | 
				
			||||||
 | 
					    scale: {
 | 
				
			||||||
 | 
					      type: String,
 | 
				
			||||||
 | 
					      default: 'day',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  setup(props) {
 | 
				
			||||||
 | 
					    const router = useRouter()
 | 
				
			||||||
 | 
					    const route = useRoute()
 | 
				
			||||||
 | 
					    const { renderMainTask, changeTimeScales } = useGantt({ route, router })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    onMounted(() => {
 | 
				
			||||||
 | 
					      nextTick(() => {
 | 
				
			||||||
 | 
					        renderMainTask(document.querySelector('#tableContainer'))
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					    watch(
 | 
				
			||||||
 | 
					      () => props.scale,
 | 
				
			||||||
 | 
					      val => {
 | 
				
			||||||
 | 
					        changeTimeScales(val)
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    return () => <div id="tableContainer" class="bg-[#1c202c] w-h-full"></div>
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
							
								
								
									
										21
									
								
								src/views/Gantt/components/MainGantt/index.jsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								src/views/Gantt/components/MainGantt/index.jsx
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					import { NDatePicker, NRadioButton, NRadioGroup } from 'naive-ui'
 | 
				
			||||||
 | 
					import GanttCom from '../Gantt'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default defineComponent({
 | 
				
			||||||
 | 
					  setup() {
 | 
				
			||||||
 | 
					    const range = ref()
 | 
				
			||||||
 | 
					    const value = ref('day')
 | 
				
			||||||
 | 
					    return () => (
 | 
				
			||||||
 | 
					      <>
 | 
				
			||||||
 | 
					        <div class="flex gap-2">
 | 
				
			||||||
 | 
					          <NDatePicker v-model:value={range.value} type="daterange" clearable />
 | 
				
			||||||
 | 
					          <NRadioGroup v-model:value={value.value} name="radiobuttongroup">
 | 
				
			||||||
 | 
					            <NRadioButton value="hour" label="日" />
 | 
				
			||||||
 | 
					            <NRadioButton value="day" label="月" />
 | 
				
			||||||
 | 
					          </NRadioGroup>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					        <GanttCom scale={value.value} />
 | 
				
			||||||
 | 
					      </>
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
							
								
								
									
										17
									
								
								src/views/Gantt/components/SubGantt/index.jsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/views/Gantt/components/SubGantt/index.jsx
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					import { NButton } from 'naive-ui'
 | 
				
			||||||
 | 
					import GanttCom from '../Gantt'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default defineComponent({
 | 
				
			||||||
 | 
					  setup() {
 | 
				
			||||||
 | 
					    const value = ref('day')
 | 
				
			||||||
 | 
					    return () => (
 | 
				
			||||||
 | 
					      <>
 | 
				
			||||||
 | 
					        <div class="flex gap-2">
 | 
				
			||||||
 | 
					          <NButton>态势展示</NButton>
 | 
				
			||||||
 | 
					          <NButton>返回</NButton>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					        <GanttCom scale={value.value} />
 | 
				
			||||||
 | 
					      </>
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
							
								
								
									
										531
									
								
								src/views/Gantt/index copy.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										531
									
								
								src/views/Gantt/index copy.vue
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,531 @@
 | 
				
			|||||||
 | 
					<script setup>
 | 
				
			||||||
 | 
					import HeaderCom from '../Content/components/Header/index.vue'
 | 
				
			||||||
 | 
					import { Gantt, tools } from '@visactor/vtable-gantt'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// import * as VTableGantt from '@visactor/vtable-gantt';
 | 
				
			||||||
 | 
					import * as VRender from '@visactor/vtable/es/vrender'
 | 
				
			||||||
 | 
					const checked = ref({
 | 
				
			||||||
 | 
					  id: 'test',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  width: 20,
 | 
				
			||||||
 | 
					  height: 20,
 | 
				
			||||||
 | 
					  checked: false,
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					let ganttInstance
 | 
				
			||||||
 | 
					const barColors0 = [
 | 
				
			||||||
 | 
					  '#aecde6',
 | 
				
			||||||
 | 
					  '#c6a49a',
 | 
				
			||||||
 | 
					  '#ffb582',
 | 
				
			||||||
 | 
					  '#eec1de',
 | 
				
			||||||
 | 
					  '#b3d9b3',
 | 
				
			||||||
 | 
					  '#cccccc',
 | 
				
			||||||
 | 
					  '#e59a9c',
 | 
				
			||||||
 | 
					  '#d9d1a5',
 | 
				
			||||||
 | 
					  '#c9bede',
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					const barColors = [
 | 
				
			||||||
 | 
					  '#1f77b4',
 | 
				
			||||||
 | 
					  '#8c564b',
 | 
				
			||||||
 | 
					  '#ff7f0e',
 | 
				
			||||||
 | 
					  '#e377c2',
 | 
				
			||||||
 | 
					  '#2ca02c',
 | 
				
			||||||
 | 
					  '#7f7f7f',
 | 
				
			||||||
 | 
					  '#d62728',
 | 
				
			||||||
 | 
					  '#bcbd22',
 | 
				
			||||||
 | 
					  '#9467bd',
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					const records = [
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: 1,
 | 
				
			||||||
 | 
					    title: 'Project Task 1',
 | 
				
			||||||
 | 
					    developer: 'bear.xiong',
 | 
				
			||||||
 | 
					    avatar:
 | 
				
			||||||
 | 
					      'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/bear.jpg',
 | 
				
			||||||
 | 
					    start: '2024-07-24',
 | 
				
			||||||
 | 
					    end: '2024-07-26',
 | 
				
			||||||
 | 
					    progress: 31,
 | 
				
			||||||
 | 
					    priority: 'P0',
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: 2,
 | 
				
			||||||
 | 
					    title: 'Project Task 2',
 | 
				
			||||||
 | 
					    developer: 'wolf.lang',
 | 
				
			||||||
 | 
					    avatar:
 | 
				
			||||||
 | 
					      'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/wolf.jpg',
 | 
				
			||||||
 | 
					    start: '07/25/2024',
 | 
				
			||||||
 | 
					    end: '07/28/2024',
 | 
				
			||||||
 | 
					    progress: 60,
 | 
				
			||||||
 | 
					    priority: 'P0',
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: 3,
 | 
				
			||||||
 | 
					    title: 'Project Task 3',
 | 
				
			||||||
 | 
					    developer: 'rabbit.tu',
 | 
				
			||||||
 | 
					    avatar:
 | 
				
			||||||
 | 
					      'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/rabbit.jpg',
 | 
				
			||||||
 | 
					    start: '2024-07-28',
 | 
				
			||||||
 | 
					    end: '2024-08-01',
 | 
				
			||||||
 | 
					    progress: 100,
 | 
				
			||||||
 | 
					    priority: 'P1',
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: 1,
 | 
				
			||||||
 | 
					    title: 'Project Task 4',
 | 
				
			||||||
 | 
					    developer: 'cat.mao',
 | 
				
			||||||
 | 
					    avatar:
 | 
				
			||||||
 | 
					      'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/cat.jpg',
 | 
				
			||||||
 | 
					    start: '2024-07-31',
 | 
				
			||||||
 | 
					    end: '2024-08-03',
 | 
				
			||||||
 | 
					    progress: 31,
 | 
				
			||||||
 | 
					    priority: 'P0',
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: 2,
 | 
				
			||||||
 | 
					    title: 'Project Task 5',
 | 
				
			||||||
 | 
					    developer: 'bird.niao',
 | 
				
			||||||
 | 
					    avatar:
 | 
				
			||||||
 | 
					      'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/bird.jpeg',
 | 
				
			||||||
 | 
					    start: '2024-08-02',
 | 
				
			||||||
 | 
					    end: '2024-08-04',
 | 
				
			||||||
 | 
					    progress: 60,
 | 
				
			||||||
 | 
					    priority: 'P0',
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: 6,
 | 
				
			||||||
 | 
					    title: 'Project Task 5',
 | 
				
			||||||
 | 
					    developer: 'bird.niao',
 | 
				
			||||||
 | 
					    avatar:
 | 
				
			||||||
 | 
					      'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/bird.jpeg',
 | 
				
			||||||
 | 
					    start: '2024-08-02',
 | 
				
			||||||
 | 
					    end: '2024-08-04',
 | 
				
			||||||
 | 
					    progress: 60,
 | 
				
			||||||
 | 
					    priority: 'P0',
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: 3,
 | 
				
			||||||
 | 
					    title: 'Project Task 6',
 | 
				
			||||||
 | 
					    developer: 'flower.hua',
 | 
				
			||||||
 | 
					    avatar:
 | 
				
			||||||
 | 
					      'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/flower.jpg',
 | 
				
			||||||
 | 
					    start: '2024-08-03',
 | 
				
			||||||
 | 
					    end: '2024-08-10',
 | 
				
			||||||
 | 
					    progress: 100,
 | 
				
			||||||
 | 
					    priority: 'P1',
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					const columns = [
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    field: 'title',
 | 
				
			||||||
 | 
					    title: 'TASK',
 | 
				
			||||||
 | 
					    width: '200',
 | 
				
			||||||
 | 
					    mergeCell: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    headerStyle: {
 | 
				
			||||||
 | 
					      textAlign: 'center',
 | 
				
			||||||
 | 
					      fontSize: 20,
 | 
				
			||||||
 | 
					      fontWeight: 'bold',
 | 
				
			||||||
 | 
					      color: 'white',
 | 
				
			||||||
 | 
					      bgColor: '#1c202c',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    style: {
 | 
				
			||||||
 | 
					      bgColor: '#1c202c',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    customLayout: args => {
 | 
				
			||||||
 | 
					      const { table, row, col, rect } = args
 | 
				
			||||||
 | 
					      const taskRecord = table.getCellOriginRecord(col, row)
 | 
				
			||||||
 | 
					      const { height, width } = rect ?? table.getCellRect(col, row)
 | 
				
			||||||
 | 
					      const container = new VRender.Group({
 | 
				
			||||||
 | 
					        y: 10,
 | 
				
			||||||
 | 
					        x: 20,
 | 
				
			||||||
 | 
					        height: height - 20,
 | 
				
			||||||
 | 
					        width: width - 40,
 | 
				
			||||||
 | 
					        fill: 'white',
 | 
				
			||||||
 | 
					        display: 'flex',
 | 
				
			||||||
 | 
					        flexDirection: 'column',
 | 
				
			||||||
 | 
					        cornerRadius: 30,
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const developer = new VRender.Text({
 | 
				
			||||||
 | 
					        text: taskRecord.developer,
 | 
				
			||||||
 | 
					        fontSize: 16,
 | 
				
			||||||
 | 
					        fontFamily: 'sans-serif',
 | 
				
			||||||
 | 
					        fill: barColors[args.row],
 | 
				
			||||||
 | 
					        fontWeight: 'bold',
 | 
				
			||||||
 | 
					        maxLineWidth: width - 120,
 | 
				
			||||||
 | 
					        boundsPadding: [10, 0, 0, 0],
 | 
				
			||||||
 | 
					        alignSelf: 'center',
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      container.add(developer)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const days = new VRender.Text({
 | 
				
			||||||
 | 
					        text: `${tools.formatDate(
 | 
				
			||||||
 | 
					          new Date(taskRecord.start),
 | 
				
			||||||
 | 
					          'mm/dd'
 | 
				
			||||||
 | 
					        )}-${tools.formatDate(new Date(taskRecord.end), 'mm/dd')}`,
 | 
				
			||||||
 | 
					        fontSize: 12,
 | 
				
			||||||
 | 
					        fontFamily: 'sans-serif',
 | 
				
			||||||
 | 
					        fontWeight: 'bold',
 | 
				
			||||||
 | 
					        fill: 'black',
 | 
				
			||||||
 | 
					        boundsPadding: [10, 0, 0, 0],
 | 
				
			||||||
 | 
					        alignSelf: 'center',
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      container.add(days)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return {
 | 
				
			||||||
 | 
					        rootContainer: container,
 | 
				
			||||||
 | 
					        expectedWidth: 160,
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					const option = {
 | 
				
			||||||
 | 
					  records,
 | 
				
			||||||
 | 
					  taskListTable: {
 | 
				
			||||||
 | 
					    columns,
 | 
				
			||||||
 | 
					    tableWidth: 'auto',
 | 
				
			||||||
 | 
					    theme: {
 | 
				
			||||||
 | 
					      underlayBackgroundColor: '#1c202c',
 | 
				
			||||||
 | 
					      headerStyle: {
 | 
				
			||||||
 | 
					        borderColor: '#e1e4e8',
 | 
				
			||||||
 | 
					        borderLineWidth: 0,
 | 
				
			||||||
 | 
					        fontSize: 18,
 | 
				
			||||||
 | 
					        fontWeight: 'bold',
 | 
				
			||||||
 | 
					        color: 'red',
 | 
				
			||||||
 | 
					        // bgColor: '#EEF1F5'
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      bodyStyle: {
 | 
				
			||||||
 | 
					        borderColor: '#e1e4e8',
 | 
				
			||||||
 | 
					        borderLineWidth: 0,
 | 
				
			||||||
 | 
					        fontSize: 16,
 | 
				
			||||||
 | 
					        color: '#4D4D4D',
 | 
				
			||||||
 | 
					        bgColor: '#FFF',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  frame: {
 | 
				
			||||||
 | 
					    outerFrameStyle: {
 | 
				
			||||||
 | 
					      borderLineWidth: 0,
 | 
				
			||||||
 | 
					      borderColor: 'red',
 | 
				
			||||||
 | 
					      cornerRadius: 0,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    // verticalSplitLineHighlight: {
 | 
				
			||||||
 | 
					    //   lineColor: 'green',
 | 
				
			||||||
 | 
					    //   lineWidth: 3
 | 
				
			||||||
 | 
					    // }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  grid: {
 | 
				
			||||||
 | 
					    backgroundColor: '#1c202c',
 | 
				
			||||||
 | 
					    // horizontalLine: {
 | 
				
			||||||
 | 
					    //   lineWidth: 2,
 | 
				
			||||||
 | 
					    //   lineColor: '#d5d9ee',
 | 
				
			||||||
 | 
					    // },
 | 
				
			||||||
 | 
					    verticalLine: {
 | 
				
			||||||
 | 
					      lineWidth: 1,
 | 
				
			||||||
 | 
					      lineColor: '#d5d9ee',
 | 
				
			||||||
 | 
					      lineDash: [8, 4],
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  taskList: {
 | 
				
			||||||
 | 
					    backgroundColor: '#1c202c',
 | 
				
			||||||
 | 
					    headerStyle: {
 | 
				
			||||||
 | 
					      borderColor: '#e1e4e8',
 | 
				
			||||||
 | 
					      borderLineWidth: 0,
 | 
				
			||||||
 | 
					      fontSize: 18,
 | 
				
			||||||
 | 
					      fontWeight: 'bold',
 | 
				
			||||||
 | 
					      color: 'red',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  headerRowHeight: 60,
 | 
				
			||||||
 | 
					  rowHeight: 100,
 | 
				
			||||||
 | 
					  taskBar: {
 | 
				
			||||||
 | 
					    resizable: false,
 | 
				
			||||||
 | 
					    moveable: false,
 | 
				
			||||||
 | 
					    startDateField: 'start',
 | 
				
			||||||
 | 
					    endDateField: 'end',
 | 
				
			||||||
 | 
					    progressField: 'progress',
 | 
				
			||||||
 | 
					    barStyle: { width: 60 },
 | 
				
			||||||
 | 
					    customLayout: args => {
 | 
				
			||||||
 | 
					      const colorLength = barColors.length
 | 
				
			||||||
 | 
					      const {
 | 
				
			||||||
 | 
					        width,
 | 
				
			||||||
 | 
					        height,
 | 
				
			||||||
 | 
					        index,
 | 
				
			||||||
 | 
					        startDate,
 | 
				
			||||||
 | 
					        endDate,
 | 
				
			||||||
 | 
					        taskDays,
 | 
				
			||||||
 | 
					        progress,
 | 
				
			||||||
 | 
					        taskRecord,
 | 
				
			||||||
 | 
					        ganttInstance,
 | 
				
			||||||
 | 
					      } = args
 | 
				
			||||||
 | 
					      const container = new VRender.Group({
 | 
				
			||||||
 | 
					        width,
 | 
				
			||||||
 | 
					        height,
 | 
				
			||||||
 | 
					        // cornerRadius: 30,
 | 
				
			||||||
 | 
					        fill: {
 | 
				
			||||||
 | 
					          gradient: 'linear',
 | 
				
			||||||
 | 
					          x0: 0,
 | 
				
			||||||
 | 
					          y0: 0,
 | 
				
			||||||
 | 
					          x1: 1,
 | 
				
			||||||
 | 
					          y1: 0,
 | 
				
			||||||
 | 
					          stops: [
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              offset: 0,
 | 
				
			||||||
 | 
					              color: barColors0[index % colorLength],
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              offset: 0.5,
 | 
				
			||||||
 | 
					              color: barColors[index % colorLength],
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              offset: 1,
 | 
				
			||||||
 | 
					              color: barColors0[index % colorLength],
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          ],
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        display: 'flex',
 | 
				
			||||||
 | 
					        // flexDirection: 'column',
 | 
				
			||||||
 | 
					        flexWrap: 'nowrap',
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      const containerLeft = new VRender.Group({
 | 
				
			||||||
 | 
					        height: 60,
 | 
				
			||||||
 | 
					        width: 60,
 | 
				
			||||||
 | 
					        display: 'flex',
 | 
				
			||||||
 | 
					        flexDirection: 'column',
 | 
				
			||||||
 | 
					        alignItems: 'center',
 | 
				
			||||||
 | 
					        justifyContent: 'space-around',
 | 
				
			||||||
 | 
					        // fill: 'red'
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      container.add(containerLeft)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const avatar = new VRender.Image({
 | 
				
			||||||
 | 
					        width: 50,
 | 
				
			||||||
 | 
					        height: 50,
 | 
				
			||||||
 | 
					        image: taskRecord.avatar,
 | 
				
			||||||
 | 
					        cornerRadius: 25,
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      containerLeft.add(avatar)
 | 
				
			||||||
 | 
					      const containerCenter = new VRender.Group({
 | 
				
			||||||
 | 
					        height: 60,
 | 
				
			||||||
 | 
					        width: width - (width >= 120 ? 120 : 60),
 | 
				
			||||||
 | 
					        display: 'flex',
 | 
				
			||||||
 | 
					        // flexDirection: 'column',
 | 
				
			||||||
 | 
					        // alignItems: 'left'
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      container.add(containerCenter)
 | 
				
			||||||
 | 
					      const checkbox = new VRender.CheckBox(checked.value)
 | 
				
			||||||
 | 
					      container.add(checkbox)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      checkbox.addEventListener('click', event => {
 | 
				
			||||||
 | 
					        console.log(event, checkbox, 'event')
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      const developer = new VRender.Text({
 | 
				
			||||||
 | 
					        text: taskRecord.developer,
 | 
				
			||||||
 | 
					        fontSize: 16,
 | 
				
			||||||
 | 
					        fontFamily: 'sans-serif',
 | 
				
			||||||
 | 
					        fill: 'white',
 | 
				
			||||||
 | 
					        fontWeight: 'bold',
 | 
				
			||||||
 | 
					        maxLineWidth: width - (width >= 120 ? 120 : 60),
 | 
				
			||||||
 | 
					        boundsPadding: [10, 0, 0, 0],
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      containerCenter.add(developer)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const days = new VRender.Text({
 | 
				
			||||||
 | 
					        text: `${taskDays}天`,
 | 
				
			||||||
 | 
					        fontSize: 13,
 | 
				
			||||||
 | 
					        fontFamily: 'sans-serif',
 | 
				
			||||||
 | 
					        fill: 'white',
 | 
				
			||||||
 | 
					        boundsPadding: [10, 0, 0, 0],
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      containerCenter.add(days)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (width >= 120) {
 | 
				
			||||||
 | 
					        const containerRight = new VRender.Group({
 | 
				
			||||||
 | 
					          cornerRadius: 20,
 | 
				
			||||||
 | 
					          fill: 'white',
 | 
				
			||||||
 | 
					          height: 40,
 | 
				
			||||||
 | 
					          width: 40,
 | 
				
			||||||
 | 
					          display: 'flex',
 | 
				
			||||||
 | 
					          flexDirection: 'column',
 | 
				
			||||||
 | 
					          alignItems: 'center',
 | 
				
			||||||
 | 
					          justifyContent: 'center', // 垂直方向居中对齐
 | 
				
			||||||
 | 
					          boundsPadding: [10, 0, 0, 0],
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        container.add(containerRight)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const progressText = new VRender.Text({
 | 
				
			||||||
 | 
					          text: `${progress}%`,
 | 
				
			||||||
 | 
					          fontSize: 12,
 | 
				
			||||||
 | 
					          fontFamily: 'sans-serif',
 | 
				
			||||||
 | 
					          fill: 'black',
 | 
				
			||||||
 | 
					          alignSelf: 'center',
 | 
				
			||||||
 | 
					          fontWeight: 'bold',
 | 
				
			||||||
 | 
					          maxLineWidth: (width - 60) / 2,
 | 
				
			||||||
 | 
					          boundsPadding: [0, 0, 0, 0],
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        containerRight.add(progressText)
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return {
 | 
				
			||||||
 | 
					        rootContainer: container,
 | 
				
			||||||
 | 
					        // renderDefaultBar: true
 | 
				
			||||||
 | 
					        // renderDefaultText: true
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    hoverBarStyle: {
 | 
				
			||||||
 | 
					      cornerRadius: 0,
 | 
				
			||||||
 | 
					      barOverlayColor: '#f0f0',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  timelineHeader: {
 | 
				
			||||||
 | 
					    backgroundColor: '#1c202c',
 | 
				
			||||||
 | 
					    colWidth: 100,
 | 
				
			||||||
 | 
					    // verticalLine: {
 | 
				
			||||||
 | 
					    //   lineColor: 'red',
 | 
				
			||||||
 | 
					    //   lineWidth: 1,
 | 
				
			||||||
 | 
					    //   lineDash: [4, 2]
 | 
				
			||||||
 | 
					    // },
 | 
				
			||||||
 | 
					    // horizontalLine: {
 | 
				
			||||||
 | 
					    //   lineColor: 'green',
 | 
				
			||||||
 | 
					    //   lineWidth: 1,
 | 
				
			||||||
 | 
					    //   lineDash: [4, 2]
 | 
				
			||||||
 | 
					    // },
 | 
				
			||||||
 | 
					    scales: [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        unit: 'day',
 | 
				
			||||||
 | 
					        step: 1,
 | 
				
			||||||
 | 
					        format(date) {
 | 
				
			||||||
 | 
					          return date.dateIndex.toString()
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        customLayout: args => {
 | 
				
			||||||
 | 
					          const colorLength = barColors.length
 | 
				
			||||||
 | 
					          const {
 | 
				
			||||||
 | 
					            width,
 | 
				
			||||||
 | 
					            height,
 | 
				
			||||||
 | 
					            index,
 | 
				
			||||||
 | 
					            startDate,
 | 
				
			||||||
 | 
					            endDate,
 | 
				
			||||||
 | 
					            days,
 | 
				
			||||||
 | 
					            dateIndex,
 | 
				
			||||||
 | 
					            title,
 | 
				
			||||||
 | 
					            ganttInstance,
 | 
				
			||||||
 | 
					          } = args
 | 
				
			||||||
 | 
					          console.log(width, height, 'height')
 | 
				
			||||||
 | 
					          const container = new VRender.Group({
 | 
				
			||||||
 | 
					            width,
 | 
				
			||||||
 | 
					            height,
 | 
				
			||||||
 | 
					            fill: '#1c202c',
 | 
				
			||||||
 | 
					            display: 'flex',
 | 
				
			||||||
 | 
					            flexDirection: 'row',
 | 
				
			||||||
 | 
					            flexWrap: 'nowrap',
 | 
				
			||||||
 | 
					          })
 | 
				
			||||||
 | 
					          const containerLeft = new VRender.Group({
 | 
				
			||||||
 | 
					            height,
 | 
				
			||||||
 | 
					            width: 30,
 | 
				
			||||||
 | 
					            display: 'flex',
 | 
				
			||||||
 | 
					            flexDirection: 'column',
 | 
				
			||||||
 | 
					            alignItems: 'center',
 | 
				
			||||||
 | 
					            justifyContent: 'space-around',
 | 
				
			||||||
 | 
					            // fill: 'red'
 | 
				
			||||||
 | 
					          })
 | 
				
			||||||
 | 
					          container.add(containerLeft)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          const avatar = new VRender.Image({
 | 
				
			||||||
 | 
					            width: 20,
 | 
				
			||||||
 | 
					            height: 30,
 | 
				
			||||||
 | 
					            image:
 | 
				
			||||||
 | 
					              '<svg t="1724675965803" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4299" width="200" height="200"><path d="M53.085678 141.319468C23.790257 141.319468 0 165.035326 0 194.34775L0 918.084273C0 947.295126 23.796789 971.112572 53.085678 971.112572L970.914322 971.112572C1000.209743 971.112572 1024 947.396696 1024 918.084273L1024 194.34775C1024 165.136896 1000.203211 141.319468 970.914322 141.319468L776.827586 141.319468 812.137931 176.629813 812.137931 88.275862C812.137931 68.774506 796.328942 52.965517 776.827586 52.965517 757.32623 52.965517 741.517241 68.774506 741.517241 88.275862L741.517241 176.629813 741.517241 211.940158 776.827586 211.940158 970.914322 211.940158C961.186763 211.940158 953.37931 204.125926 953.37931 194.34775L953.37931 918.084273C953.37931 908.344373 961.25643 900.491882 970.914322 900.491882L53.085678 900.491882C62.813237 900.491882 70.62069 908.306097 70.62069 918.084273L70.62069 194.34775C70.62069 204.087649 62.74357 211.940158 53.085678 211.940158L247.172414 211.940158C266.67377 211.940158 282.482759 196.131169 282.482759 176.629813 282.482759 157.128439 266.67377 141.319468 247.172414 141.319468L53.085678 141.319468ZM211.862069 176.629813C211.862069 196.131169 227.671058 211.940158 247.172414 211.940158 266.67377 211.940158 282.482759 196.131169 282.482759 176.629813L282.482759 88.275862C282.482759 68.774506 266.67377 52.965517 247.172414 52.965517 227.671058 52.965517 211.862069 68.774506 211.862069 88.275862L211.862069 176.629813ZM1024 353.181537 1024 317.871192 988.689655 317.871192 35.310345 317.871192 0 317.871192 0 353.181537 0 441.457399C0 460.958755 15.808989 476.767744 35.310345 476.767744 54.811701 476.767744 70.62069 460.958755 70.62069 441.457399L70.62069 353.181537 35.310345 388.491882 988.689655 388.491882 953.37931 353.181537 953.37931 441.457399C953.37931 460.958755 969.188299 476.767744 988.689655 476.767744 1008.191011 476.767744 1024 460.958755 1024 441.457399L1024 353.181537ZM776.937913 582.62069C796.439287 582.62069 812.248258 566.811701 812.248258 547.310345 812.248258 527.808989 796.439287 512 776.937913 512L247.172414 512C227.671058 512 211.862069 527.808989 211.862069 547.310345 211.862069 566.811701 227.671058 582.62069 247.172414 582.62069L776.937913 582.62069ZM247.172414 688.551724C227.671058 688.551724 211.862069 704.360713 211.862069 723.862069 211.862069 743.363425 227.671058 759.172414 247.172414 759.172414L600.386189 759.172414C619.887563 759.172414 635.696534 743.363425 635.696534 723.862069 635.696534 704.360713 619.887563 688.551724 600.386189 688.551724L247.172414 688.551724ZM776.827586 211.940158 741.517241 176.629813 741.517241 247.328574C741.517241 266.829948 757.32623 282.638919 776.827586 282.638919 796.328942 282.638919 812.137931 266.829948 812.137931 247.328574L812.137931 176.629813 812.137931 141.319468 776.827586 141.319468 247.172414 141.319468C227.671058 141.319468 211.862069 157.128439 211.862069 176.629813 211.862069 196.131169 227.671058 211.940158 247.172414 211.940158L776.827586 211.940158ZM282.482759 176.629813C282.482759 157.128439 266.67377 141.319468 247.172414 141.319468 227.671058 141.319468 211.862069 157.128439 211.862069 176.629813L211.862069 247.328574C211.862069 266.829948 227.671058 282.638919 247.172414 282.638919 266.67377 282.638919 282.482759 266.829948 282.482759 247.328574L282.482759 176.629813Z" fill="#389BFF" p-id="4300"></path></svg>',
 | 
				
			||||||
 | 
					          })
 | 
				
			||||||
 | 
					          containerLeft.add(avatar)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          const containerCenter = new VRender.Group({
 | 
				
			||||||
 | 
					            height,
 | 
				
			||||||
 | 
					            width: width - 30,
 | 
				
			||||||
 | 
					            display: 'flex',
 | 
				
			||||||
 | 
					            flexDirection: 'column',
 | 
				
			||||||
 | 
					            // alignItems: 'left'
 | 
				
			||||||
 | 
					          })
 | 
				
			||||||
 | 
					          container.add(containerCenter)
 | 
				
			||||||
 | 
					          const dayNumber = new VRender.Text({
 | 
				
			||||||
 | 
					            text: String(dateIndex).padStart(2, '0'),
 | 
				
			||||||
 | 
					            fontSize: 20,
 | 
				
			||||||
 | 
					            fontWeight: 'bold',
 | 
				
			||||||
 | 
					            fontFamily: 'sans-serif',
 | 
				
			||||||
 | 
					            fill: 'white',
 | 
				
			||||||
 | 
					            textAlign: 'right',
 | 
				
			||||||
 | 
					            maxLineWidth: width - 30,
 | 
				
			||||||
 | 
					            boundsPadding: [15, 0, 0, 0],
 | 
				
			||||||
 | 
					          })
 | 
				
			||||||
 | 
					          containerCenter.add(dayNumber)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          const weekDay = new VRender.Text({
 | 
				
			||||||
 | 
					            text: tools.getWeekday(startDate, 'short').toLocaleUpperCase(),
 | 
				
			||||||
 | 
					            fontSize: 12,
 | 
				
			||||||
 | 
					            fontFamily: 'sans-serif',
 | 
				
			||||||
 | 
					            fill: 'white',
 | 
				
			||||||
 | 
					            boundsPadding: [0, 0, 0, 0],
 | 
				
			||||||
 | 
					          })
 | 
				
			||||||
 | 
					          containerCenter.add(weekDay)
 | 
				
			||||||
 | 
					          return {
 | 
				
			||||||
 | 
					            rootContainer: container,
 | 
				
			||||||
 | 
					            //renderDefaultText: true
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  minDate: '2024-07-20',
 | 
				
			||||||
 | 
					  maxDate: '2024-08-30',
 | 
				
			||||||
 | 
					  markLine: [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      date: '2024-07-29',
 | 
				
			||||||
 | 
					      style: {
 | 
				
			||||||
 | 
					        lineWidth: 1,
 | 
				
			||||||
 | 
					        lineColor: 'blue',
 | 
				
			||||||
 | 
					        lineDash: [8, 4],
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      date: '2024-08-17',
 | 
				
			||||||
 | 
					      style: {
 | 
				
			||||||
 | 
					        lineWidth: 2,
 | 
				
			||||||
 | 
					        lineColor: 'red',
 | 
				
			||||||
 | 
					        lineDash: [8, 4],
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  scrollStyle: {
 | 
				
			||||||
 | 
					    scrollRailColor: 'RGBA(246,246,246,0)',
 | 
				
			||||||
 | 
					    visible: 'focus',
 | 
				
			||||||
 | 
					    width: 6,
 | 
				
			||||||
 | 
					    scrollSliderCornerRadius: 2,
 | 
				
			||||||
 | 
					    scrollSliderColor: 'rgba(255,255,255,0.25)',
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  underlayBackgroundColor: '#1c202c',
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const range = ref()
 | 
				
			||||||
 | 
					const value = ref('month')
 | 
				
			||||||
 | 
					onMounted(() => {
 | 
				
			||||||
 | 
					  nextTick(() => {
 | 
				
			||||||
 | 
					    ganttInstance = new Gantt(document.getElementById('tableContainer'), option)
 | 
				
			||||||
 | 
					    window['ganttInstance'] = ganttInstance
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div class="flex flex-col bg-[#1c202c] w-h-full">
 | 
				
			||||||
 | 
					    <div class="relative h-[60px]">
 | 
				
			||||||
 | 
					      <header-com />
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div class="z-30 flex flex-1 flex-col gap-2 p-5">
 | 
				
			||||||
 | 
					      <div class="flex gap-2">
 | 
				
			||||||
 | 
					        <n-date-picker v-model:value="range" type="daterange" clearable />
 | 
				
			||||||
 | 
					        <n-radio-group v-model:value="value" name="radiobuttongroup">
 | 
				
			||||||
 | 
					          <n-radio-button value="day" label="日" />
 | 
				
			||||||
 | 
					          <n-radio-button value="month" label="月" />
 | 
				
			||||||
 | 
					        </n-radio-group>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					      <div id="tableContainer" class="bg-[#1c202c] w-h-full"></div>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
							
								
								
									
										17
									
								
								src/views/Gantt/index.jsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/views/Gantt/index.jsx
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					import { RouterView } from 'vue-router'
 | 
				
			||||||
 | 
					import HeaderCom from '../Content/components/Header/index.vue'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default defineComponent({
 | 
				
			||||||
 | 
					  setup() {
 | 
				
			||||||
 | 
					    return () => (
 | 
				
			||||||
 | 
					      <div class="flex flex-col bg-[#1c202c] w-h-full">
 | 
				
			||||||
 | 
					        <div class="relative h-[60px]">
 | 
				
			||||||
 | 
					          <HeaderCom />
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					        <div class="z-30 flex flex-1 flex-col gap-4 p-5">
 | 
				
			||||||
 | 
					          <RouterView />
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
							
								
								
									
										7
									
								
								src/views/Gantt/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								src/views/Gantt/index.vue
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					<script setup>
 | 
				
			||||||
 | 
					import TestJsx from './index.jsx'
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <test-jsx />
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
@ -47,7 +47,7 @@ export function useSatellite() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // setTimeout(() => {
 | 
					    // setTimeout(() => {
 | 
				
			||||||
    //   satellite.sensor = true
 | 
					    //   satellite.sensor = true
 | 
				
			||||||
    // }, 10000)
 | 
					    // }, 2000)
 | 
				
			||||||
    // viewer.clock.multiplier = 100
 | 
					    // viewer.clock.multiplier = 100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return cesiumSateEntity
 | 
					    return cesiumSateEntity
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										98
									
								
								src/views/Weather/hooks/weather.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								src/views/Weather/hooks/weather.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,98 @@
 | 
				
			|||||||
 | 
					import { ref, nextTick } from 'vue'
 | 
				
			||||||
 | 
					import { parseWKT } from '@/utils/parseWKT'
 | 
				
			||||||
 | 
					import Subscriber from '@cesium-extends/subscriber'
 | 
				
			||||||
 | 
					import { useWeatherPopup } from './weatherPopup'
 | 
				
			||||||
 | 
					const { popupMap, createPopup } = useWeatherPopup()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let subscriber: Subscriber | null = null
 | 
				
			||||||
 | 
					const weatherMap = new Map()
 | 
				
			||||||
 | 
					const weatherList = [
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: '10',
 | 
				
			||||||
 | 
					    createTime: null,
 | 
				
			||||||
 | 
					    updateTime: null,
 | 
				
			||||||
 | 
					    geom: 'POINT (121.9 29.02)',
 | 
				
			||||||
 | 
					    type: 'weather',
 | 
				
			||||||
 | 
					    name: '晴天',
 | 
				
			||||||
 | 
					    description: null,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					const useWeather = () => {
 | 
				
			||||||
 | 
					  const showWeather = ref(true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  nextTick(() => {
 | 
				
			||||||
 | 
					    watch(
 | 
				
			||||||
 | 
					      showWeather,
 | 
				
			||||||
 | 
					      newVal => {
 | 
				
			||||||
 | 
					        newVal ? showWeatherPoints() : hideWeatherPoints()
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        immediate: true,
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return {
 | 
				
			||||||
 | 
					    showWeather,
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function showWeatherPoints() {
 | 
				
			||||||
 | 
					  subscriber = new Subscriber(viewer, {
 | 
				
			||||||
 | 
					    pickResult: {
 | 
				
			||||||
 | 
					      enable: true,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					  weatherList.forEach(data => {
 | 
				
			||||||
 | 
					    const entity = createWeatherPoint(data)
 | 
				
			||||||
 | 
					    addEventSub(data.id, entity, data)
 | 
				
			||||||
 | 
					    weatherMap.set(data.id, entity)
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function hideWeatherPoints() {
 | 
				
			||||||
 | 
					  subscriber && subscriber.destroy()
 | 
				
			||||||
 | 
					  weatherMap.keys().forEach(key => {
 | 
				
			||||||
 | 
					    viewer.entities.remove(weatherMap.get(key))
 | 
				
			||||||
 | 
					    weatherMap.delete(key)
 | 
				
			||||||
 | 
					    if (popupMap.has(key)) {
 | 
				
			||||||
 | 
					      popupMap.get(key).windowClose()
 | 
				
			||||||
 | 
					      popupMap.delete(key)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function createWeatherPoint(data) {
 | 
				
			||||||
 | 
					  const { name, geom } = data
 | 
				
			||||||
 | 
					  const pos = parseWKT(geom).coordinates
 | 
				
			||||||
 | 
					  const entity = viewer.entities.add({
 | 
				
			||||||
 | 
					    name,
 | 
				
			||||||
 | 
					    position: Cesium.Cartesian3.fromDegrees(...pos),
 | 
				
			||||||
 | 
					    billboard: {
 | 
				
			||||||
 | 
					      image: '/images/icons/base/weather.png',
 | 
				
			||||||
 | 
					      width: 30,
 | 
				
			||||||
 | 
					      height: 30,
 | 
				
			||||||
 | 
					      verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					  return entity
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function addEventSub(
 | 
				
			||||||
 | 
					  id: string | number,
 | 
				
			||||||
 | 
					  entity: Cesium.Entity,
 | 
				
			||||||
 | 
					  data: Record<string, any>
 | 
				
			||||||
 | 
					) {
 | 
				
			||||||
 | 
					  subscriber &&
 | 
				
			||||||
 | 
					    subscriber.add(
 | 
				
			||||||
 | 
					      entity,
 | 
				
			||||||
 | 
					      (movement, entity) => {
 | 
				
			||||||
 | 
					        console.log(movement, entity, 'move')
 | 
				
			||||||
 | 
					        createPopup(id, entity.position, data)
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      'LEFT_CLICK'
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  // console.log(subscriber, '-------')
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export { useWeather }
 | 
				
			||||||
							
								
								
									
										39
									
								
								src/views/Weather/hooks/weatherPopup.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								src/views/Weather/hooks/weatherPopup.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,39 @@
 | 
				
			|||||||
 | 
					import Popup from '@/views/Earth/components/Popup'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const popupMap: Map<string | number, any> = new Map()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const useWeatherPopup = () => {
 | 
				
			||||||
 | 
					  return {
 | 
				
			||||||
 | 
					    popupMap,
 | 
				
			||||||
 | 
					    createPopup,
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function createPopup(id: string | number, position: Cesium.Cartesian3, data) {
 | 
				
			||||||
 | 
					  if (popupMap.has(id)) {
 | 
				
			||||||
 | 
					    return
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  const opts = {
 | 
				
			||||||
 | 
					    viewer,
 | 
				
			||||||
 | 
					    position,
 | 
				
			||||||
 | 
					    title: '天气信息',
 | 
				
			||||||
 | 
					    slotContent: generateContent(data),
 | 
				
			||||||
 | 
					    // slotFooter: generateFooter(data),
 | 
				
			||||||
 | 
					    closeEvent: function () {
 | 
				
			||||||
 | 
					      if (popupMap.has(id)) {
 | 
				
			||||||
 | 
					        popupMap.get(id).windowClose()
 | 
				
			||||||
 | 
					        popupMap.delete(id)
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  const popup = new Popup(opts)
 | 
				
			||||||
 | 
					  popupMap.set(id, popup)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function generateContent(data: TBaseNode) {
 | 
				
			||||||
 | 
					  return h(
 | 
				
			||||||
 | 
					    'div',
 | 
				
			||||||
 | 
					    {},
 | 
				
			||||||
 | 
					    Object.keys(data).map(key => h('div', {}, `${key}:${data[key]}`))
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -4,6 +4,7 @@ import { defineConfig } from 'vite'
 | 
				
			|||||||
import vue from '@vitejs/plugin-vue'
 | 
					import vue from '@vitejs/plugin-vue'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import WindiCSS from 'vite-plugin-windicss'
 | 
					import WindiCSS from 'vite-plugin-windicss'
 | 
				
			||||||
 | 
					import vueJsx from '@vitejs/plugin-vue-jsx'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import AutoImport from 'unplugin-auto-import/vite'
 | 
					import AutoImport from 'unplugin-auto-import/vite'
 | 
				
			||||||
import Components from 'unplugin-vue-components/vite'
 | 
					import Components from 'unplugin-vue-components/vite'
 | 
				
			||||||
@ -11,17 +12,18 @@ import { NaiveUiResolver } from 'unplugin-vue-components/resolvers'
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// https://vitejs.dev/config/
 | 
					// https://vitejs.dev/config/
 | 
				
			||||||
export default defineConfig({
 | 
					export default defineConfig({
 | 
				
			||||||
  define: {
 | 
					  // define: {
 | 
				
			||||||
    // enable hydration mismatch details in production build
 | 
					  //   // enable hydration mismatch details in production build
 | 
				
			||||||
    __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'true',
 | 
					  //   __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'true',
 | 
				
			||||||
  },
 | 
					  // },
 | 
				
			||||||
 | 
					  base: '/',
 | 
				
			||||||
  plugins: [
 | 
					  plugins: [
 | 
				
			||||||
    vue({
 | 
					    vue({
 | 
				
			||||||
      script: {
 | 
					      script: {
 | 
				
			||||||
        defineModel: true,
 | 
					        defineModel: true,
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
    }),
 | 
					    }),
 | 
				
			||||||
 | 
					    vueJsx(),
 | 
				
			||||||
    WindiCSS(),
 | 
					    WindiCSS(),
 | 
				
			||||||
    AutoImport({
 | 
					    AutoImport({
 | 
				
			||||||
      imports: [
 | 
					      imports: [
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user