Ver código fonte

new: TCP数据、设备查询接口等

lwh 2 semanas atrás
pai
commit
0856beb7cf

+ 52 - 0
pig-marketing/pig-marketing-api/src/main/java/com/pig4cloud/pig/marketing/api/dto/mongo/PageDeviceInfoDTO.java

@@ -0,0 +1,52 @@
+package com.pig4cloud.pig.marketing.api.dto.mongo;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * @author: lwh
+ * @date: 2025-08-28
+ * @description: 分页查询设备信息入参
+ */
+@Data
+@Schema(description = "分页查询设备信息入参")
+public class PageDeviceInfoDTO implements Serializable {
+
+	@Serial
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 每页显示条数,默认 10
+	 */
+	@Schema(description = "每页显示条数", example = "10")
+	private Integer size = 10;
+
+	/**
+	 * 当前页
+	 */
+	@Schema(description = "当前页", example = "1")
+	private Integer current = 1;
+
+	/**
+	 * 客户端ID
+	 */
+	@Schema(description = "客户端ID", example = "e478d52e-c773-45e7-b7f9-20ffeb14e730")
+	private String clientID;
+
+	/**
+	 * 起始时间
+	 */
+	@Schema(description = "起始时间")
+	private LocalDateTime startTime;
+
+	/**
+	 * 结束时间
+	 */
+	@Schema(description = "结束时间")
+	private LocalDateTime endTime;
+}

+ 29 - 0
pig-marketing/pig-marketing-api/src/main/java/com/pig4cloud/pig/marketing/api/dto/mongo/SaveDeviceInfoDTO.java

@@ -0,0 +1,29 @@
+package com.pig4cloud.pig.marketing.api.dto.mongo;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author: lwh
+ * @date: 2025-08-28
+ * @description: TODO
+ */
+@Data
+@Schema(description = "保存或更新设备信息入参")
+public class SaveDeviceInfoDTO implements Serializable {
+
+	@Serial
+	private static final long serialVersionUID = 1L;
+
+	@Schema(description = "客户端ID")
+	@NotBlank(message = "客户端ID不能为空")
+	private String clientID;
+
+	@Schema(description = "设备信息")
+	private String deviceInfo;
+}

+ 29 - 0
pig-marketing/pig-marketing-api/src/main/java/com/pig4cloud/pig/marketing/api/dto/mongo/SaveTcpMessageDTO.java

@@ -0,0 +1,29 @@
+package com.pig4cloud.pig.marketing.api.dto.mongo;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author: lwh
+ * @date: 2025-08-28
+ * @description: 保存TCP上报数据入参
+ */
+@Data
+@Schema(description = "保存TCP上报数据入参")
+public class SaveTcpMessageDTO implements Serializable {
+
+	@Serial
+	private static final long serialVersionUID = 1L;
+
+	@Schema(description = "客户端ID")
+	@NotBlank(message = "客户端ID不能为空")
+	private String clientID;
+
+	@Schema(description = "数据")
+	private String msgData;
+}

+ 5 - 3
pig-marketing/pig-marketing-api/src/main/java/com/pig4cloud/pig/marketing/api/mongo/Device.java → pig-marketing/pig-marketing-api/src/main/java/com/pig4cloud/pig/marketing/api/entity/mongo/Device.java

