diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysTimelineSegmentController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysTimelineSegmentController.java new file mode 100644 index 0000000..25a06a1 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysTimelineSegmentController.java @@ -0,0 +1,81 @@ +package com.ruoyi.web.controller.system; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysTimelineSegment; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.system.service.ISysTimelineSegmentService; + +@RestController +@RequestMapping("/system/timeline") +public class SysTimelineSegmentController extends BaseController +{ + @Autowired + private ISysTimelineSegmentService segmentService; + + @PreAuthorize("@ss.hasPermi('system:timeline:list')") + @GetMapping("/list") + public AjaxResult list(SysTimelineSegment segment) + { + List list = segmentService.selectSegmentList(segment); + return success(list); + } + + @GetMapping("/listByRoomId/{roomId}") + public AjaxResult listByRoomId(@PathVariable Long roomId) + { + List list = segmentService.selectSegmentListByRoomId(roomId); + return success(list); + } + + @PreAuthorize("@ss.hasPermi('system:timeline:query')") + @GetMapping(value = "/{segmentId}") + public AjaxResult getInfo(@PathVariable Long segmentId) + { + return success(segmentService.selectSegmentById(segmentId)); + } + + @PreAuthorize("@ss.hasPermi('system:timeline:add')") + @Log(title = "时间轴管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody SysTimelineSegment segment) + { + return toAjax(segmentService.insertSegment(segment)); + } + + @PreAuthorize("@ss.hasPermi('system:timeline:edit')") + @Log(title = "时间轴管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody SysTimelineSegment segment) + { + return toAjax(segmentService.updateSegment(segment)); + } + + @PreAuthorize("@ss.hasPermi('system:timeline:remove')") + @Log(title = "时间轴管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{segmentId}") + public AjaxResult remove(@PathVariable Long segmentId) + { + return toAjax(segmentService.deleteSegmentById(segmentId)); + } + + @PreAuthorize("@ss.hasPermi('system:timeline:remove')") + @Log(title = "时间轴管理", businessType = BusinessType.DELETE) + @DeleteMapping("/room/{roomId}") + public AjaxResult removeByRoomId(@PathVariable Long roomId) + { + return toAjax(segmentService.deleteSegmentByRoomId(roomId)); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysTimelineSegment.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysTimelineSegment.java new file mode 100644 index 0000000..03476e4 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysTimelineSegment.java @@ -0,0 +1,89 @@ +package com.ruoyi.common.core.domain.entity; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +public class SysTimelineSegment +{ + private static final long serialVersionUID = 1L; + + private Long segmentId; + + private Long roomId; + + @NotBlank(message = "时间点不能为空") + @Size(min = 0, max = 8, message = "时间点长度不能超过8个字符") + private String segmentTime; + + @NotBlank(message = "时间段名称不能为空") + @Size(min = 0, max = 50, message = "时间段名称长度不能超过50个字符") + private String segmentName; + + @Size(max = 500, message = "时间段描述长度不能超过500个字符") + private String segmentDesc; + + public Long getSegmentId() + { + return segmentId; + } + + public void setSegmentId(Long segmentId) + { + this.segmentId = segmentId; + } + + @NotNull(message = "房间ID不能为空") + public Long getRoomId() + { + return roomId; + } + + public void setRoomId(Long roomId) + { + this.roomId = roomId; + } + + public String getSegmentTime() + { + return segmentTime; + } + + public void setSegmentTime(String segmentTime) + { + this.segmentTime = segmentTime; + } + + public String getSegmentName() + { + return segmentName; + } + + public void setSegmentName(String segmentName) + { + this.segmentName = segmentName; + } + + public String getSegmentDesc() + { + return segmentDesc; + } + + public void setSegmentDesc(String segmentDesc) + { + this.segmentDesc = segmentDesc; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("segmentId", getSegmentId()) + .append("roomId", getRoomId()) + .append("segmentTime", getSegmentTime()) + .append("segmentName", getSegmentName()) + .append("segmentDesc", getSegmentDesc()) + .toString(); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTimelineSegmentMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTimelineSegmentMapper.java new file mode 100644 index 0000000..9325299 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTimelineSegmentMapper.java @@ -0,0 +1,22 @@ +package com.ruoyi.system.mapper; + +import java.util.List; +import org.apache.ibatis.annotations.Param; +import com.ruoyi.common.core.domain.entity.SysTimelineSegment; + +public interface SysTimelineSegmentMapper +{ + public List selectSegmentList(SysTimelineSegment segment); + + public List selectSegmentListByRoomId(@Param("roomId") Long roomId); + + public SysTimelineSegment selectSegmentById(Long segmentId); + + public int insertSegment(SysTimelineSegment segment); + + public int updateSegment(SysTimelineSegment segment); + + public int deleteSegmentById(Long segmentId); + + public int deleteSegmentByRoomId(@Param("roomId") Long roomId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTimelineSegmentService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTimelineSegmentService.java new file mode 100644 index 0000000..7889654 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTimelineSegmentService.java @@ -0,0 +1,21 @@ +package com.ruoyi.system.service; + +import java.util.List; +import com.ruoyi.common.core.domain.entity.SysTimelineSegment; + +public interface ISysTimelineSegmentService +{ + public List selectSegmentList(SysTimelineSegment segment); + + public List selectSegmentListByRoomId(Long roomId); + + public SysTimelineSegment selectSegmentById(Long segmentId); + + public int insertSegment(SysTimelineSegment segment); + + public int updateSegment(SysTimelineSegment segment); + + public int deleteSegmentById(Long segmentId); + + public int deleteSegmentByRoomId(Long roomId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTimelineSegmentServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTimelineSegmentServiceImpl.java new file mode 100644 index 0000000..4623bc5 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTimelineSegmentServiceImpl.java @@ -0,0 +1,57 @@ +package com.ruoyi.system.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.common.core.domain.entity.SysTimelineSegment; +import com.ruoyi.system.mapper.SysTimelineSegmentMapper; +import com.ruoyi.system.service.ISysTimelineSegmentService; + +@Service +public class SysTimelineSegmentServiceImpl implements ISysTimelineSegmentService +{ + @Autowired + private SysTimelineSegmentMapper segmentMapper; + + @Override + public List selectSegmentList(SysTimelineSegment segment) + { + return segmentMapper.selectSegmentList(segment); + } + + @Override + public List selectSegmentListByRoomId(Long roomId) + { + return segmentMapper.selectSegmentListByRoomId(roomId); + } + + @Override + public SysTimelineSegment selectSegmentById(Long segmentId) + { + return segmentMapper.selectSegmentById(segmentId); + } + + @Override + public int insertSegment(SysTimelineSegment segment) + { + return segmentMapper.insertSegment(segment); + } + + @Override + public int updateSegment(SysTimelineSegment segment) + { + return segmentMapper.updateSegment(segment); + } + + @Override + public int deleteSegmentById(Long segmentId) + { + return segmentMapper.deleteSegmentById(segmentId); + } + + @Override + public int deleteSegmentByRoomId(Long roomId) + { + return segmentMapper.deleteSegmentByRoomId(roomId); + } +} diff --git a/ruoyi-system/src/main/resources/mapper/system/SysTimelineSegmentMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysTimelineSegmentMapper.xml new file mode 100644 index 0000000..4543628 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/system/SysTimelineSegmentMapper.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + select s.segment_id, s.room_id, s.segment_time, s.segment_name, s.segment_desc + from sys_timeline_segment s + + + + + + + + + + insert into sys_timeline_segment( + room_id, + segment_time, + segment_name, + segment_desc, + segment_id + )values( + #{roomId}, + #{segmentTime}, + #{segmentName}, + #{segmentDesc}, + #{segmentId} + ) + + + + update sys_timeline_segment + + segment_time = #{segmentTime}, + segment_name = #{segmentName}, + segment_desc = #{segmentDesc}, + + where segment_id = #{segmentId} + + + + delete from sys_timeline_segment where segment_id = #{segmentId} + + + + delete from sys_timeline_segment where room_id = #{roomId} + + + diff --git a/ruoyi-ui/src/api/system/timeline.js b/ruoyi-ui/src/api/system/timeline.js new file mode 100644 index 0000000..11c9873 --- /dev/null +++ b/ruoyi-ui/src/api/system/timeline.js @@ -0,0 +1,53 @@ +import request from '@/utils/request' + +export function listTimelineSegments(query) { + return request({ + url: '/system/timeline/list', + method: 'get', + params: query + }) +} + +export function getTimelineSegmentsByRoomId(roomId) { + return request({ + url: '/system/timeline/listByRoomId/' + roomId, + method: 'get' + }) +} + +export function getTimelineSegment(id) { + return request({ + url: '/system/timeline/' + id, + method: 'get' + }) +} + +export function addTimelineSegment(data) { + return request({ + url: '/system/timeline', + method: 'post', + data: data + }) +} + +export function updateTimelineSegment(data) { + return request({ + url: '/system/timeline', + method: 'put', + data: data + }) +} + +export function delTimelineSegment(id) { + return request({ + url: '/system/timeline/' + id, + method: 'delete' + }) +} + +export function delTimelineSegmentsByRoomId(roomId) { + return request({ + url: '/system/timeline/room/' + roomId, + method: 'delete' + }) +} diff --git a/ruoyi-ui/src/lang/en.js b/ruoyi-ui/src/lang/en.js index 57a7351..3d55431 100644 --- a/ruoyi-ui/src/lang/en.js +++ b/ruoyi-ui/src/lang/en.js @@ -71,6 +71,13 @@ export default { systemDescription: 'System Description', language: 'Language' }, + tools: { + routeCalculation: 'Route Calculation', + conflictDisplay: 'Conflict Display', + dataMaterials: 'Data Materials', + coordinateConversion: 'Coordinate Conversion', + generateGanttChart: 'Generate Gantt Chart' + }, favorites: { layerFavorites: 'Layer Favorites', routeFavorites: 'Route Favorites' diff --git a/ruoyi-ui/src/lang/zh.js b/ruoyi-ui/src/lang/zh.js index ece9c1f..11c1864 100644 --- a/ruoyi-ui/src/lang/zh.js +++ b/ruoyi-ui/src/lang/zh.js @@ -71,6 +71,13 @@ export default { systemDescription: '系统说明', language: '语言' }, + tools: { + routeCalculation: '航线计算', + conflictDisplay: '冲突显示', + dataMaterials: '数据资料', + coordinateConversion: '坐标转换', + generateGanttChart: '生成甘特图' + }, favorites: { layerFavorites: '图层收藏', routeFavorites: '航线收藏' diff --git a/ruoyi-ui/src/router/index.js b/ruoyi-ui/src/router/index.js index 1015974..1770a53 100644 --- a/ruoyi-ui/src/router/index.js +++ b/ruoyi-ui/src/router/index.js @@ -70,6 +70,11 @@ export const constantRoutes = [ hidden: true }, { + path: '/ganttChart', + component: () => import('@/views/ganttChart'), + hidden: true + }, + { path: '/register', component: () => import('@/views/register'), hidden: true diff --git a/ruoyi-ui/src/views/cesiumMap/index.vue b/ruoyi-ui/src/views/cesiumMap/index.vue index a63b0d2..358b0e8 100644 --- a/ruoyi-ui/src/views/cesiumMap/index.vue +++ b/ruoyi-ui/src/views/cesiumMap/index.vue @@ -100,7 +100,7 @@ @@ -144,7 +144,7 @@ -
+
{{ scaleBarText }}
@@ -204,6 +204,10 @@ export default { type: String, default: 'dms' // 'decimal' 或 'dms' }, + bottomPanelVisible: { + type: Boolean, + default: false + }, /** 航线上锁状态(由父组件维护,与右侧列表锁图标同步) */ routeLocked: { type: Object, @@ -1643,9 +1647,9 @@ export default { id: platformBillboardId, name: (platform && platform.name) || '平台', position: originalPositions[0], - properties: { - routeId: routeId, - platformId: (platform && platform.id) || 0 + properties: { + routeId: routeId, + platformId: (platform && platform.id) || 0 }, billboard: { image: fullUrl, @@ -1666,9 +1670,9 @@ export default { if (target && target.billboard) { target.billboard.image = whiteImage; // 此时 target.billboard.color 已在创建时设为 BLACK(航线飞机默认黑色),染色后显示为黑色图标 - + // 如果在图片处理期间已经加载了自定义样式(Redis),需要重新应用一次颜色否则这里会保持默认黑色,覆盖掉 applyRedisPlatformStyles 的效果(如果它先执行了) - + if (this.platformCustomStyles && this.platformCustomStyles[routeId]) { const style = this.platformCustomStyles[routeId]; if (style.platformColor) { @@ -2372,7 +2376,7 @@ export default { // 优先使用 Redis 自定义样式,如果没有则使用 routeLabelStyles(可能为空或旧值) const customStyle = this.platformCustomStyles[routeId]; let style = { fontSize: 16, fontColor: '#000000' }; - + if (customStyle) { style.fontSize = customStyle.labelFontSize || 16; style.fontColor = customStyle.labelFontColor || '#000000'; @@ -5343,7 +5347,7 @@ export default { let iconSize = 144 let iconColor = '#ffffff' let platformName = '平台' // 默认名称 - + // 尝试获取平台名称 if (labelEntity && labelEntity.label && labelEntity.label.text) { const now = Cesium.JulianDate.now() @@ -5374,7 +5378,7 @@ export default { this.editPlatformForm.iconSize = iconSize this.editPlatformForm.iconColor = iconColor this.editPlatformForm.platformName = platformName - this.editPlatformForm.platformId = ed.platformId || 0 + this.editPlatformForm.platformId = ed.platformId || 0 // 异步获取最新航线信息,更新 platformId 和 platformName if (routeId) { @@ -5448,7 +5452,7 @@ export default { platformEntity.billboard.height = size platformEntity.billboard.color = Cesium.Color.fromCssColorString(color) } - + // 更新样式缓存 this.$set(this.platformCustomStyles, routeId, { labelFontSize: fontSize, @@ -5575,14 +5579,14 @@ export default { const idStr = entity.id || ''; if (idStr.startsWith('route-platform-') && !idStr.startsWith('route-platform-label-')) { const routeId = idStr.replace('route-platform-', ''); - + // 获取 platformId let platformId = 0; if (entity.properties && entity.properties.platformId) { const now = Cesium.JulianDate.now(); platformId = entity.properties.platformId.getValue ? entity.properties.platformId.getValue(now) : entity.properties.platformId; } - + // 确保 platformId 存在(可能是字符串或数字,需转为数字判断) if (Number(platformId) > 0) { getPlatformStyle({ @@ -5592,7 +5596,7 @@ export default { }).then(res => { if (res.data) { const style = res.data; - + // 缓存样式 this.$set(this.platformCustomStyles, routeId, { labelFontSize: style.labelFontSize, @@ -5600,15 +5604,15 @@ export default { platformSize: style.platformSize, platformColor: style.platformColor }); - + // 应用标牌样式 const labelEntity = this.viewer.entities.getById(`route-platform-label-${routeId}`); if (labelEntity) { // 触发重绘(借助 updatePlatformPosition 中的逻辑) // 这里手动设置一下样式,updatePlatformPosition 会在下次更新时使用 - this.$set(this.routeLabelStyles, routeId, { - fontSize: style.labelFontSize || 16, - fontColor: style.labelFontColor || '#333333' + this.$set(this.routeLabelStyles, routeId, { + fontSize: style.labelFontSize || 16, + fontColor: style.labelFontColor || '#333333' }); // 强制更新标牌内容 if (labelEntity.labelDataCache) { @@ -5617,7 +5621,7 @@ export default { this.updatePlatformPosition(routeId, entity.position.getValue(Cesium.JulianDate.now()), null, labelEntity.labelDataCache); } } - + // 应用平台图标样式 if (entity.billboard) { const size = Math.max(48, Math.min(256, Number(style.platformSize) || 144)); @@ -5626,7 +5630,7 @@ export default { entity.billboard.height = size; entity.billboard.color = Cesium.Color.fromCssColorString(color); } - + if (this.viewer.scene.requestRenderMode) { this.viewer.scene.requestRender(); } @@ -7112,6 +7116,11 @@ export default { gap: 6px; z-index: 1000; pointer-events: none; + transition: bottom 0.3s ease; +} + +.map-info-panel.panel-raised { + bottom: 75px; } /* 比例尺:高德风格,浅色底、圆角、刻度线 */ diff --git a/ruoyi-ui/src/views/childRoom/BottomLeftPanel.vue b/ruoyi-ui/src/views/childRoom/BottomLeftPanel.vue index 5e4db4e..9eede47 100644 --- a/ruoyi-ui/src/views/childRoom/BottomLeftPanel.vue +++ b/ruoyi-ui/src/views/childRoom/BottomLeftPanel.vue @@ -1,6 +1,6 @@