From b62c4fd36da052b2d1658ba2f5f3fe3f5d2eb0d2 Mon Sep 17 00:00:00 2001 From: wanglei <3085637232@qq.com> Date: Sat, 29 Nov 2025 19:02:02 +0800 Subject: [PATCH] =?UTF-8?q?=E7=8E=8B=E7=A3=8A=E2=80=94=E2=80=94=E7=AC=AC?= =?UTF-8?q?=E5=8D=81=E5=91=A8=E6=96=B0=E5=A2=9E=E5=BC=80=E5=8F=91=E5=B7=A5?= =?UTF-8?q?=E5=8D=95=E7=AE=A1=E7=90=86=E6=8E=A5=E5=8F=A3=EF=BC=8C=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E6=89=AB=E7=A0=81=E7=94=A8=E6=B0=B4=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=8C=E6=B0=B4=E8=B4=A8=E4=BF=A1=E6=81=AF=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WaterUsageController.java | 171 ++++++++++++++++++ .../water/controller/WorkOrderController.java | 118 ++++++++++++ .../com/campus/water/entity/DrinkRecord.java | 13 +- .../water/entity/WaterMakerRealtimeData.java | 35 ++-- .../water/entity/WaterQualityHistory.java | 22 ++- .../water/entity/WaterSupplyRealtimeData.java | 10 +- .../campus/water/mapper/AdminRepository.java | 2 +- .../campus/water/mapper/AlertRepository.java | 2 +- .../campus/water/mapper/AreaRepository.java | 2 +- .../campus/water/mapper/DeviceRepository.java | 2 +- .../DeviceTerminalMappingRepository.java | 2 +- .../mapper/DrinkRecommendationRepository.java | 2 +- .../water/mapper/DrinkRecordRepository.java | 25 ++- .../mapper/InspectionRecordRepository.java | 2 +- .../mapper/MaintenancePlanRepository.java | 2 +- .../water/mapper/MessagePushRepository.java | 2 +- .../water/mapper/RepairerAuthRepository.java | 2 +- .../water/mapper/RepairmanRepository.java | 2 +- .../mapper/TerminalUsageStatsRepository.java | 2 +- .../campus/water/mapper/UserRepository.java | 2 +- .../WaterMakerRealtimeDataRepository.java | 31 +++- .../mapper/WaterQualityHistoryRepository.java | 34 +++- .../WaterSupplyRealtimeDataRepository.java | 10 +- .../water/mapper/WorkOrderRepository.java | 2 +- .../service/app/RepairmanAppService.java | 89 +++++++++ .../water/service/app/StudentAppService.java | 49 +++++ .../java/com/campus/water/util/ResultVO.java | 66 +++++++ 27 files changed, 622 insertions(+), 79 deletions(-) create mode 100644 src/main/java/com/campus/water/controller/WaterUsageController.java create mode 100644 src/main/java/com/campus/water/controller/WorkOrderController.java create mode 100644 src/main/java/com/campus/water/service/app/RepairmanAppService.java create mode 100644 src/main/java/com/campus/water/service/app/StudentAppService.java create mode 100644 src/main/java/com/campus/water/util/ResultVO.java diff --git a/src/main/java/com/campus/water/controller/WaterUsageController.java b/src/main/java/com/campus/water/controller/WaterUsageController.java new file mode 100644 index 0000000..67f0187 --- /dev/null +++ b/src/main/java/com/campus/water/controller/WaterUsageController.java @@ -0,0 +1,171 @@ +package com.campus.water.controller; + +import com.campus.water.entity.*; +import com.campus.water.mapper.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +@Controller +public class WaterUsageController { + + @Autowired + private DeviceTerminalMappingRepository deviceTerminalMappingRepository; + + @Autowired + private WaterMakerRealtimeDataRepository waterMakerRealtimeDataRepository; + + @Autowired + private WaterQualityHistoryRepository waterQualityHistoryRepository; + + @Autowired + private DrinkRecordRepository drinkRecordRepository; + + @Autowired + private TerminalUsageStatsRepository terminalUsageStatsRepository; + + // 扫码用水 + @Transactional + public Map scanToDrink(String terminalId, String studentId, Double waterConsumption) { + Map result = new HashMap<>(); + + try { + Optional mappingOpt = deviceTerminalMappingRepository.findByTerminalId(terminalId); + if (mappingOpt.isEmpty()) { + result.put("success", false); + result.put("message", "终端设备不存在"); + return result; + } + + DeviceTerminalMapping mapping = mappingOpt.get(); + if (mapping.getTerminalStatus() != DeviceTerminalMapping.TerminalStatus.active) { + result.put("success", false); + result.put("message", "终端设备未激活"); + return result; + } + + Optional realtimeDataOpt = + waterMakerRealtimeDataRepository.findLatestByDeviceId(mapping.getDeviceId()); + + DrinkRecord drinkRecord = new DrinkRecord(); + drinkRecord.setStudentId(studentId); + drinkRecord.setTerminalId(terminalId); + drinkRecord.setDeviceId(mapping.getDeviceId()); + drinkRecord.setWaterConsumption(waterConsumption); + drinkRecord.setDrinkTime(LocalDateTime.now()); + drinkRecord.setLocation(mapping.getTerminalName()); + + if (realtimeDataOpt.isPresent()) { + WaterMakerRealtimeData realtimeData = realtimeDataOpt.get(); + drinkRecord.setTdsValue(realtimeData.getTdsValue3()); + drinkRecord.setWaterQuality(realtimeData.getWaterQuality()); + } + + drinkRecordRepository.save(drinkRecord); + updateTerminalUsageStats(terminalId, waterConsumption); + + result.put("success", true); + result.put("message", "用水成功"); + result.put("waterConsumption", waterConsumption); + result.put("timestamp", LocalDateTime.now()); + return result; + + } catch (Exception e) { + result.put("success", false); + result.put("message", "用水失败: " + e.getMessage()); + return result; + } + } + + // 更新终端使用统计 + private void updateTerminalUsageStats(String terminalId, Double waterConsumption) { + LocalDateTime now = LocalDateTime.now(); + Optional statsOpt = terminalUsageStatsRepository + .findByTerminalIdAndStatDate(terminalId, now.toLocalDate()); + + TerminalUsageStats stats; + if (statsOpt.isPresent()) { + stats = statsOpt.get(); + stats.setUsageCount(stats.getUsageCount() + 1); + stats.setTotalWaterOutput(stats.getTotalWaterOutput() + waterConsumption); + stats.setAvgWaterPerUse(stats.getTotalWaterOutput() / stats.getUsageCount()); + } else { + stats = new TerminalUsageStats(); + stats.setTerminalId(terminalId); + stats.setStatDate(now.toLocalDate()); + stats.setUsageCount(1); + stats.setTotalWaterOutput(waterConsumption); + stats.setAvgWaterPerUse(waterConsumption); + stats.setPeakHour(String.format("%02d:00", now.getHour())); + } + + stats.setUpdatedTime(now); + terminalUsageStatsRepository.save(stats); + } + + // 获取水质信息 + public Map getWaterQualityInfo(String deviceId) { + Map result = new HashMap<>(); + + try { + Optional realtimeDataOpt = + waterMakerRealtimeDataRepository.findLatestByDeviceId(deviceId); + + Optional qualityHistoryOpt = + waterQualityHistoryRepository.findLatestByDeviceId(deviceId); + + if (realtimeDataOpt.isPresent()) { + WaterMakerRealtimeData realtimeData = realtimeDataOpt.get(); + result.put("deviceId", deviceId); + result.put("rawWaterTds", realtimeData.getTdsValue1()); + result.put("pureWaterTds", realtimeData.getTdsValue2()); + result.put("mineralWaterTds", realtimeData.getTdsValue3()); + result.put("waterQuality", realtimeData.getWaterQuality()); + result.put("filterLife", realtimeData.getFilterLife()); + result.put("status", realtimeData.getStatus()); + result.put("updateTime", realtimeData.getRecordTime()); + } + + if (qualityHistoryOpt.isPresent()) { + WaterQualityHistory qualityHistory = qualityHistoryOpt.get(); + result.put("lastDetectionTime", qualityHistory.getDetectedTime()); + } + + result.put("success", true); + return result; + + } catch (Exception e) { + result.put("success", false); + result.put("message", "获取水质信息失败: " + e.getMessage()); + return result; + } + } + + // 获取终端设备信息 + public Map getTerminalInfo(String terminalId) { + Map result = new HashMap<>(); + + Optional mappingOpt = deviceTerminalMappingRepository.findByTerminalId(terminalId); + if (mappingOpt.isPresent()) { + DeviceTerminalMapping mapping = mappingOpt.get(); + result.put("terminalId", terminalId); + result.put("terminalName", mapping.getTerminalName()); + result.put("deviceId", mapping.getDeviceId()); + result.put("status", mapping.getTerminalStatus()); + result.put("success", true); + + Map qualityInfo = getWaterQualityInfo(mapping.getDeviceId()); + result.putAll(qualityInfo); + } else { + result.put("success", false); + result.put("message", "终端设备不存在"); + } + + return result; + } +} \ No newline at end of file diff --git a/src/main/java/com/campus/water/controller/WorkOrderController.java b/src/main/java/com/campus/water/controller/WorkOrderController.java new file mode 100644 index 0000000..100ef56 --- /dev/null +++ b/src/main/java/com/campus/water/controller/WorkOrderController.java @@ -0,0 +1,118 @@ +package com.campus.water.controller; + +import com.campus.water.entity.WorkOrder; +import com.campus.water.mapper.WorkOrderRepository; +import com.campus.water.mapper.RepairmanRepository; +import com.campus.water.mapper.AlertRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; + +@Controller +public class WorkOrderController { + + @Autowired + private WorkOrderRepository workOrderRepository; + + @Autowired + private RepairmanRepository repairmanRepository; + + @Autowired + private AlertRepository alertRepository; + + // 抢单功能 + @Transactional + public boolean grabOrder(String orderId, String repairmanId) { + Optional orderOpt = workOrderRepository.findById(orderId); + if (orderOpt.isPresent()) { + WorkOrder order = orderOpt.get(); + if (order.getStatus() == WorkOrder.OrderStatus.pending) { + var repairman = repairmanRepository.findById(repairmanId); + if (repairman.isPresent() && repairman.get().getStatus() == repairman.get().getStatus().idle) { + order.setStatus(WorkOrder.OrderStatus.grabbed); + order.setAssignedRepairmanId(repairmanId); + order.setGrabbedTime(LocalDateTime.now()); + workOrderRepository.save(order); + + var repairmanEntity = repairman.get(); + repairmanEntity.setStatus(repairmanEntity.getStatus().busy); + repairmanRepository.save(repairmanEntity); + return true; + } + } + } + return false; + } + + // 拒单功能 + @Transactional + public boolean rejectOrder(String orderId, String repairmanId, String reason) { + Optional orderOpt = workOrderRepository.findById(orderId); + if (orderOpt.isPresent()) { + WorkOrder order = orderOpt.get(); + if (order.getAssignedRepairmanId() != null && + order.getAssignedRepairmanId().equals(repairmanId) && + order.getStatus() == WorkOrder.OrderStatus.grabbed) { + + order.setStatus(WorkOrder.OrderStatus.pending); + order.setAssignedRepairmanId(null); + order.setGrabbedTime(null); + workOrderRepository.save(order); + + var repairman = repairmanRepository.findById(repairmanId); + if (repairman.isPresent()) { + var repairmanEntity = repairman.get(); + repairmanEntity.setStatus(repairmanEntity.getStatus().idle); + repairmanRepository.save(repairmanEntity); + } + return true; + } + } + return false; + } + + // 提交维修结果 + @Transactional + public boolean submitRepairResult(String orderId, String repairmanId, + String dealNote, String imgUrl) { + Optional orderOpt = workOrderRepository.findById(orderId); + if (orderOpt.isPresent()) { + WorkOrder order = orderOpt.get(); + if (order.getAssignedRepairmanId() != null && + order.getAssignedRepairmanId().equals(repairmanId) && + (order.getStatus() == WorkOrder.OrderStatus.grabbed || + order.getStatus() == WorkOrder.OrderStatus.processing)) { + + order.setStatus(WorkOrder.OrderStatus.completed); + order.setCompletedTime(LocalDateTime.now()); + order.setDealNote(dealNote); + order.setImgUrl(imgUrl); + workOrderRepository.save(order); + + var repairman = repairmanRepository.findById(repairmanId); + if (repairman.isPresent()) { + var repairmanEntity = repairman.get(); + repairmanEntity.setStatus(repairmanEntity.getStatus().idle); + repairmanEntity.setWorkCount(repairmanEntity.getWorkCount() + 1); + repairmanRepository.save(repairmanEntity); + } + return true; + } + } + return false; + } + + // 获取可抢工单列表 + public List getAvailableOrders(String areaId) { + return workOrderRepository.findByAreaIdAndStatus(areaId, WorkOrder.OrderStatus.pending); + } + + // 获取维修工自己的工单 + public List getMyOrders(String repairmanId) { + return workOrderRepository.findByAssignedRepairmanId(repairmanId); + } +} \ No newline at end of file diff --git a/src/main/java/com/campus/water/entity/DrinkRecord.java b/src/main/java/com/campus/water/entity/DrinkRecord.java index 9ae775b..b875653 100644 --- a/src/main/java/com/campus/water/entity/DrinkRecord.java +++ b/src/main/java/com/campus/water/entity/DrinkRecord.java @@ -2,8 +2,6 @@ package com.campus.water.entity; import lombok.Data; import javax.persistence.*; -import java.time.LocalDate; -import java.time.LocalTime; import java.time.LocalDateTime; @Data @@ -24,8 +22,9 @@ public class DrinkRecord { @Column(name = "device_id", length = 20) private String deviceId; - @Column(name = "volume", precision = 6, scale = 2) - private Double volume; + // 根据文档修正:字段名改为 water_consumption + @Column(name = "water_consumption", precision = 6, scale = 2) + private Double waterConsumption; @Column(name = "water_quality", length = 50) private String waterQuality; @@ -33,11 +32,9 @@ public class DrinkRecord { @Column(name = "tds_value", precision = 8, scale = 2) private Double tdsValue; - @Column(name = "drink_date") - private LocalDate drinkDate; - + // 根据文档修正:字段名改为 drink_time @Column(name = "drink_time") - private LocalTime drinkTime; + private LocalDateTime drinkTime; @Column(name = "location", length = 200) private String location; diff --git a/src/main/java/com/campus/water/entity/WaterMakerRealtimeData.java b/src/main/java/com/campus/water/entity/WaterMakerRealtimeData.java index 96f3516..30e8896 100644 --- a/src/main/java/com/campus/water/entity/WaterMakerRealtimeData.java +++ b/src/main/java/com/campus/water/entity/WaterMakerRealtimeData.java @@ -15,14 +15,26 @@ public class WaterMakerRealtimeData { @Column(name = "device_id", length = 20) private String deviceId; - @Column(name = "tds_value", precision = 8, scale = 2) - private Double tdsValue; + // 根据文档修正:三个TDS值 + @Column(name = "tds_value1", precision = 8, scale = 2) + private Double tdsValue1; // 原水TDS - @Column(name = "water_flow", precision = 8, scale = 2) - private Double waterFlow; + @Column(name = "tds_value2", precision = 8, scale = 2) + private Double tdsValue2; // 纯水TDS - @Column(name = "water_pressure", precision = 8, scale = 2) - private Double waterPressure; + @Column(name = "tds_value3", precision = 8, scale = 2) + private Double tdsValue3; // 矿化水TDS + + // 根据文档修正:两个流量计 + @Column(name = "water_flow1", precision = 8, scale = 2) + private Double waterFlow1; + + @Column(name = "water_flow2", precision = 8, scale = 2) + private Double waterFlow2; + + // 根据文档修正:字段名改为 water_press + @Column(name = "water_press", precision = 8, scale = 2) + private Double waterPress; @Column(name = "filter_life") private Integer filterLife; @@ -30,12 +42,6 @@ public class WaterMakerRealtimeData { @Column(name = "leakage") private Boolean leakage = false; - @Column(name = "temperature", precision = 5, scale = 2) - private Double temperature; - - @Column(name = "humidity", precision = 5, scale = 2) - private Double humidity; - @Column(name = "water_quality", length = 50) private String waterQuality; @@ -43,8 +49,9 @@ public class WaterMakerRealtimeData { @Column(name = "status", length = 50) private DeviceStatus status = DeviceStatus.normal; - @Column(name = "timestamp") - private LocalDateTime timestamp = LocalDateTime.now(); + // 根据文档修正:字段名改为 record_time + @Column(name = "record_time") + private LocalDateTime recordTime = LocalDateTime.now(); @Column(name = "created_time") private LocalDateTime createdTime = LocalDateTime.now(); diff --git a/src/main/java/com/campus/water/entity/WaterQualityHistory.java b/src/main/java/com/campus/water/entity/WaterQualityHistory.java index 7cab8ff..c58ec59 100644 --- a/src/main/java/com/campus/water/entity/WaterQualityHistory.java +++ b/src/main/java/com/campus/water/entity/WaterQualityHistory.java @@ -10,7 +10,8 @@ import java.time.LocalDateTime; public class WaterQualityHistory { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; + @Column(name = "history_id") + private Long historyId; @Column(name = "terminal_id", length = 20) private String terminalId; @@ -18,17 +19,22 @@ public class WaterQualityHistory { @Column(name = "device_id", length = 20) private String deviceId; - @Column(name = "tds_value", precision = 8, scale = 2) - private Double tdsValue; + // 根据文档修正:三个TDS值 + @Column(name = "tds_value1", precision = 8, scale = 2) + private Double tdsValue1; // 原水TDS + + @Column(name = "tds_value2", precision = 8, scale = 2) + private Double tdsValue2; // 纯水TDS + + @Column(name = "tds_value3", precision = 8, scale = 2) + private Double tdsValue3; // 矿化水TDS @Column(name = "water_quality", length = 50) private String waterQuality; - @Column(name = "temperature", precision = 5, scale = 2) - private Double temperature; - - @Column(name = "timestamp") - private LocalDateTime timestamp = LocalDateTime.now(); + // 根据文档修正:字段名改为 detected_time + @Column(name = "detected_time") + private LocalDateTime detectedTime = LocalDateTime.now(); @Column(name = "created_time") private LocalDateTime createdTime = LocalDateTime.now(); diff --git a/src/main/java/com/campus/water/entity/WaterSupplyRealtimeData.java b/src/main/java/com/campus/water/entity/WaterSupplyRealtimeData.java index 1372c82..e63e223 100644 --- a/src/main/java/com/campus/water/entity/WaterSupplyRealtimeData.java +++ b/src/main/java/com/campus/water/entity/WaterSupplyRealtimeData.java @@ -18,8 +18,9 @@ public class WaterSupplyRealtimeData { @Column(name = "water_flow", precision = 8, scale = 2) private Double waterFlow; - @Column(name = "water_pressure", precision = 8, scale = 2) - private Double waterPressure; + // 根据文档修正:字段名改为 water_press + @Column(name = "water_press", precision = 8, scale = 2) + private Double waterPress; @Column(name = "water_level", precision = 8, scale = 2) private Double waterLevel; @@ -27,11 +28,8 @@ public class WaterSupplyRealtimeData { @Column(name = "temperature", precision = 5, scale = 2) private Double temperature; - @Column(name = "humidity", precision = 5, scale = 2) - private Double humidity; - @Enumerated(EnumType.STRING) - @Column(name = "status", length = 50) + @Column(name = "status", length = 20) private DeviceStatus status = DeviceStatus.normal; @Column(name = "timestamp") diff --git a/src/main/java/com/campus/water/mapper/AdminRepository.java b/src/main/java/com/campus/water/mapper/AdminRepository.java index d7a21f4..d72c736 100644 --- a/src/main/java/com/campus/water/mapper/AdminRepository.java +++ b/src/main/java/com/campus/water/mapper/AdminRepository.java @@ -1,6 +1,6 @@ package com.campus.water.mapper; -import datebaseclass.system.Admin; +import com.campus.water.entity.Admin; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/campus/water/mapper/AlertRepository.java b/src/main/java/com/campus/water/mapper/AlertRepository.java index dcb8a96..adef168 100644 --- a/src/main/java/com/campus/water/mapper/AlertRepository.java +++ b/src/main/java/com/campus/water/mapper/AlertRepository.java @@ -1,6 +1,6 @@ package com.campus.water.mapper; -import datebaseclass.sensor.Alert; +import com.campus.water.entity.Alert; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.time.LocalDateTime; diff --git a/src/main/java/com/campus/water/mapper/AreaRepository.java b/src/main/java/com/campus/water/mapper/AreaRepository.java index 06ec14c..4eb7a3d 100644 --- a/src/main/java/com/campus/water/mapper/AreaRepository.java +++ b/src/main/java/com/campus/water/mapper/AreaRepository.java @@ -1,6 +1,6 @@ package com.campus.water.mapper; -import datebaseclass.system.Area; +import com.campus.water.entity.Area; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/campus/water/mapper/DeviceRepository.java b/src/main/java/com/campus/water/mapper/DeviceRepository.java index fea48ef..3173c37 100644 --- a/src/main/java/com/campus/water/mapper/DeviceRepository.java +++ b/src/main/java/com/campus/water/mapper/DeviceRepository.java @@ -1,6 +1,6 @@ package com.campus.water.mapper; -import datebaseclass.system.Device; +import com.campus.water.entity.Device; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.List; diff --git a/src/main/java/com/campus/water/mapper/DeviceTerminalMappingRepository.java b/src/main/java/com/campus/water/mapper/DeviceTerminalMappingRepository.java index 686bc64..53b2bd7 100644 --- a/src/main/java/com/campus/water/mapper/DeviceTerminalMappingRepository.java +++ b/src/main/java/com/campus/water/mapper/DeviceTerminalMappingRepository.java @@ -1,6 +1,6 @@ package com.campus.water.mapper; -import datebaseclass.system.DeviceTerminalMapping; +import com.campus.water.entity.DeviceTerminalMapping; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.List; diff --git a/src/main/java/com/campus/water/mapper/DrinkRecommendationRepository.java b/src/main/java/com/campus/water/mapper/DrinkRecommendationRepository.java index f5b916d..2c311db 100644 --- a/src/main/java/com/campus/water/mapper/DrinkRecommendationRepository.java +++ b/src/main/java/com/campus/water/mapper/DrinkRecommendationRepository.java @@ -1,6 +1,6 @@ package com.campus.water.mapper; -import datebaseclass.business.DrinkRecommendation; +import com.campus.water.entity.DrinkRecommendation; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/campus/water/mapper/DrinkRecordRepository.java b/src/main/java/com/campus/water/mapper/DrinkRecordRepository.java index decf037..544d217 100644 --- a/src/main/java/com/campus/water/mapper/DrinkRecordRepository.java +++ b/src/main/java/com/campus/water/mapper/DrinkRecordRepository.java @@ -1,26 +1,35 @@ package com.campus.water.mapper; -import datebaseclass.business.DrinkRecord; +import com.campus.water.entity.DrinkRecord; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; @Repository public interface DrinkRecordRepository extends JpaRepository { - // 现有方法... List findByStudentId(String studentId); List findByTerminalId(String terminalId); List findByDeviceId(String deviceId); - // 新增基于drinkDate的查询方法 + // 修正:使用 drink_time 字段进行日期范围查询 + @Query("SELECT d FROM DrinkRecord d WHERE d.studentId = ?1 AND DATE(d.drinkTime) = ?2") List findByStudentIdAndDrinkDate(String studentId, LocalDate drinkDate); - List findByStudentIdAndDrinkDateBetween(String studentId, LocalDate start, LocalDate end); - @Query("SELECT SUM(d.volume) FROM DrinkRecord d WHERE d.studentId = ?1 AND d.drinkDate = ?2") - Double getTotalVolumeByStudentIdAndDate(String studentId, LocalDate date); + @Query("SELECT d FROM DrinkRecord d WHERE d.studentId = ?1 AND d.drinkTime BETWEEN ?2 AND ?3") + List findByStudentIdAndDrinkTimeBetween(String studentId, LocalDateTime start, LocalDateTime end); - @Query("SELECT d FROM DrinkRecord d WHERE d.studentId = ?1 AND d.drinkDate BETWEEN ?2 AND ?3 ORDER BY d.drinkDate DESC, d.drinkTime DESC") - List findByStudentIdAndDrinkDateBetweenOrdered(String studentId, LocalDate start, LocalDate end); + @Query("SELECT SUM(d.waterConsumption) FROM DrinkRecord d WHERE d.studentId = ?1 AND DATE(d.drinkTime) = ?2") + Double getTotalWaterConsumptionByStudentIdAndDate(String studentId, LocalDate date); + + @Query("SELECT d FROM DrinkRecord d WHERE d.studentId = ?1 AND d.drinkTime BETWEEN ?2 AND ?3 ORDER BY d.drinkTime DESC") + List findByStudentIdAndDrinkTimeBetweenOrdered(String studentId, LocalDateTime start, LocalDateTime end); + + @Query("SELECT d FROM DrinkRecord d WHERE d.terminalId = ?1 AND d.drinkTime BETWEEN ?2 AND ?3") + List findByTerminalIdAndDrinkTimeBetween(String terminalId, LocalDateTime start, LocalDateTime end); + + @Query("SELECT COUNT(d) FROM DrinkRecord d WHERE d.terminalId = ?1 AND DATE(d.drinkTime) = ?2") + Long countByTerminalIdAndDrinkDate(String terminalId, LocalDate drinkDate); } \ No newline at end of file diff --git a/src/main/java/com/campus/water/mapper/InspectionRecordRepository.java b/src/main/java/com/campus/water/mapper/InspectionRecordRepository.java index 5db3705..06d1c64 100644 --- a/src/main/java/com/campus/water/mapper/InspectionRecordRepository.java +++ b/src/main/java/com/campus/water/mapper/InspectionRecordRepository.java @@ -1,6 +1,6 @@ package com.campus.water.mapper; -import datebaseclass.business.InspectionRecord; +import com.campus.water.entity.InspectionRecord; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.time.LocalDateTime; diff --git a/src/main/java/com/campus/water/mapper/MaintenancePlanRepository.java b/src/main/java/com/campus/water/mapper/MaintenancePlanRepository.java index 1ce1745..e8b7aec 100644 --- a/src/main/java/com/campus/water/mapper/MaintenancePlanRepository.java +++ b/src/main/java/com/campus/water/mapper/MaintenancePlanRepository.java @@ -1,6 +1,6 @@ package com.campus.water.mapper; -import datebaseclass.business.MaintenancePlan; +import com.campus.water.entity.MaintenancePlan; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/campus/water/mapper/MessagePushRepository.java b/src/main/java/com/campus/water/mapper/MessagePushRepository.java index c612488..dd0a65d 100644 --- a/src/main/java/com/campus/water/mapper/MessagePushRepository.java +++ b/src/main/java/com/campus/water/mapper/MessagePushRepository.java @@ -1,6 +1,6 @@ package com.campus.water.mapper; -import datebaseclass.business.MessagePush; +import com.campus.water.entity.MessagePush; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/campus/water/mapper/RepairerAuthRepository.java b/src/main/java/com/campus/water/mapper/RepairerAuthRepository.java index bfa2124..96e9148 100644 --- a/src/main/java/com/campus/water/mapper/RepairerAuthRepository.java +++ b/src/main/java/com/campus/water/mapper/RepairerAuthRepository.java @@ -1,6 +1,6 @@ package com.campus.water.mapper; -import datebaseclass.system.RepairerAuth; +import com.campus.water.entity.RepairerAuth; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/campus/water/mapper/RepairmanRepository.java b/src/main/java/com/campus/water/mapper/RepairmanRepository.java index 8115ded..56fc165 100644 --- a/src/main/java/com/campus/water/mapper/RepairmanRepository.java +++ b/src/main/java/com/campus/water/mapper/RepairmanRepository.java @@ -1,6 +1,6 @@ package com.campus.water.mapper; -import datebaseclass.system.Repairman; +import com.campus.water.entity.Repairman; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.List; diff --git a/src/main/java/com/campus/water/mapper/TerminalUsageStatsRepository.java b/src/main/java/com/campus/water/mapper/TerminalUsageStatsRepository.java index ac9aedf..dafc11b 100644 --- a/src/main/java/com/campus/water/mapper/TerminalUsageStatsRepository.java +++ b/src/main/java/com/campus/water/mapper/TerminalUsageStatsRepository.java @@ -1,6 +1,6 @@ package com.campus.water.mapper; -import datebaseclass.business.TerminalUsageStats; +import com.campus.water.entity.TerminalUsageStats; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/campus/water/mapper/UserRepository.java b/src/main/java/com/campus/water/mapper/UserRepository.java index 024768e..30ae620 100644 --- a/src/main/java/com/campus/water/mapper/UserRepository.java +++ b/src/main/java/com/campus/water/mapper/UserRepository.java @@ -1,6 +1,6 @@ package com.campus.water.mapper; -import datebaseclass.business.User; +import com.campus.water.entity.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/campus/water/mapper/WaterMakerRealtimeDataRepository.java b/src/main/java/com/campus/water/mapper/WaterMakerRealtimeDataRepository.java index 9560460..7546bc0 100644 --- a/src/main/java/com/campus/water/mapper/WaterMakerRealtimeDataRepository.java +++ b/src/main/java/com/campus/water/mapper/WaterMakerRealtimeDataRepository.java @@ -1,24 +1,25 @@ package com.campus.water.mapper; -import datebaseclass.sensor.WaterMakerRealtimeData; +import com.campus.water.entity.WaterMakerRealtimeData; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; @Repository public interface WaterMakerRealtimeDataRepository extends JpaRepository { List findByDeviceId(String deviceId); - @Query("SELECT w FROM WaterMakerRealtimeData w WHERE w.timestamp BETWEEN ?1 AND ?2 ORDER BY w.timestamp DESC") - List findByTimestampBetween(LocalDateTime start, LocalDateTime end); + @Query("SELECT w FROM WaterMakerRealtimeData w WHERE w.recordTime BETWEEN ?1 AND ?2 ORDER BY w.recordTime DESC") + List findByRecordTimeBetween(LocalDateTime start, LocalDateTime end); - @Query("SELECT w FROM WaterMakerRealtimeData w WHERE w.deviceId = ?1 AND w.timestamp BETWEEN ?2 AND ?3 ORDER BY w.timestamp DESC") - List findByDeviceIdAndTimestampBetween(String deviceId, LocalDateTime start, LocalDateTime end); + @Query("SELECT w FROM WaterMakerRealtimeData w WHERE w.deviceId = ?1 AND w.recordTime BETWEEN ?2 AND ?3 ORDER BY w.recordTime DESC") + List findByDeviceIdAndRecordTimeBetween(String deviceId, LocalDateTime start, LocalDateTime end); - @Query(value = "SELECT * FROM water_maker_realtime_data w WHERE w.device_id = ?1 ORDER BY w.timestamp DESC LIMIT 10", nativeQuery = true) - List findTop10ByDeviceIdOrderByTimestampDesc(String deviceId); + @Query(value = "SELECT * FROM water_maker_realtime_data w WHERE w.device_id = ?1 ORDER BY w.record_time DESC LIMIT 10", nativeQuery = true) + List findTop10ByDeviceIdOrderByRecordTimeDesc(String deviceId); List findByLeakage(Boolean leakage); List findByStatus(WaterMakerRealtimeData.DeviceStatus status); @@ -26,6 +27,18 @@ public interface WaterMakerRealtimeDataRepository extends JpaRepository findByFilterLifeLessThan(Integer filterLife); - @Query("SELECT w FROM WaterMakerRealtimeData w WHERE w.tdsValue > ?1") - List findByTdsValueGreaterThan(Double tdsValue); + @Query("SELECT w FROM WaterMakerRealtimeData w WHERE w.tdsValue1 > ?1") + List findByTdsValue1GreaterThan(Double tdsValue); + + @Query("SELECT w FROM WaterMakerRealtimeData w WHERE w.tdsValue2 > ?1") + List findByTdsValue2GreaterThan(Double tdsValue); + + @Query("SELECT w FROM WaterMakerRealtimeData w WHERE w.tdsValue3 > ?1") + List findByTdsValue3GreaterThan(Double tdsValue); + + @Query("SELECT w FROM WaterMakerRealtimeData w WHERE w.waterPress < ?1") + List findByWaterPressLessThan(Double waterPress); + + @Query(value = "SELECT * FROM water_maker_realtime_data w WHERE w.device_id = ?1 ORDER BY w.record_time DESC LIMIT 1", nativeQuery = true) + Optional findLatestByDeviceId(String deviceId); } \ No newline at end of file diff --git a/src/main/java/com/campus/water/mapper/WaterQualityHistoryRepository.java b/src/main/java/com/campus/water/mapper/WaterQualityHistoryRepository.java index ac7a5cf..74d956b 100644 --- a/src/main/java/com/campus/water/mapper/WaterQualityHistoryRepository.java +++ b/src/main/java/com/campus/water/mapper/WaterQualityHistoryRepository.java @@ -1,29 +1,45 @@ package com.campus.water.mapper; -import datebaseclass.sensor.WaterQualityHistory; +import com.campus.water.entity.WaterQualityHistory; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; @Repository public interface WaterQualityHistoryRepository extends JpaRepository { List findByTerminalId(String terminalId); List findByDeviceId(String deviceId); - @Query("SELECT w FROM WaterQualityHistory w WHERE w.terminalId = ?1 AND w.timestamp BETWEEN ?2 AND ?3 ORDER BY w.timestamp DESC") - List findByTerminalIdAndTimestampBetween(String terminalId, LocalDateTime start, LocalDateTime end); + @Query("SELECT w FROM WaterQualityHistory w WHERE w.terminalId = ?1 AND w.detectedTime BETWEEN ?2 AND ?3 ORDER BY w.detectedTime DESC") + List findByTerminalIdAndDetectedTimeBetween(String terminalId, LocalDateTime start, LocalDateTime end); - @Query(value = "SELECT * FROM water_quality_history w WHERE w.terminal_id = ?1 ORDER BY w.timestamp DESC LIMIT 5", nativeQuery = true) - List findTop5ByTerminalIdOrderByTimestampDesc(String terminalId); + @Query(value = "SELECT * FROM water_quality_history w WHERE w.terminal_id = ?1 ORDER BY w.detected_time DESC LIMIT 5", nativeQuery = true) + List findTop5ByTerminalIdOrderByDetectedTimeDesc(String terminalId); @Query("SELECT w FROM WaterQualityHistory w WHERE w.waterQuality = ?1") List findByWaterQuality(String waterQuality); - @Query("SELECT w FROM WaterQualityHistory w WHERE w.tdsValue > ?1") - List findByTdsValueGreaterThan(Double tdsValue); + @Query("SELECT w FROM WaterQualityHistory w WHERE w.tdsValue1 > ?1") + List findByTdsValue1GreaterThan(Double tdsValue); - @Query("SELECT w FROM WaterQualityHistory w WHERE w.deviceId = ?1 AND w.timestamp BETWEEN ?2 AND ?3 ORDER BY w.timestamp DESC") - List findByDeviceIdAndTimestampBetween(String deviceId, LocalDateTime start, LocalDateTime end); + @Query("SELECT w FROM WaterQualityHistory w WHERE w.tdsValue2 > ?1") + List findByTdsValue2GreaterThan(Double tdsValue); + + @Query("SELECT w FROM WaterQualityHistory w WHERE w.tdsValue3 > ?1") + List findByTdsValue3GreaterThan(Double tdsValue); + + @Query("SELECT w FROM WaterQualityHistory w WHERE w.deviceId = ?1 AND w.detectedTime BETWEEN ?2 AND ?3 ORDER BY w.detectedTime DESC") + List findByDeviceIdAndDetectedTimeBetween(String deviceId, LocalDateTime start, LocalDateTime end); + + @Query(value = "SELECT * FROM water_quality_history w WHERE w.terminal_id = ?1 ORDER BY w.detected_time DESC LIMIT 1", nativeQuery = true) + Optional findLatestByTerminalId(String terminalId); + + @Query(value = "SELECT * FROM water_quality_history w WHERE w.device_id = ?1 ORDER BY w.detected_time DESC LIMIT 1", nativeQuery = true) + Optional findLatestByDeviceId(String deviceId); + + @Query("SELECT w FROM WaterQualityHistory w WHERE w.detectedTime BETWEEN ?1 AND ?2 ORDER BY w.detectedTime DESC") + List findByDetectedTimeBetween(LocalDateTime start, LocalDateTime end); } \ No newline at end of file diff --git a/src/main/java/com/campus/water/mapper/WaterSupplyRealtimeDataRepository.java b/src/main/java/com/campus/water/mapper/WaterSupplyRealtimeDataRepository.java index 26fdfd4..b43ec7e 100644 --- a/src/main/java/com/campus/water/mapper/WaterSupplyRealtimeDataRepository.java +++ b/src/main/java/com/campus/water/mapper/WaterSupplyRealtimeDataRepository.java @@ -1,11 +1,12 @@ package com.campus.water.mapper; -import datebaseclass.sensor.WaterSupplyRealtimeData; +import com.campus.water.entity.WaterSupplyRealtimeData; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; @Repository public interface WaterSupplyRealtimeDataRepository extends JpaRepository { @@ -28,6 +29,9 @@ public interface WaterSupplyRealtimeDataRepository extends JpaRepository ?1") List findByTemperatureGreaterThan(Double temperature); - @Query("SELECT w FROM WaterSupplyRealtimeData w WHERE w.waterPressure < ?1") - List findByWaterPressureLessThan(Double waterPressure); + @Query("SELECT w FROM WaterSupplyRealtimeData w WHERE w.waterPress < ?1") + List findByWaterPressLessThan(Double waterPress); + + @Query(value = "SELECT * FROM water_supply_realtime_data w WHERE w.device_id = ?1 ORDER BY w.timestamp DESC LIMIT 1", nativeQuery = true) + Optional findLatestByDeviceId(String deviceId); } \ No newline at end of file diff --git a/src/main/java/com/campus/water/mapper/WorkOrderRepository.java b/src/main/java/com/campus/water/mapper/WorkOrderRepository.java index f87c504..4fb1c70 100644 --- a/src/main/java/com/campus/water/mapper/WorkOrderRepository.java +++ b/src/main/java/com/campus/water/mapper/WorkOrderRepository.java @@ -1,6 +1,6 @@ package com.campus.water.mapper; -import datebaseclass.business.WorkOrder; +import com.campus.water.entity.WorkOrder; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.time.LocalDateTime; diff --git a/src/main/java/com/campus/water/service/app/RepairmanAppService.java b/src/main/java/com/campus/water/service/app/RepairmanAppService.java new file mode 100644 index 0000000..c28005b --- /dev/null +++ b/src/main/java/com/campus/water/service/app/RepairmanAppService.java @@ -0,0 +1,89 @@ +package com.campus.water.service.app; + +import com.campus.water.entity.WorkOrder; +import com.campus.water.controller.WorkOrderController; +import com.campus.water.util.ResultVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class RepairmanAppService { + + @Autowired + private WorkOrderController workOrderController; + + // 获取可抢工单列表 + public ResultVO> getAvailableOrders(String areaId) { + try { + List orders = workOrderController.getAvailableOrders(areaId); + return ResultVO.success(orders); + } catch (Exception e) { + return ResultVO.error(500, "获取工单列表失败: " + e.getMessage()); + } + } + + // 抢单 + public ResultVO grabOrder(Map request) { + try { + String orderId = request.get("orderId"); + String repairmanId = request.get("repairmanId"); + boolean result = workOrderController.grabOrder(orderId, repairmanId); + if (result) { + return ResultVO.success(true, "抢单成功"); + } else { + return ResultVO.error(400, "抢单失败,工单可能已被其他人抢走"); + } + } catch (Exception e) { + return ResultVO.error(500, "抢单失败: " + e.getMessage()); + } + } + + // 拒单 + public ResultVO rejectOrder(Map request) { + try { + String orderId = request.get("orderId"); + String repairmanId = request.get("repairmanId"); + String reason = request.get("reason"); + boolean result = workOrderController.rejectOrder(orderId, repairmanId, reason); + if (result) { + return ResultVO.success(true, "拒单成功"); + } else { + return ResultVO.error(400, "拒单失败"); + } + } catch (Exception e) { + return ResultVO.error(500, "拒单失败: " + e.getMessage()); + } + } + + // 提交维修结果 + public ResultVO submitRepairResult(Map request) { + try { + String orderId = request.get("orderId"); + String repairmanId = request.get("repairmanId"); + String dealNote = request.get("dealNote"); + String imgUrl = request.get("imgUrl"); + + boolean result = workOrderController.submitRepairResult(orderId, repairmanId, dealNote, imgUrl); + if (result) { + return ResultVO.success(true, "维修结果提交成功"); + } else { + return ResultVO.error(400, "维修结果提交失败"); + } + } catch (Exception e) { + return ResultVO.error(500, "提交失败: " + e.getMessage()); + } + } + + // 获取我的工单 + public ResultVO> getMyOrders(String repairmanId) { + try { + List orders = workOrderController.getMyOrders(repairmanId); + return ResultVO.success(orders); + } catch (Exception e) { + return ResultVO.error(500, "获取工单失败: " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/campus/water/service/app/StudentAppService.java b/src/main/java/com/campus/water/service/app/StudentAppService.java new file mode 100644 index 0000000..db0d90c --- /dev/null +++ b/src/main/java/com/campus/water/service/app/StudentAppService.java @@ -0,0 +1,49 @@ +package com.campus.water.service.app; + +import com.campus.water.controller.WaterUsageController; +import com.campus.water.util.ResultVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Service +public class StudentAppService { + + @Autowired + private WaterUsageController waterUsageController; + + // 扫码获取终端信息 + public ResultVO> getTerminalInfo(String terminalId) { + try { + Map result = waterUsageController.getTerminalInfo(terminalId); + return ResultVO.success(result); + } catch (Exception e) { + return ResultVO.error(500, "获取终端信息失败: " + e.getMessage()); + } + } + + // 扫码用水 + public ResultVO> scanToDrink(Map request) { + try { + String terminalId = (String) request.get("terminalId"); + String studentId = (String) request.get("studentId"); + Double waterConsumption = Double.valueOf(request.get("waterConsumption").toString()); + + Map result = waterUsageController.scanToDrink(terminalId, studentId, waterConsumption); + return ResultVO.success(result); + } catch (Exception e) { + return ResultVO.error(500, "用水操作失败: " + e.getMessage()); + } + } + + // 查询水质信息 + public ResultVO> getWaterQuality(String deviceId) { + try { + Map result = waterUsageController.getWaterQualityInfo(deviceId); + return ResultVO.success(result); + } catch (Exception e) { + return ResultVO.error(500, "获取水质信息失败: " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/campus/water/util/ResultVO.java b/src/main/java/com/campus/water/util/ResultVO.java new file mode 100644 index 0000000..773a19a --- /dev/null +++ b/src/main/java/com/campus/water/util/ResultVO.java @@ -0,0 +1,66 @@ +package com.campus.water.util; + +import lombok.Data; + +@Data +public class ResultVO { + private Integer code; // 状态码 + private String message; // 提示信息 + private T data; // 返回数据 + private Long timestamp; // 时间戳 + + public ResultVO() { + this.timestamp = System.currentTimeMillis(); + } + + // 成功返回(带数据) + public static ResultVO success(T data) { + ResultVO result = new ResultVO<>(); + result.setCode(200); + result.setMessage("success"); + result.setData(data); + return result; + } + + // 成功返回(带数据和自定义消息) + public static ResultVO success(T data, String message) { + ResultVO result = new ResultVO<>(); + result.setCode(200); + result.setMessage(message); + result.setData(data); + return result; + } + + // 成功返回(无数据) + public static ResultVO success() { + ResultVO result = new ResultVO<>(); + result.setCode(200); + result.setMessage("success"); + return result; + } + + // 错误返回 + public static ResultVO error(Integer code, String message) { + ResultVO result = new ResultVO<>(); + result.setCode(code); + result.setMessage(message); + return result; + } + + // 常见的错误状态 + public static ResultVO error(String message) { + return error(500, message); + } + + public static ResultVO badRequest(String message) { + return error(400, message); + } + + public static ResultVO unauthorized(String message) { + return error(401, message); + } + + public static ResultVO notFound(String message) { + return error(404, message); + } +} \ No newline at end of file -- 2.34.1