@@ -1,9 +1,11 @@
-package com.pig4cloud.pig.marketing.api.mongo;
+package com.pig4cloud.pig.marketing.api.entity.mongo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import org.springframework.data.annotation.Id;
 import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.time.LocalDateTime;
 import java.util.Date;
 
 /**
@@ -26,8 +28,8 @@ public class Device {
 	private String deviceInfo; // 设备信息字符串
 
 	@Schema(description = "创建时间")
-	private Date createTime; // 创建时间
+	private LocalDateTime createTime; // 创建时间
 
 	@Schema(description = "更新时间")
-	private Date updateTime; // 更新时间
+	private LocalDateTime updateTime; // 更新时间
 }

+ 4 - 3
pig-marketing/pig-marketing-api/src/main/java/com/pig4cloud/pig/marketing/api/mongo/Message.java → pig-marketing/pig-marketing-api/src/main/java/com/pig4cloud/pig/marketing/api/entity/mongo/Message.java

@@ -1,9 +1,10 @@
-package com.pig4cloud.pig.marketing.api.mongo;
+package com.pig4cloud.pig.marketing.api.entity.mongo;
 
 import lombok.Data;
 import org.springframework.data.annotation.Id;
 import org.springframework.data.mongodb.core.mapping.Document;
-import java.util.Date;
+
+import java.time.LocalDateTime;
 
 /**
  * @author: lwh
@@ -18,5 +19,5 @@ public class Message {
 
 	private String clientID; // 客户端唯一标识
 	private String msgData; // 消息内容字符串
-	private Date reportTime; // 上报时间
+	private LocalDateTime reportTime; // 上报时间
 }

+ 40 - 34
pig-marketing/pig-marketing-biz/src/main/java/com/pig4cloud/pig/marketing/controller/TcpDataController.java

@@ -1,21 +1,25 @@
 package com.pig4cloud.pig.marketing.controller;
 
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.pig4cloud.pig.common.core.exception.BusinessException;
 import com.pig4cloud.pig.common.core.util.R;
-import com.pig4cloud.pig.marketing.api.mongo.Device;
-import com.pig4cloud.pig.marketing.api.mongo.Message;
-import com.pig4cloud.pig.marketing.repository.service.DeviceService;
-import com.pig4cloud.pig.marketing.repository.service.MessageService;
+import com.pig4cloud.pig.marketing.api.dto.mongo.PageDeviceInfoDTO;
+import com.pig4cloud.pig.marketing.api.dto.mongo.SaveDeviceInfoDTO;
+import com.pig4cloud.pig.marketing.api.dto.mongo.SaveTcpMessageDTO;
+import com.pig4cloud.pig.marketing.api.entity.mongo.Device;
+import com.pig4cloud.pig.marketing.api.entity.mongo.Message;
+import com.pig4cloud.pig.marketing.service.TcpDataService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.security.SecurityRequirement;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotBlank;
 import lombok.AllArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.springdoc.core.annotations.ParameterObject;
 import org.springframework.http.HttpHeaders;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.List;
-
 /**
  * @author: lwh
  * @date: 2025-08-27
@@ -28,47 +32,49 @@ import java.util.List;
 @Tag(description = "TcpData", name = "TCP数据上报服务")
 @SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
 public class TcpDataController {
-	@Autowired
-	private MessageService messageService;
 
-	@Autowired
-	private DeviceService deviceService;
+	private final TcpDataService tcpDataService;
 
-	/************************* 设备 *************************
-	 * 保存或更新设备信息
-	 */
+	/******************************************* 设备 *******************************************/
 	@PostMapping("/device/save")
 	@Operation(summary = "保存或更新设备信息")
