Przeglądaj źródła

修改设备为 标签机

xu 4 miesięcy temu
rodzic
commit
e05ddff6e8
2 zmienionych plików z 470 dodań i 0 usunięć
  1. 182 0
      server/api/v1/uhf/reader.go
  2. 288 0
      server/service/uhf/uhf_service.go

+ 182 - 0
server/api/v1/uhf/reader.go

@@ -0,0 +1,182 @@
+package uhf
+
+import (
+	"fmt"
+	"server/model/common/response"
+	"server/model/uhf/request"
+	uhfResponse "server/model/uhf/response"
+	"server/service/uhf"
+
+	"github.com/gin-gonic/gin"
+)
+
+func CreateReader(c *gin.Context) {
+	var req request.UHFReaderCreate
+	if err := c.ShouldBindJSON(&req); err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+
+	err := uhf.UHFService.CreateReader(req)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+
+	response.OkWithMessage("创建成功", c)
+}
+
+func UpdateReader(c *gin.Context) {
+	var req request.UHFReaderUpdate
+	if err := c.ShouldBindJSON(&req); err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+
+	err := uhf.UHFService.UpdateReader(req)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+
+	response.OkWithMessage("更新成功", c)
+}
+
+func GetReaderByID(c *gin.Context) {
+	id := c.Query("id")
+	uintID := uint(0)
+	_, err := fmt.Sscanf(id, "%d", &uintID)
+	if err != nil {
+		response.FailWithMessage("无效的ID", c)
+		return
+	}
+
+	reader, err := uhf.UHFService.GetReaderByID(uintID)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+
+	response.OkWithData(reader, c)
+}
+
+func GetReaderByCode(c *gin.Context) {
+	code := c.Query("code")
+	if code == "" {
+		response.FailWithMessage("设备编码不能为空", c)
+		return
+	}
+
+	reader, err := uhf.UHFService.GetReaderByCode(code)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+
+	response.OkWithData(reader, c)
+}
+
+func ListReaders(c *gin.Context) {
+	var req request.UHFReaderQuery
+	if err := c.ShouldBindQuery(&req); err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+
+	list, total, err := uhf.UHFService.ListReaders(req)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+
+	response.OkWithData(uhfResponse.UHFReaderList{
+		Total: total,
+		List:  list,
+	}, c)
+}
+
+func DeleteReader(c *gin.Context) {
+	id := c.Query("id")
+	uintID := uint(0)
+	_, err := fmt.Sscanf(id, "%d", &uintID)
+	if err != nil {
+		response.FailWithMessage("无效的ID", c)
+		return
+	}
+
+	err = uhf.UHFService.DeleteReader(uintID)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+
+	response.OkWithMessage("删除成功", c)
+}
+
+func ConnectReader(c *gin.Context) {
+	id := c.Query("id")
+	uintID := uint(0)
+	_, err := fmt.Sscanf(id, "%d", &uintID)
+	if err != nil {
+		response.FailWithMessage("无效的ID", c)
+		return
+	}
+
+	err = uhf.UHFService.ConnectReader(uintID)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+
+	response.OkWithMessage("连接成功", c)
+}
+
+func DisconnectReader(c *gin.Context) {
+	id := c.Query("id")
+	uintID := uint(0)
+	_, err := fmt.Sscanf(id, "%d", &uintID)
+	if err != nil {
+		response.FailWithMessage("无效的ID", c)
+		return
+	}
+
+	err = uhf.UHFService.DisconnectReader(uintID)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+
+	response.OkWithMessage("断开连接成功", c)
+}
+
+func SetReaderPower(c *gin.Context) {
+	var req request.UHFReaderPower
+	if err := c.ShouldBindJSON(&req); err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+
+	err := uhf.UHFService.SetReaderPower(req.ID, int(req.Power))
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+
+	response.OkWithMessage("功率设置成功", c)
+}
+
+func ReportTag(c *gin.Context) {
+	var req request.UHFReaderTagReport
+	if err := c.ShouldBindJSON(&req); err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+
+	err := uhf.UHFService.ReportTag(req.DeviceCode, req.Tag)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+
+	response.OkWithMessage("标签上报成功", c)
+}

+ 288 - 0
server/service/uhf/uhf_service.go

