From 24a27ed36d69edfd2f1400e49184439c6201e2a2 Mon Sep 17 00:00:00 2001 From: tianyuan <2861334240@qq.com> Date: Sat, 27 Dec 2025 00:29:12 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=9C=B0=E5=9B=BE=E6=9F=A5?= =?UTF-8?q?=E7=9C=8B=E5=8A=9F=E8=83=BD=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StudentTerminalLocationController.java | 53 ++++++++++++++ .../water/entity/WaterTerminalLocation.java | 44 ++++++++++++ .../water/entity/vo/TerminalLocationVO.java | 30 ++++++++ .../WaterTerminalLocationRepository.java | 18 +++++ .../service/WaterTerminalLocationService.java | 19 +++++ .../WaterTerminalLocationServiceImpl.java | 72 +++++++++++++++++++ 6 files changed, 236 insertions(+) create mode 100644 src/main/java/com/campus/water/controller/StudentTerminalLocationController.java create mode 100644 src/main/java/com/campus/water/entity/WaterTerminalLocation.java create mode 100644 src/main/java/com/campus/water/entity/vo/TerminalLocationVO.java create mode 100644 src/main/java/com/campus/water/mapper/WaterTerminalLocationRepository.java create mode 100644 src/main/java/com/campus/water/service/WaterTerminalLocationService.java create mode 100644 src/main/java/com/campus/water/service/WaterTerminalLocationServiceImpl.java diff --git a/src/main/java/com/campus/water/controller/StudentTerminalLocationController.java b/src/main/java/com/campus/water/controller/StudentTerminalLocationController.java new file mode 100644 index 0000000..59c11c8 --- /dev/null +++ b/src/main/java/com/campus/water/controller/StudentTerminalLocationController.java @@ -0,0 +1,53 @@ +package com.campus.water.controller; + +import com.campus.water.entity.vo.TerminalLocationVO; +import com.campus.water.service.WaterTerminalLocationService; +import com.campus.water.util.ResultVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 学生端-饮水机位置查询控制器(返回整合后的数据) + */ +@RestController +@RequestMapping("/api/student/terminal/location") +@RequiredArgsConstructor +@Tag(name = "学生端-饮水机位置接口", description = "查询校内矿化水终端机位置信息") +public class StudentTerminalLocationController { + + private final WaterTerminalLocationService locationService; + + /** + * 获取所有终端机位置(整合安装位置、状态) + */ + @GetMapping("/all") + @Operation(summary = "获取所有终端机位置", description = "查询校内所有矿化水终端机的坐标、安装位置、状态") + public ResultVO> getAllLocations() { + try { + List locations = locationService.getAllTerminalLocations(); + return ResultVO.success(locations, "获取所有终端机位置成功"); + } catch (Exception e) { + return ResultVO.error(500, "获取位置失败:" + e.getMessage()); + } + } + + /** + * 获取可用的终端机位置(仅正常运行的设备) + */ + @GetMapping("/available") + @Operation(summary = "获取可用终端机位置", description = "仅查询状态正常的矿化水终端机位置") + public ResultVO> getAvailableLocations() { + try { + List locations = locationService.getAvailableTerminalLocations(); + return ResultVO.success(locations, "获取可用终端机位置成功"); + } catch (Exception e) { + return ResultVO.error(500, "获取可用位置失败:" + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/campus/water/entity/WaterTerminalLocation.java b/src/main/java/com/campus/water/entity/WaterTerminalLocation.java new file mode 100644 index 0000000..ebd5f23 --- /dev/null +++ b/src/main/java/com/campus/water/entity/WaterTerminalLocation.java @@ -0,0 +1,44 @@ +package com.campus.water.entity; + +import lombok.Data; +import jakarta.persistence.*; + +/** + * 矿化水终端机位置实体(仅存储地图核心数据,复用device表非坐标字段) + * 专用于学生端查看饮水机位置、地图标记场景 + */ +@Data +@Entity +@Table(name = "water_terminal_location") +public class WaterTerminalLocation { + /** + * 终端机ID(主键,与device表的device_id完全关联) + */ + @Id + @Column(name = "terminal_id", length = 50, nullable = false) + private String terminalId; + + /** + * 终端机名称(复用device表的device_name,仅存储冗余字段便于快速查询) + */ + @Column(name = "terminal_name", length = 100, nullable = false) + private String terminalName; + + /** + * 经度(高德GCJ-02坐标系,地图定位核心字段) + */ + @Column(name = "longitude", nullable = false, precision = 10, scale = 6) + private Double longitude; + + /** + * 纬度(高德GCJ-02坐标系,地图定位核心字段) + */ + @Column(name = "latitude", nullable = false, precision = 10, scale = 6) + private Double latitude; + + /** + * 是否可用(关联device表的status字段:online→true,offline/fault→false) + */ + @Column(name = "is_available", nullable = false) + private Boolean isAvailable = true; +} \ No newline at end of file diff --git a/src/main/java/com/campus/water/entity/vo/TerminalLocationVO.java b/src/main/java/com/campus/water/entity/vo/TerminalLocationVO.java new file mode 100644 index 0000000..8492273 --- /dev/null +++ b/src/main/java/com/campus/water/entity/vo/TerminalLocationVO.java @@ -0,0 +1,30 @@ +package com.campus.water.entity.vo; + +import lombok.Data; + +/** + * 终端机位置VO(整合坐标表+设备表数据,前端地图展示专用) + */ +@Data +public class TerminalLocationVO { + /** 终端机ID */ + private String terminalId; + + /** 终端机名称 */ + private String terminalName; + + /** 经度 */ + private Double longitude; + + /** 纬度 */ + private Double latitude; + + /** 是否可用 */ + private Boolean isAvailable; + + /** 安装位置(复用device表的install_location) */ + private String installLocation; + + /** 设备状态(online/offline/fault) */ + private String deviceStatus; +} \ No newline at end of file diff --git a/src/main/java/com/campus/water/mapper/WaterTerminalLocationRepository.java b/src/main/java/com/campus/water/mapper/WaterTerminalLocationRepository.java new file mode 100644 index 0000000..6e0a1f1 --- /dev/null +++ b/src/main/java/com/campus/water/mapper/WaterTerminalLocationRepository.java @@ -0,0 +1,18 @@ +package com.campus.water.mapper; + +import com.campus.water.entity.WaterTerminalLocation; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 终端机位置数据访问层(仅操作坐标相关数据) + */ +@Repository +public interface WaterTerminalLocationRepository extends JpaRepository { + /** + * 查询可用的终端机位置(地图优先展示可用设备) + */ + List findByIsAvailable(Boolean isAvailable); +} \ No newline at end of file diff --git a/src/main/java/com/campus/water/service/WaterTerminalLocationService.java b/src/main/java/com/campus/water/service/WaterTerminalLocationService.java new file mode 100644 index 0000000..87bdabc --- /dev/null +++ b/src/main/java/com/campus/water/service/WaterTerminalLocationService.java @@ -0,0 +1,19 @@ +package com.campus.water.service; + +import com.campus.water.entity.vo.TerminalLocationVO; +import java.util.List; + +/** + * 终端机位置服务接口(返回整合device表的VO数据) + */ +public interface WaterTerminalLocationService { + /** + * 获取所有终端机位置(整合device表的安装位置、状态) + */ + List getAllTerminalLocations(); + + /** + * 获取可用的终端机位置(仅展示正常运行的设备) + */ + List getAvailableTerminalLocations(); +} \ No newline at end of file diff --git a/src/main/java/com/campus/water/service/WaterTerminalLocationServiceImpl.java b/src/main/java/com/campus/water/service/WaterTerminalLocationServiceImpl.java new file mode 100644 index 0000000..9354b2b --- /dev/null +++ b/src/main/java/com/campus/water/service/WaterTerminalLocationServiceImpl.java @@ -0,0 +1,72 @@ +package com.campus.water.service.impl; + +import com.campus.water.entity.Device; +import com.campus.water.entity.WaterTerminalLocation; +import com.campus.water.entity.vo.TerminalLocationVO; +import com.campus.water.mapper.DeviceRepository; +import com.campus.water.mapper.WaterTerminalLocationRepository; +import com.campus.water.service.WaterTerminalLocationService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +/** + * 终端机位置服务实现(关联查询device表,避免数据冗余) + */ +@Service +@RequiredArgsConstructor +public class WaterTerminalLocationServiceImpl implements WaterTerminalLocationService { + + private final WaterTerminalLocationRepository locationRepository; + private final DeviceRepository deviceRepository; // 注入设备表Mapper + + /** + * 获取所有终端机位置(整合device表数据) + */ + @Override + public List getAllTerminalLocations() { + List locationList = locationRepository.findAll(); + return convertToVO(locationList); + } + + /** + * 获取可用的终端机位置 + */ + @Override + public List getAvailableTerminalLocations() { + List locationList = locationRepository.findByIsAvailable(true); + return convertToVO(locationList); + } + + /** + * 核心转换方法:坐标表+设备表 → VO(前端展示专用) + */ + private List convertToVO(List locationList) { + List voList = new ArrayList<>(); + for (WaterTerminalLocation location : locationList) { + TerminalLocationVO vo = new TerminalLocationVO(); + // 1. 赋值坐标表核心字段 + vo.setTerminalId(location.getTerminalId()); + vo.setTerminalName(location.getTerminalName()); + vo.setLongitude(location.getLongitude()); + vo.setLatitude(location.getLatitude()); + vo.setIsAvailable(location.getIsAvailable()); + + // 2. 关联查询device表,补充安装位置、设备状态 + Optional deviceOptional = deviceRepository.findById(location.getTerminalId()); + if (deviceOptional.isPresent()) { + Device device = deviceOptional.get(); + vo.setInstallLocation(device.getInstallLocation()); // 复用install_location + vo.setDeviceStatus(device.getStatus().name()); + } else { + vo.setInstallLocation("未配置安装位置"); + vo.setDeviceStatus("unknown"); + } + voList.add(vo); + } + return voList; + } +} \ No newline at end of file -- 2.34.1