设备的部分改造
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m34s

This commit is contained in:
2026-03-10 10:34:08 +08:00
parent 86f8d0b644
commit b5147d1acb
34 changed files with 1680 additions and 485 deletions

View File

@@ -5,7 +5,6 @@ import (
"github.com/gofiber/fiber/v2"
"github.com/break/junhong_cmp_fiber/internal/gateway"
"github.com/break/junhong_cmp_fiber/internal/model/dto"
deviceService "github.com/break/junhong_cmp_fiber/internal/service/device"
"github.com/break/junhong_cmp_fiber/pkg/constants"
@@ -15,14 +14,12 @@ import (
)
type DeviceHandler struct {
service *deviceService.Service
gatewayClient *gateway.Client
service *deviceService.Service
}
func NewDeviceHandler(service *deviceService.Service, gatewayClient *gateway.Client) *DeviceHandler {
func NewDeviceHandler(service *deviceService.Service) *DeviceHandler {
return &DeviceHandler{
service: service,
gatewayClient: gatewayClient,
service: service,
}
}
@@ -55,13 +52,15 @@ func (h *DeviceHandler) GetByID(c *fiber.Ctx) error {
return response.Success(c, result)
}
func (h *DeviceHandler) GetByIMEI(c *fiber.Ctx) error {
imei := c.Params("imei")
if imei == "" {
return errors.New(errors.CodeInvalidParam, "设备号不能为空")
// GetByIdentifier 通过标识符查询设备详情
// GET /api/admin/devices/by-identifier/:identifier
func (h *DeviceHandler) GetByIdentifier(c *fiber.Ctx) error {
identifier := c.Params("identifier")
if identifier == "" {
return errors.New(errors.CodeInvalidParam, "设备标识符不能为空")
}
result, err := h.service.GetByDeviceNo(c.UserContext(), imei)
result, err := h.service.GetByIdentifier(c.UserContext(), identifier)
if err != nil {
return err
}
@@ -225,22 +224,14 @@ func (h *DeviceHandler) BatchSetSeriesBinding(c *fiber.Ctx) error {
}
// GetGatewayInfo 查询设备信息
// GET /api/admin/devices/by-identifier/:identifier/gateway-info
func (h *DeviceHandler) GetGatewayInfo(c *fiber.Ctx) error {
imei := c.Params("imei")
if imei == "" {
return errors.New(errors.CodeInvalidParam, "设备不能为空")
identifier := c.Params("identifier")
if identifier == "" {
return errors.New(errors.CodeInvalidParam, "设备标识符不能为空")
}
// 验证权限:查询数据库确认设备存在且用户有权限访问
_, err := h.service.GetByDeviceNo(c.UserContext(), imei)
if err != nil {
return errors.New(errors.CodeNotFound, "设备不存在或无权限访问")
}
// 调用 Gateway
resp, err := h.gatewayClient.GetDeviceInfo(c.UserContext(), &gateway.DeviceInfoReq{
DeviceID: imei,
})
resp, err := h.service.GatewayGetDeviceInfo(c.UserContext(), identifier)
if err != nil {
return err
}
@@ -249,22 +240,14 @@ func (h *DeviceHandler) GetGatewayInfo(c *fiber.Ctx) error {
}
// GetGatewaySlots 查询设备卡槽信息
// GET /api/admin/devices/by-identifier/:identifier/gateway-slots
func (h *DeviceHandler) GetGatewaySlots(c *fiber.Ctx) error {
imei := c.Params("imei")
if imei == "" {
return errors.New(errors.CodeInvalidParam, "设备不能为空")
identifier := c.Params("identifier")
if identifier == "" {
return errors.New(errors.CodeInvalidParam, "设备标识符不能为空")
}
// 验证权限:查询数据库确认设备存在且用户有权限访问
_, err := h.service.GetByDeviceNo(c.UserContext(), imei)
if err != nil {
return errors.New(errors.CodeNotFound, "设备不存在或无权限访问")
}
// 调用 Gateway
resp, err := h.gatewayClient.GetSlotInfo(c.UserContext(), &gateway.DeviceInfoReq{
DeviceID: imei,
})
resp, err := h.service.GatewayGetSlotInfo(c.UserContext(), identifier)
if err != nil {
return err
}
@@ -273,10 +256,11 @@ func (h *DeviceHandler) GetGatewaySlots(c *fiber.Ctx) error {
}
// SetSpeedLimit 设置设备限速
// PUT /api/admin/devices/by-identifier/:identifier/speed-limit
func (h *DeviceHandler) SetSpeedLimit(c *fiber.Ctx) error {
imei := c.Params("imei")
if imei == "" {
return errors.New(errors.CodeInvalidParam, "设备不能为空")
identifier := c.Params("identifier")
if identifier == "" {
return errors.New(errors.CodeInvalidParam, "设备标识符不能为空")
}
var req dto.SetSpeedLimitRequest
@@ -284,19 +268,7 @@ func (h *DeviceHandler) SetSpeedLimit(c *fiber.Ctx) error {
return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
}
// 验证权限:查询数据库确认设备存在且用户有权限访问
_, err := h.service.GetByDeviceNo(c.UserContext(), imei)
if err != nil {
return errors.New(errors.CodeNotFound, "设备不存在或无权限访问")
}
// 调用 Gateway
err = h.gatewayClient.SetSpeedLimit(c.UserContext(), &gateway.SpeedLimitReq{
DeviceID: imei,
UploadSpeed: req.UploadSpeed,
DownloadSpeed: req.DownloadSpeed,
})
if err != nil {
if err := h.service.GatewaySetSpeedLimit(c.UserContext(), identifier, &req); err != nil {
return err
}
@@ -304,27 +276,19 @@ func (h *DeviceHandler) SetSpeedLimit(c *fiber.Ctx) error {
}
// SetWiFi 设置设备 WiFi
// PUT /api/admin/devices/by-identifier/:identifier/wifi
func (h *DeviceHandler) SetWiFi(c *fiber.Ctx) error {
imei := c.Params("imei")
if imei == "" {
return errors.New(errors.CodeInvalidParam, "设备不能为空")
identifier := c.Params("identifier")
if identifier == "" {
return errors.New(errors.CodeInvalidParam, "设备标识符不能为空")
}
var req gateway.WiFiReq
var req dto.SetWiFiRequest
if err := c.BodyParser(&req); err != nil {
return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
}
// 验证权限:查询数据库确认设备存在且用户有权限访问
_, err := h.service.GetByDeviceNo(c.UserContext(), imei)
if err != nil {
return errors.New(errors.CodeNotFound, "设备不存在或无权限访问")
}
// 调用 Gateway
req.DeviceID = imei
err = h.gatewayClient.SetWiFi(c.UserContext(), &req)
if err != nil {
if err := h.service.GatewaySetWiFi(c.UserContext(), identifier, &req); err != nil {
return err
}
@@ -332,10 +296,11 @@ func (h *DeviceHandler) SetWiFi(c *fiber.Ctx) error {
}
// SwitchCard 切换设备使用的卡
// POST /api/admin/devices/by-identifier/:identifier/switch-card
func (h *DeviceHandler) SwitchCard(c *fiber.Ctx) error {
imei := c.Params("imei")
if imei == "" {
return errors.New(errors.CodeInvalidParam, "设备不能为空")
identifier := c.Params("identifier")
if identifier == "" {
return errors.New(errors.CodeInvalidParam, "设备标识符不能为空")
}
var req dto.SwitchCardRequest
@@ -343,18 +308,7 @@ func (h *DeviceHandler) SwitchCard(c *fiber.Ctx) error {
return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
}
// 验证权限:查询数据库确认设备存在且用户有权限访问
_, err := h.service.GetByDeviceNo(c.UserContext(), imei)
if err != nil {
return errors.New(errors.CodeNotFound, "设备不存在或无权限访问")
}
// 调用 Gateway
err = h.gatewayClient.SwitchCard(c.UserContext(), &gateway.SwitchCardReq{
DeviceID: imei,
TargetICCID: req.TargetICCID,
})
if err != nil {
if err := h.service.GatewaySwitchCard(c.UserContext(), identifier, &req); err != nil {
return err
}
@@ -362,23 +316,14 @@ func (h *DeviceHandler) SwitchCard(c *fiber.Ctx) error {
}
// RebootDevice 重启设备
// POST /api/admin/devices/by-identifier/:identifier/reboot
func (h *DeviceHandler) RebootDevice(c *fiber.Ctx) error {
imei := c.Params("imei")
if imei == "" {
return errors.New(errors.CodeInvalidParam, "设备不能为空")
identifier := c.Params("identifier")
if identifier == "" {
return errors.New(errors.CodeInvalidParam, "设备标识符不能为空")
}
// 验证权限:查询数据库确认设备存在且用户有权限访问
_, err := h.service.GetByDeviceNo(c.UserContext(), imei)
if err != nil {
return errors.New(errors.CodeNotFound, "设备不存在或无权限访问")
}
// 调用 Gateway
err = h.gatewayClient.RebootDevice(c.UserContext(), &gateway.DeviceOperationReq{
DeviceID: imei,
})
if err != nil {
if err := h.service.GatewayRebootDevice(c.UserContext(), identifier); err != nil {
return err
}
@@ -386,23 +331,14 @@ func (h *DeviceHandler) RebootDevice(c *fiber.Ctx) error {
}
// ResetDevice 恢复设备出厂设置
// POST /api/admin/devices/by-identifier/:identifier/reset
func (h *DeviceHandler) ResetDevice(c *fiber.Ctx) error {
imei := c.Params("imei")
if imei == "" {
return errors.New(errors.CodeInvalidParam, "设备不能为空")
identifier := c.Params("identifier")
if identifier == "" {
return errors.New(errors.CodeInvalidParam, "设备标识符不能为空")
}
// 验证权限:查询数据库确认设备存在且用户有权限访问
_, err := h.service.GetByDeviceNo(c.UserContext(), imei)
if err != nil {
return errors.New(errors.CodeNotFound, "设备不存在或无权限访问")
}
// 调用 Gateway
err = h.gatewayClient.ResetDevice(c.UserContext(), &gateway.DeviceOperationReq{
DeviceID: imei,
})
if err != nil {
if err := h.service.GatewayResetDevice(c.UserContext(), identifier); err != nil {
return err
}

View File

@@ -3,7 +3,6 @@ package admin
import (
"github.com/gofiber/fiber/v2"
"github.com/break/junhong_cmp_fiber/internal/gateway"
"github.com/break/junhong_cmp_fiber/internal/model/dto"
iotCardService "github.com/break/junhong_cmp_fiber/internal/service/iot_card"
"github.com/break/junhong_cmp_fiber/pkg/constants"
@@ -13,14 +12,12 @@ import (
)
type IotCardHandler struct {
service *iotCardService.Service
gatewayClient *gateway.Client
service *iotCardService.Service
}
func NewIotCardHandler(service *iotCardService.Service, gatewayClient *gateway.Client) *IotCardHandler {
func NewIotCardHandler(service *iotCardService.Service) *IotCardHandler {
return &IotCardHandler{
service: service,
gatewayClient: gatewayClient,
service: service,
}
}
@@ -136,16 +133,7 @@ func (h *IotCardHandler) GetGatewayStatus(c *fiber.Ctx) error {
return errors.New(errors.CodeInvalidParam, "ICCID不能为空")
}
// 验证权限:查询数据库确认卡存在且用户有权限访问
_, err := h.service.GetByICCID(c.UserContext(), iccid)
if err != nil {
return errors.New(errors.CodeNotFound, "卡不存在或无权限访问")
}
// 调用 Gateway
resp, err := h.gatewayClient.QueryCardStatus(c.UserContext(), &gateway.CardStatusReq{
CardNo: iccid,
})
resp, err := h.service.GatewayQueryCardStatus(c.UserContext(), iccid)
if err != nil {
return err
}
@@ -160,16 +148,7 @@ func (h *IotCardHandler) GetGatewayFlow(c *fiber.Ctx) error {
return errors.New(errors.CodeInvalidParam, "ICCID不能为空")
}
// 验证权限:查询数据库确认卡存在且用户有权限访问
_, err := h.service.GetByICCID(c.UserContext(), iccid)
if err != nil {
return errors.New(errors.CodeNotFound, "卡不存在或无权限访问")
}
// 调用 Gateway
resp, err := h.gatewayClient.QueryFlow(c.UserContext(), &gateway.FlowQueryReq{
CardNo: iccid,
})
resp, err := h.service.GatewayQueryFlow(c.UserContext(), iccid)
if err != nil {
return err
}
@@ -184,16 +163,7 @@ func (h *IotCardHandler) GetGatewayRealname(c *fiber.Ctx) error {
return errors.New(errors.CodeInvalidParam, "ICCID不能为空")
}
// 验证权限:查询数据库确认卡存在且用户有权限访问
_, err := h.service.GetByICCID(c.UserContext(), iccid)
if err != nil {
return errors.New(errors.CodeNotFound, "卡不存在或无权限访问")
}
// 调用 Gateway
resp, err := h.gatewayClient.QueryRealnameStatus(c.UserContext(), &gateway.CardStatusReq{
CardNo: iccid,
})
resp, err := h.service.GatewayQueryRealnameStatus(c.UserContext(), iccid)
if err != nil {
return err
}
@@ -208,16 +178,7 @@ func (h *IotCardHandler) GetRealnameLink(c *fiber.Ctx) error {
return errors.New(errors.CodeInvalidParam, "ICCID不能为空")
}
// 验证权限:查询数据库确认卡存在且用户有权限访问
_, err := h.service.GetByICCID(c.UserContext(), iccid)
if err != nil {
return errors.New(errors.CodeNotFound, "卡不存在或无权限访问")
}
// 调用 Gateway
link, err := h.gatewayClient.GetRealnameLink(c.UserContext(), &gateway.CardStatusReq{
CardNo: iccid,
})
link, err := h.service.GatewayGetRealnameLink(c.UserContext(), iccid)
if err != nil {
return err
}
@@ -232,17 +193,7 @@ func (h *IotCardHandler) StopCard(c *fiber.Ctx) error {
return errors.New(errors.CodeInvalidParam, "ICCID不能为空")
}
// 验证权限:查询数据库确认卡存在且用户有权限访问
_, err := h.service.GetByICCID(c.UserContext(), iccid)
if err != nil {
return errors.New(errors.CodeNotFound, "卡不存在或无权限访问")
}
// 调用 Gateway
err = h.gatewayClient.StopCard(c.UserContext(), &gateway.CardOperationReq{
CardNo: iccid,
})
if err != nil {
if err := h.service.GatewayStopCard(c.UserContext(), iccid); err != nil {
return err
}
@@ -256,17 +207,7 @@ func (h *IotCardHandler) StartCard(c *fiber.Ctx) error {
return errors.New(errors.CodeInvalidParam, "ICCID不能为空")
}
// 验证权限:查询数据库确认卡存在且用户有权限访问
_, err := h.service.GetByICCID(c.UserContext(), iccid)
if err != nil {
return errors.New(errors.CodeNotFound, "卡不存在或无权限访问")
}
// 调用 Gateway
err = h.gatewayClient.StartCard(c.UserContext(), &gateway.CardOperationReq{
CardNo: iccid,
})
if err != nil {
if err := h.service.GatewayStartCard(c.UserContext(), iccid); err != nil {
return err
}