@@ -0,0 +1,288 @@
+package uhf
+
+import (
+	"fmt"
+	"server/dao"
+	"server/global"
+	"server/model/uhf/request"
+	"server/model/uhf/response"
+)
+
+type uhfService struct{}
+
+var UHFService = new(uhfService)
+
+// CreateReader 创建UHF读写器
+func (s *uhfService) CreateReader(req request.UHFReaderCreate) error {
+	var reader dao.UHFReader
+	result := global.GVA_DB.Where("device_code = ?", req.DeviceCode).First(&reader)
+	if result.RowsAffected > 0 {
+		return fmt.Errorf("设备编码已存在")
+	}
+
+	reader = dao.UHFReader{
+		DeviceCode:   req.DeviceCode,
+		DeviceName:   req.DeviceName,
+		ConnectType:  req.ConnectType,
+		IPAddress:    req.IPAddress,
+		Port:         req.Port,
+		COMPort:      req.COMPort,
+		BaudRate:     req.BaudRate,
+		IsActive:     req.IsActive,
+		Description:  req.Description,
+		ParkingLotID: req.ParkingLotID,
+	}
+
+	return global.GVA_DB.Create(&reader).Error
+}
+
+// UpdateReader 更新UHF读写器
+func (s *uhfService) UpdateReader(req request.UHFReaderUpdate) error {
+	var reader dao.UHFReader
+	result := global.GVA_DB.Where("id = ?", req.ID).First(&reader)
+	if result.RowsAffected == 0 {
+		return fmt.Errorf("设备不存在")
+	}
+
+	updateData := map[string]interface{}{
+		"device_name":    req.DeviceName,
+		"connect_type":   req.ConnectType,
+		"ip_address":     req.IPAddress,
+		"port":           req.Port,
+		"com_port":       req.COMPort,
+		"baud_rate":      req.BaudRate,
+		"is_active":      req.IsActive,
+		"description":    req.Description,
+		"parking_lot_id": req.ParkingLotID,
+	}
+
+	return global.GVA_DB.Model(&reader).Updates(updateData).Error
+}
+
+// GetReaderByID 根据ID获取设备
+func (s *uhfService) GetReaderByID(id uint) (response.UHFReaderResponse, error) {
+	var reader dao.UHFReader
+	result := global.GVA_DB.Where("id = ?", id).First(&reader)
+	if result.RowsAffected == 0 {
+		return response.UHFReaderResponse{}, fmt.Errorf("设备不存在")
+	}
+
+	return response.UHFReaderResponse{
+		ID:           reader.ID,
+		DeviceCode:   reader.DeviceCode,
+		DeviceName:   reader.DeviceName,
+		ConnectType:  reader.ConnectType,
+		IPAddress:    reader.IPAddress,
+		Port:         reader.Port,
+		COMPort:      reader.COMPort,
+		BaudRate:     reader.BaudRate,
+		Status:       reader.Status,
+		IsActive:     reader.IsActive,
+		Description:  reader.Description,
+		ParkingLotID: reader.ParkingLotID,
+		CreatedAt:    reader.CreatedAt,
+		UpdatedAt:    reader.UpdatedAt,
+	}, nil
+}
+
+// GetReaderByCode 根据设备编码获取设备
+func (s *uhfService) GetReaderByCode(code string) (response.UHFReaderResponse, error) {
+	var reader dao.UHFReader
+	result := global.GVA_DB.Where("device_code = ?", code).First(&reader)
+	if result.RowsAffected == 0 {
+		return response.UHFReaderResponse{}, fmt.Errorf("设备不存在")
+	}
+
+	return response.UHFReaderResponse{
+		ID:           reader.ID,
+		DeviceCode:   reader.DeviceCode,
+		DeviceName:   reader.DeviceName,
+		ConnectType:  reader.ConnectType,
+		IPAddress:    reader.IPAddress,
+		Port:         reader.Port,
+		COMPort:      reader.COMPort,
+		BaudRate:     reader.BaudRate,
+		Status:       reader.Status,
+		IsActive:     reader.IsActive,
+		Description:  reader.Description,
+		ParkingLotID: reader.ParkingLotID,
+		CreatedAt:    reader.CreatedAt,
+		UpdatedAt:    reader.UpdatedAt,
+	}, nil
+}
+
+// ListReaders 分页查询设备列表
+func (s *uhfService) ListReaders(req request.UHFReaderQuery) ([]response.UHFReaderResponse, int64, error) {
+	var readers []dao.UHFReader
+	var total int64
+
+	query := global.GVA_DB.Model(&dao.UHFReader{})
+
+	if req.DeviceCode != "" {
+		query = query.Where("device_code LIKE ?", "%"+req.DeviceCode+"%")
+	}
+	if req.DeviceName != "" {
+		query = query.Where("device_name LIKE ?", "%"+req.DeviceName+"%")
+	}
+	if req.Status != "" {
+		query = query.Where("status = ?", req.Status)
+	}
+	if req.ConnectType != "" {
+		query = query.Where("connect_type = ?", req.ConnectType)
+	}
+
+	err := query.Count(&total).Error
+	if err != nil {
+		return nil, 0, err
+	}
+
+	limit := req.PageSize
+	offset := (req.Page - 1) * req.PageSize
+	err = query.Limit(limit).Offset(offset).Order("created_at DESC").Find(&readers).Error
+	if err != nil {
+		return nil, 0, err
+	}
+
+	var list []response.UHFReaderResponse
+	for _, reader := range readers {
+		list = append(list, response.UHFReaderResponse{
+			ID:           reader.ID,
+			DeviceCode:   reader.DeviceCode,
+			DeviceName:   reader.DeviceName,
+			ConnectType:  reader.ConnectType,
+			IPAddress:    reader.IPAddress,
+			Port:         reader.Port,
+			COMPort:      reader.COMPort,
+			BaudRate:     reader.BaudRate,
+			Status:       reader.Status,
+			IsActive:     reader.IsActive,
+			Description:  reader.Description,
+			ParkingLotID: reader.ParkingLotID,
+			CreatedAt:    reader.CreatedAt,
+			UpdatedAt:    reader.UpdatedAt,
+		})
+	}
+
+	return list, total, nil
+}
+
+// DeleteReader 删除设备
+func (s *uhfService) DeleteReader(id uint) error {
+	var reader dao.UHFReader
+	result := global.GVA_DB.Where("id = ?", id).First(&reader)
+	if result.RowsAffected == 0 {
+		return fmt.Errorf("设备不存在")
+	}
+
+	return global.GVA_DB.Delete(&reader).Error
+}
+
+// ConnectReader 连接设备
+func (s *uhfService) ConnectReader(id uint) error {
+	var reader dao.UHFReader
+	result := global.GVA_DB.Where("id = ?", id).First(&reader)
+	if result.RowsAffected == 0 {
+		return fmt.Errorf("设备不存在")
+	}
+
+	if !reader.IsActive {
+		return fmt.Errorf("设备未启用")
+	}
+
+	err := global.GVA_DB.Model(&reader).Update("status", "online").Error
+	if err != nil {
+		return err
+	}
+
+	fmt.Printf("设备[%s]连接成功\n", reader.DeviceCode)
+	return nil
+}
+
+// DisconnectReader 断开设备连接
+func (s *uhfService) DisconnectReader(id uint) error {
+	var reader dao.UHFReader
+	result := global.GVA_DB.Where("id = ?", id).First(&reader)
+	if result.RowsAffected == 0 {
+		return fmt.Errorf("设备不存在")
+	}
+
+	err := global.GVA_DB.Model(&reader).Update("status", "offline").Error
+	if err != nil {
+		return err
+	}
+
+	fmt.Printf("设备[%s]断开连接\n", reader.DeviceCode)
+	return nil
+}
+
+// ReportTag 客户端上报标签数据
+func (s *uhfService) ReportTag(deviceCode string, tag string) error {
+	var reader dao.UHFReader
+	result := global.GVA_DB.Where("device_code = ?", deviceCode).First(&reader)
+	if result.RowsAffected == 0 {
+		return fmt.Errorf("设备不存在")
+	}
+
+	fmt.Printf("📶 收到设备 %s 上报的标签: %s\n", deviceCode, tag)
+
+	return nil
+}
+
+// SetReaderPower 设置功率(模拟实现)
+func (s *uhfService) SetReaderPower(id uint, power int) error {
+	var reader dao.UHFReader
+	result := global.GVA_DB.Where("id = ?", id).First(&reader)
+	if result.RowsAffected == 0 {
+		return fmt.Errorf("设备不存在")
+	}
+
+	if reader.Status != "online" {
+		return fmt.Errorf("设备未连接")
+	}
+
+	fmt.Printf("设备[%s]功率设置为: %ddBm\n", reader.DeviceCode, power)
+	return nil
+}
+
+// StartInventory 启动读卡(模拟实现)
+func (s *uhfService) StartInventory(id uint) error {
+	var reader dao.UHFReader
+	result := global.GVA_DB.Where("id = ?", id).First(&reader)
+	if result.RowsAffected == 0 {
+		return fmt.Errorf("设备不存在")
+	}
+
+	if reader.Status != "online" {
+		return fmt.Errorf("设备未连接")
+	}
+
+	fmt.Printf("设备[%s]已启动读卡模式\n", reader.DeviceCode)
+	return nil
+}
+
+// StopInventory 停止读卡(模拟实现)
+func (s *uhfService) StopInventory(id uint) error {
+	var reader dao.UHFReader
+	result := global.GVA_DB.Where("id = ?", id).First(&reader)
+	if result.RowsAffected == 0 {
+		return fmt.Errorf("设备不存在")
+	}
+
+	fmt.Printf("设备[%s]已停止读卡\n", reader.DeviceCode)
+	return nil
+}
+
+// ReadTag 读取标签(模拟实现)
+func (s *uhfService) ReadTag(id uint) (string, error) {
+	var reader dao.UHFReader
+	result := global.GVA_DB.Where("id = ?", id).First(&reader)
+	if result.RowsAffected == 0 {
+		return "", fmt.Errorf("设备不存在")
+	}
+
+	if reader.Status != "online" {
+		return "", fmt.Errorf("设备未连接")
+	}
+
+	return "", nil
+}