王磊——第十周新增开发工单管理接口,开发扫码用水接口,水质信息查询接口 #26

Merged
hnu202326010106 merged 1 commits from wanglei_branch into develop 1 month ago

@ -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<String, Object> scanToDrink(String terminalId, String studentId, Double waterConsumption) {
Map<String, Object> result = new HashMap<>();
try {
Optional<DeviceTerminalMapping> 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<WaterMakerRealtimeData> 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<TerminalUsageStats> 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<String, Object> getWaterQualityInfo(String deviceId) {
Map<String, Object> result = new HashMap<>();
try {
Optional<WaterMakerRealtimeData> realtimeDataOpt =
waterMakerRealtimeDataRepository.findLatestByDeviceId(deviceId);
Optional<WaterQualityHistory> 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<String, Object> getTerminalInfo(String terminalId) {
Map<String, Object> result = new HashMap<>();
Optional<DeviceTerminalMapping> 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<String, Object> qualityInfo = getWaterQualityInfo(mapping.getDeviceId());
result.putAll(qualityInfo);
} else {
result.put("success", false);
result.put("message", "终端设备不存在");
}
return result;
}
}

@ -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<WorkOrder> 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<WorkOrder> 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<WorkOrder> 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<WorkOrder> getAvailableOrders(String areaId) {
return workOrderRepository.findByAreaIdAndStatus(areaId, WorkOrder.OrderStatus.pending);
}
// 获取维修工自己的工单
public List<WorkOrder> getMyOrders(String repairmanId) {
return workOrderRepository.findByAssignedRepairmanId(repairmanId);
}
}

@ -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;

@ -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();

@ -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();

@ -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")

@ -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;

@ -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;

@ -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;

@ -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;

@ -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;

@ -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;

@ -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<DrinkRecord, Long> {
// 现有方法...
List<DrinkRecord> findByStudentId(String studentId);
List<DrinkRecord> findByTerminalId(String terminalId);
List<DrinkRecord> findByDeviceId(String deviceId);
// 新增基于drinkDate的查询方法
// 修正:使用 drink_time 字段进行日期范围查询
@Query("SELECT d FROM DrinkRecord d WHERE d.studentId = ?1 AND DATE(d.drinkTime) = ?2")
List<DrinkRecord> findByStudentIdAndDrinkDate(String studentId, LocalDate drinkDate);
List<DrinkRecord> 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<DrinkRecord> 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<DrinkRecord> 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<DrinkRecord> 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<DrinkRecord> 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);
}

@ -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;

@ -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;

@ -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;

@ -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;

@ -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;

@ -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;

@ -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;

@ -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<WaterMakerRealtimeData, Long> {
List<WaterMakerRealtimeData> findByDeviceId(String deviceId);
@Query("SELECT w FROM WaterMakerRealtimeData w WHERE w.timestamp BETWEEN ?1 AND ?2 ORDER BY w.timestamp DESC")
List<WaterMakerRealtimeData> findByTimestampBetween(LocalDateTime start, LocalDateTime end);
@Query("SELECT w FROM WaterMakerRealtimeData w WHERE w.recordTime BETWEEN ?1 AND ?2 ORDER BY w.recordTime DESC")
List<WaterMakerRealtimeData> 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<WaterMakerRealtimeData> 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<WaterMakerRealtimeData> 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<WaterMakerRealtimeData> 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<WaterMakerRealtimeData> findTop10ByDeviceIdOrderByRecordTimeDesc(String deviceId);
List<WaterMakerRealtimeData> findByLeakage(Boolean leakage);
List<WaterMakerRealtimeData> findByStatus(WaterMakerRealtimeData.DeviceStatus status);
@ -26,6 +27,18 @@ public interface WaterMakerRealtimeDataRepository extends JpaRepository<WaterMak
@Query("SELECT w FROM WaterMakerRealtimeData w WHERE w.filterLife < ?1")
List<WaterMakerRealtimeData> findByFilterLifeLessThan(Integer filterLife);
@Query("SELECT w FROM WaterMakerRealtimeData w WHERE w.tdsValue > ?1")
List<WaterMakerRealtimeData> findByTdsValueGreaterThan(Double tdsValue);
@Query("SELECT w FROM WaterMakerRealtimeData w WHERE w.tdsValue1 > ?1")
List<WaterMakerRealtimeData> findByTdsValue1GreaterThan(Double tdsValue);
@Query("SELECT w FROM WaterMakerRealtimeData w WHERE w.tdsValue2 > ?1")
List<WaterMakerRealtimeData> findByTdsValue2GreaterThan(Double tdsValue);
@Query("SELECT w FROM WaterMakerRealtimeData w WHERE w.tdsValue3 > ?1")
List<WaterMakerRealtimeData> findByTdsValue3GreaterThan(Double tdsValue);
@Query("SELECT w FROM WaterMakerRealtimeData w WHERE w.waterPress < ?1")
List<WaterMakerRealtimeData> 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<WaterMakerRealtimeData> findLatestByDeviceId(String deviceId);
}