-	public R<String> saveOrUpdateDevice(@RequestBody Device device) {
-		deviceService.saveOrUpdateDevice(device);
-		return R.ok();
+	public R<String> saveOrUpdateDevice(@Valid @RequestBody SaveDeviceInfoDTO reqDto) {
+		return R.ok(tcpDataService.saveOrUpdateDevice(reqDto));
 	}
 
-	/**
-	 * 根据clientID查询设备信息
-	 */
 	@GetMapping("/device/get/{clientID}")
 	@Operation(summary = "根据客户端ID查询设备信息")
 	public R<Device> getDevice(@PathVariable String clientID) {
-		return R.ok(deviceService.getDeviceByClientID(clientID));
+		return R.ok(tcpDataService.getDeviceByClientID(clientID));
+	}
+
+	@PostMapping("/device/page")
+	@Operation(summary = "分页查询设备信息")
+	public R<Page<Device>> PageDeviceInfo(@RequestBody PageDeviceInfoDTO reqDto) {
+		return R.ok(tcpDataService.pageDeviceInfo(reqDto));
 	}
 
-	/************************* 消息 *************************
-	 * 保存消息
-	 */
+	/******************************************* 消息 *******************************************/
 	@PostMapping("/msg/save")
 	@Operation(summary = "保存上报数据")
-	public R<String> saveMessage(@RequestBody Message message) {
-		messageService.saveMessage(message);
-		return R.ok();
+	public R<String> saveMessage(@Valid @RequestBody SaveTcpMessageDTO reqDto) {
+		return R.ok(tcpDataService.saveMessage(reqDto));
+	}
+
+	@GetMapping("/msg/get")
+	@Operation(summary = "根据ID查询数据详情")
+	public R<Message> getMessagesByClient(
+			@NotBlank(message = "id不能为空")
+			@ParameterObject String id) {
+		return R.ok(tcpDataService.getMessagesById(id));
 	}
 
-	/**
-	 * 根据clientID查询消息列表
-	 */
-	@GetMapping("/msg/get/{clientID}")
-	@Operation(summary = "根据客户端ID查询数据列表")
-	public R<List<Message>> getMessagesByClient(@PathVariable String clientID) {
-		return R.ok(messageService.getMessagesByClientID(clientID));
+	@PostMapping("/msg/page")
+	@Operation(summary = "分页查询数据列表")
+	public R<Page<Message>> PageMsgInfo(@RequestBody PageDeviceInfoDTO reqDto) {
+		if (reqDto.getClientID() ==  null || reqDto.getClientID().isEmpty()){
+			throw new BusinessException("客户端ID不能为空");
+		}
+		return R.ok(tcpDataService.pageMsgInfo(reqDto));
 	}
 }

+ 1 - 1
pig-marketing/pig-marketing-biz/src/main/java/com/pig4cloud/pig/marketing/repository/DeviceRepository.java

@@ -1,6 +1,6 @@
 package com.pig4cloud.pig.marketing.repository;
 
-import com.pig4cloud.pig.marketing.api.mongo.Device;
+import com.pig4cloud.pig.marketing.api.entity.mongo.Device;
 import org.springframework.data.mongodb.repository.MongoRepository;
 import java.util.Optional;
 

+ 4 - 1
pig-marketing/pig-marketing-biz/src/main/java/com/pig4cloud/pig/marketing/repository/MessageRepository.java

@@ -1,6 +1,6 @@
 package com.pig4cloud.pig.marketing.repository;
 
-import com.pig4cloud.pig.marketing.api.mongo.Message;
+import com.pig4cloud.pig.marketing.api.entity.mongo.Message;
 import org.springframework.data.mongodb.repository.MongoRepository;
 import java.util.List;
 
@@ -17,4 +17,7 @@ public interface MessageRepository extends MongoRepository<Message, String> {
      * @return List<Message>
      */
     List<Message> findByClientIDOrderByReportTimeDesc(String clientID);
+
+
+
 }

+ 0 - 56
pig-marketing/pig-marketing-biz/src/main/java/com/pig4cloud/pig/marketing/repository/service/DeviceService.java

@@ -1,56 +0,0 @@
-package com.pig4cloud.pig.marketing.repository.service;
-
-
-import com.pig4cloud.pig.marketing.api.mongo.Device;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.data.mongodb.core.query.Criteria;
-import org.springframework.data.mongodb.core.query.Query;
-import org.springframework.data.mongodb.core.query.Update;
-import org.springframework.stereotype.Service;
-
-import java.util.Date;
-
-/**
- * @author: lwh
- * @date: 2025-08-27
- * @description: 设备信息服务类
- */
-
-@Service
-public class DeviceService {
-
-	@Autowired
-	private MongoTemplate mongoTemplate;
-
-	/**
-	 * 保存或更新设备信息
-	 * 对应MongoDB的upsert操作:存在则更新,不存在则插入
-	 */
-	public void saveOrUpdateDevice(Device device) {
-		// 创建查询条件:根据clientID匹配
-		Query query = new Query(Criteria.where("clientID").is(device.getClientID()));
-
-		// 创建更新对象
-		Update update = new Update();
-		// 设置设备信息
-		update.set("deviceInfo", device.getDeviceInfo());
-		// 设置更新时间为当前时间
-		update.set("updateTime", new Date());
-		// 仅在插入新记录时设置创建时间
-		update.setOnInsert("createTime", new Date());
-
-		// 执行upsert操作
-		mongoTemplate.upsert(query, update, Device.class);
-	}
-
-	/**
-	 * 根据clientID查询设备信息
-	 */
-	public Device getDeviceByClientID(String clientID) {
-		return mongoTemplate.findOne(
-				new Query(Criteria.where("clientID").is(clientID)),
-				Device.class
-		);
-	}
-}

+ 0 - 41
pig-marketing/pig-marketing-biz/src/main/java/com/pig4cloud/pig/marketing/repository/service/MessageService.java

@@ -1,41 +0,0 @@
-package com.pig4cloud.pig.marketing.repository.service;
-
-
-import com.pig4cloud.pig.marketing.api.mongo.Message;
-import com.pig4cloud.pig.marketing.repository.MessageRepository;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.Date;
-import java.util.List;
-
-/**
- * @author: lwh
- * @date: 2025-08-27
- * @description: 消息数据服务类
- */
-
-@Service
-public class MessageService {
-
-	@Autowired
-	private MessageRepository messageRepository;
-
-	/**
-	 * 保存消息数据
-	 */
-	public void saveMessage(Message message) {
-		// 设置上报时间为当前时间
-		if (message.getReportTime() == null) {
-			message.setReportTime(new Date());
-		}
-		messageRepository.save(message);
-	}
-
-	/**
-	 * 根据clientID查询消息列表,按时间倒序
-	 */
-	public List<Message> getMessagesByClientID(String clientID) {
-		return messageRepository.findByClientIDOrderByReportTimeDesc(clientID);
-	}
-}

+ 61 - 0
pig-marketing/pig-marketing-biz/src/main/java/com/pig4cloud/pig/marketing/service/TcpDataService.java

@@ -0,0 +1,61 @@
+package com.pig4cloud.pig.marketing.service;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.pig4cloud.pig.marketing.api.dto.mongo.PageDeviceInfoDTO;
+import com.pig4cloud.pig.marketing.api.dto.mongo.SaveDeviceInfoDTO;
+import com.pig4cloud.pig.marketing.api.dto.mongo.SaveTcpMessageDTO;
+import com.pig4cloud.pig.marketing.api.entity.mongo.Device;
+import com.pig4cloud.pig.marketing.api.entity.mongo.Message;
+
+/**
+ * @author: lwh
+ * @date: 2025-08-28
+ * @description: TCP数据服务
+ */
+
+public interface TcpDataService {
+
+	/**
+	 * 保存或更新设备信息
+	 * @param reqDto 入参
+	 * @return 设备信息ID
+	 */
+	String saveOrUpdateDevice(SaveDeviceInfoDTO reqDto);
+
+	/**
+	 * 根据客户端ID查询设备信息
+	 * @param clientID 客户端ID
+	 * @return 设备信息
+	 */
+	Device getDeviceByClientID(String clientID);
+
+	/**
+	 * 分页查询设备信息
+	 * @param reqDto 入参
+	 * @return 设备信息列表
+	 */
+	Page<Device> pageDeviceInfo(PageDeviceInfoDTO reqDto);
+
+
+	/******************************************* 消息 *******************************************
+	 * 保存上报数据
+	 * @param reqDto 入参
+	 * @return 数据ID
+	 */
+	String saveMessage(SaveTcpMessageDTO reqDto);
+
+	/**
+	 * 根据ID查询数据详情
+	 * @param id 数据ID
+	 * @return 数据详情
+	 */
+	Message getMessagesById(String id);
+
+	/**
+	 * 分页查询数据列表
+	 * @param reqDto 入参
+	 * @return 数据列表
+	 */
+	Page<Message> pageMsgInfo(PageDeviceInfoDTO reqDto);
+}

+ 196 - 0
pig-marketing/pig-marketing-biz/src/main/java/com/pig4cloud/pig/marketing/service/impl/TcpDataServiceImpl.java

@@ -0,0 +1,196 @@
+package com.pig4cloud.pig.marketing.service.impl;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.pig4cloud.pig.marketing.api.dto.mongo.PageDeviceInfoDTO;
+import com.pig4cloud.pig.marketing.api.dto.mongo.SaveDeviceInfoDTO;
+import com.pig4cloud.pig.marketing.api.dto.mongo.SaveTcpMessageDTO;
+import com.pig4cloud.pig.marketing.api.entity.mongo.Device;
+import com.pig4cloud.pig.marketing.api.entity.mongo.Message;
+import com.pig4cloud.pig.marketing.repository.DeviceRepository;
+import com.pig4cloud.pig.marketing.repository.MessageRepository;
+import com.pig4cloud.pig.marketing.service.TcpDataService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.data.mongodb.core.query.Update;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author: lwh
+ * @date: 2025-08-28
+ * @description: TCP数据服务实现类
+ */
+
+@Slf4j
+@Service
+@AllArgsConstructor
+public class TcpDataServiceImpl implements TcpDataService {
+
+	private final MongoTemplate mongoTemplate;
+
+	private final MessageRepository messageRepository;
+
+
+	/**
+	 * 保存或更新设备信息
+	 * @param reqDto
+	 * @return
+	 */
+	@Override
+	public String saveOrUpdateDevice(SaveDeviceInfoDTO reqDto) {
+		// 根据客户端ID查询设备信息
+		Query query = new Query(Criteria.where("clientID").is(reqDto.getClientID()));
+		Device existingDevice = mongoTemplate.findOne(query, Device.class);
+
+		if (existingDevice == null) {
+			// 无数据时直接新增
+			Device device = new Device();
+			device.setClientID(reqDto.getClientID());
+			device.setDeviceInfo(reqDto.getDeviceInfo());
+			device.setCreateTime(LocalDateTime.now().withNano(0));
+			device.setUpdateTime(LocalDateTime.now().withNano(0));
+			Device insert = mongoTemplate.insert(device);
+			return insert.getId();
+		} else {
+			// 有数据时对比设备信息是否一致
+			if (!Objects.equals(existingDevice.getDeviceInfo(), reqDto.getDeviceInfo())) {
+				// 信息不一致则更新
+				Update update = new Update();
+				update.set("deviceInfo", reqDto.getDeviceInfo());
+				update.set("updateTime", LocalDateTime.now().withNano(0));
+				mongoTemplate.updateFirst(query, update, Device.class);
+				return existingDevice.getId();
+			}
+		}
+		return existingDevice.getId();
+	}
+
+	/**
+	 * 根据客户端ID查询设备信息
+	 * @param clientID 客户端ID
+	 * @return 设备信息
+	 */
+	@Override
+	public Device getDeviceByClientID(String clientID) {
+		return mongoTemplate.findOne(
+				new Query(Criteria.where("clientID").is(clientID)),
+				Device.class
+		);
+	}
+
+	/**
+	 * 分页查询设备信息
+	 * @param reqDto 入参
+	 * @return 设备信息列表
+	 */
+	@Override
+	public Page<Device> pageDeviceInfo(PageDeviceInfoDTO reqDto) {
+		// 构建查询条件
+		Query query = new Query();
+
+		// 模糊匹配clientID
+		if (reqDto.getClientID() != null && !reqDto.getClientID().isEmpty()) {
+			query.addCriteria(Criteria.where("clientID").regex(reqDto.getClientID(), "i"));
+		}
+
+		// 时间范围筛选
+		if (reqDto.getStartTime() != null || reqDto.getEndTime() != null) {
+			Criteria timeCriteria = Criteria.where("createTime");
+			if (reqDto.getStartTime() != null) {
+				Date startDate = Date.from(reqDto.getStartTime().atZone(ZoneId.systemDefault()).toInstant());
+				timeCriteria.gte(startDate);
+			}
+
+			if (reqDto.getEndTime() != null) {
+				Date endDate = Date.from(reqDto.getEndTime().atZone(ZoneId.systemDefault()).toInstant());
+				timeCriteria.lte(endDate);
+			}
+			query.addCriteria(timeCriteria);
+		}
+
+
+		// 构建分页条件
+		Pageable pageable = PageRequest.of(
+				reqDto.getCurrent() - 1,
+				reqDto.getSize(),
+				Sort.by(Sort.Direction.DESC, "createTime"));
+		query.with(pageable);
+
+		// 执行查询
+		List<Device> devices = mongoTemplate.find(query, Device.class, "devices");
+		long total = mongoTemplate.count(query.skip(0).limit(0), "devices");
+
+		Page<Device> page = new Page<>(reqDto.getCurrent(), reqDto.getSize(), total);
+		page.setRecords(devices);
+		page.setTotal( total);
+		// 封装分页结果
+		return page;
+	}
+
+	/******************************************* 消息 *******************************************
+	 * 保存上报数据
+	 * @param reqDto 入参
+	 * @return 数据ID
+	 */
+	@Override
+	public String saveMessage(SaveTcpMessageDTO reqDto) {
+		Message message = new Message();
+		message.setClientID(reqDto.getClientID());
+		message.setMsgData(reqDto.getMsgData());
+		message.setReportTime(LocalDateTime.now());
+		Message save = messageRepository.save(message);
+		return save.getId();
+	}
+
+	/**
+	 * 根据ID查询数据详情
+	 * @param id 数据ID
+	 * @return 数据详情
+	 */
+	@Override
+	public Message getMessagesById(String id) {
+		return messageRepository.findById(id)
+				.orElse(null);
+	}
+
+	/**
+	 * 分页查询数据列表
+	 * @param reqDto 入参
+	 * @return 数据列表
+	 */
+	@Override
+	public Page<Message> pageMsgInfo(PageDeviceInfoDTO reqDto) {
+		// 构建查询条件
+		Query query = new Query(Criteria.where("clientID").is(reqDto.getClientID()));
+
+		// 构建分页条件
+		Pageable pageable = PageRequest.of(
+				reqDto.getCurrent() - 1,
+				reqDto.getSize(),
+				Sort.by(Sort.Direction.DESC, "reportTime"));
+		query.with(pageable);
+
+		// 执行查询
+		List<Message> messages = mongoTemplate.find(query, Message.class, "messages");
+		long total = mongoTemplate.count(query.skip(0).limit(0), "messages");
+
+		Page<Message> page = new Page<>(reqDto.getCurrent(), reqDto.getSize(), total);
+		page.setRecords(messages);
+		page.setTotal( total);
+		// 封装分页结果
+		return page;
+	}
+}