|
|
@@ -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
|
|
|
+}
|