@ -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<WaterQualityHistory, Long> {
List<WaterQualityHistory> findByTerminalId(String terminalId);
List<WaterQualityHistory> 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<WaterQualityHistory> 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<WaterQualityHistory> 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<WaterQualityHistory> 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<WaterQualityHistory> findTop5ByTerminalIdOrderByDetectedTimeDesc(String terminalId);
@Query("SELECT w FROM WaterQualityHistory w WHERE w.waterQuality = ?1")
List<WaterQualityHistory> findByWaterQuality(String waterQuality);
@Query("SELECT w FROM WaterQualityHistory w WHERE w.tdsValue > ?1")
List<WaterQualityHistory> findByTdsValueGreaterThan(Double tdsValue);
@Query("SELECT w FROM WaterQualityHistory w WHERE w.tdsValue1 > ?1")
List<WaterQualityHistory> 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<WaterQualityHistory> findByDeviceIdAndTimestampBetween(String deviceId, LocalDateTime start, LocalDateTime end);
@Query("SELECT w FROM WaterQualityHistory w WHERE w.tdsValue2 > ?1")
List<WaterQualityHistory> findByTdsValue2GreaterThan(Double tdsValue);
@Query("SELECT w FROM WaterQualityHistory w WHERE w.tdsValue3 > ?1")
List<WaterQualityHistory> 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<WaterQualityHistory> 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<WaterQualityHistory> 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<WaterQualityHistory> findLatestByDeviceId(String deviceId);
@Query("SELECT w FROM WaterQualityHistory w WHERE w.detectedTime BETWEEN ?1 AND ?2 ORDER BY w.detectedTime DESC")
List<WaterQualityHistory> findByDetectedTimeBetween(LocalDateTime start, LocalDateTime end);
}

@ -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<WaterSupplyRealtimeData, Long> {
@ -28,6 +29,9 @@ public interface WaterSupplyRealtimeDataRepository extends JpaRepository<WaterSu
@Query("SELECT w FROM WaterSupplyRealtimeData w WHERE w.temperature > ?1")
List<WaterSupplyRealtimeData> findByTemperatureGreaterThan(Double temperature);
@Query("SELECT w FROM WaterSupplyRealtimeData w WHERE w.waterPressure < ?1")
List<WaterSupplyRealtimeData> findByWaterPressureLessThan(Double waterPressure);
@Query("SELECT w FROM WaterSupplyRealtimeData w WHERE w.waterPress < ?1")
List<WaterSupplyRealtimeData> 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<WaterSupplyRealtimeData> findLatestByDeviceId(String deviceId);
}

@ -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;

@ -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<List<WorkOrder>> getAvailableOrders(String areaId) {
try {
List<WorkOrder> orders = workOrderController.getAvailableOrders(areaId);
return ResultVO.success(orders);
} catch (Exception e) {
return ResultVO.error(500, "获取工单列表失败: " + e.getMessage());
}
}
// 抢单
public ResultVO<Boolean> grabOrder(Map<String, String> 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<Boolean> rejectOrder(Map<String, String> 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<Boolean> submitRepairResult(Map<String, String> 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<List<WorkOrder>> getMyOrders(String repairmanId) {
try {
List<WorkOrder> orders = workOrderController.getMyOrders(repairmanId);
return ResultVO.success(orders);
} catch (Exception e) {
return ResultVO.error(500, "获取工单失败: " + e.getMessage());
}
}
}

@ -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<Map<String, Object>> getTerminalInfo(String terminalId) {
try {
Map<String, Object> result = waterUsageController.getTerminalInfo(terminalId);
return ResultVO.success(result);
} catch (Exception e) {
return ResultVO.error(500, "获取终端信息失败: " + e.getMessage());
}
}
// 扫码用水
public ResultVO<Map<String, Object>> scanToDrink(Map<String, Object> request) {
try {
String terminalId = (String) request.get("terminalId");
String studentId = (String) request.get("studentId");
Double waterConsumption = Double.valueOf(request.get("waterConsumption").toString());
Map<String, Object> result = waterUsageController.scanToDrink(terminalId, studentId, waterConsumption);
return ResultVO.success(result);
} catch (Exception e) {
return ResultVO.error(500, "用水操作失败: " + e.getMessage());
}
}
// 查询水质信息
public ResultVO<Map<String, Object>> getWaterQuality(String deviceId) {
try {
Map<String, Object> result = waterUsageController.getWaterQualityInfo(deviceId);
return ResultVO.success(result);
} catch (Exception e) {
return ResultVO.error(500, "获取水质信息失败: " + e.getMessage());
}
}
}

@ -0,0 +1,66 @@
package com.campus.water.util;
import lombok.Data;
@Data
public class ResultVO<T> {
private Integer code; // 状态码
private String message; // 提示信息
private T data; // 返回数据
private Long timestamp; // 时间戳
public ResultVO() {
this.timestamp = System.currentTimeMillis();
}
// 成功返回(带数据)
public static <T> ResultVO<T> success(T data) {
ResultVO<T> result = new ResultVO<>();
result.setCode(200);
result.setMessage("success");
result.setData(data);
return result;
}
// 成功返回(带数据和自定义消息)
public static <T> ResultVO<T> success(T data, String message) {
ResultVO<T> result = new ResultVO<>();
result.setCode(200);
result.setMessage(message);
result.setData(data);
return result;
}
// 成功返回(无数据)
public static <T> ResultVO<T> success() {
ResultVO<T> result = new ResultVO<>();
result.setCode(200);
result.setMessage("success");
return result;
}
// 错误返回
public static <T> ResultVO<T> error(Integer code, String message) {
ResultVO<T> result = new ResultVO<>();
result.setCode(code);
result.setMessage(message);
return result;
}
// 常见的错误状态
public static <T> ResultVO<T> error(String message) {
return error(500, message);
}
public static <T> ResultVO<T> badRequest(String message) {
return error(400, message);
}
public static <T> ResultVO<T> unauthorized(String message) {
return error(401, message);
}
public static <T> ResultVO<T> notFound(String message) {
return error(404, message);
}
}
Loading…
Cancel
Save