开放接口
This commit is contained in:
@@ -10,6 +10,7 @@ import (
|
||||
"github.com/break/junhong_cmp_fiber/internal/model"
|
||||
"github.com/break/junhong_cmp_fiber/internal/model/dto"
|
||||
assetSvc "github.com/break/junhong_cmp_fiber/internal/service/asset"
|
||||
deviceSvc "github.com/break/junhong_cmp_fiber/internal/service/device"
|
||||
iotCardSvc "github.com/break/junhong_cmp_fiber/internal/service/iot_card"
|
||||
orderSvc "github.com/break/junhong_cmp_fiber/internal/service/order"
|
||||
packageSvc "github.com/break/junhong_cmp_fiber/internal/service/package"
|
||||
@@ -28,6 +29,7 @@ type Service struct {
|
||||
orderService *orderSvc.Service
|
||||
shopCommissionService *shopCommissionSvc.Service
|
||||
stopResumeService *iotCardSvc.StopResumeService
|
||||
deviceService *deviceSvc.Service
|
||||
iotCardStore *postgres.IotCardStore
|
||||
packageUsageStore *postgres.PackageUsageStore
|
||||
packageStore *postgres.PackageStore
|
||||
@@ -42,6 +44,7 @@ func New(
|
||||
orderService *orderSvc.Service,
|
||||
shopCommissionService *shopCommissionSvc.Service,
|
||||
stopResumeService *iotCardSvc.StopResumeService,
|
||||
deviceService *deviceSvc.Service,
|
||||
iotCardStore *postgres.IotCardStore,
|
||||
packageUsageStore *postgres.PackageUsageStore,
|
||||
packageStore *postgres.PackageStore,
|
||||
@@ -54,6 +57,7 @@ func New(
|
||||
orderService: orderService,
|
||||
shopCommissionService: shopCommissionService,
|
||||
stopResumeService: stopResumeService,
|
||||
deviceService: deviceService,
|
||||
iotCardStore: iotCardStore,
|
||||
packageUsageStore: packageUsageStore,
|
||||
packageStore: packageStore,
|
||||
@@ -302,6 +306,112 @@ func (s *Service) CreateWalletPackageOrders(ctx context.Context, req *dto.AgentO
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
// resolveOpenAPIDevice 将开放接口设备标识解析为当前代理可见的设备
|
||||
// 设备不存在或不属于代理管辖店铺时统一返回 CodeForbidden,避免信息泄露
|
||||
func (s *Service) resolveOpenAPIDevice(ctx context.Context, deviceNo string) (*model.Device, error) {
|
||||
identifier := strings.TrimSpace(deviceNo)
|
||||
if identifier == "" {
|
||||
return nil, errors.New(errors.CodeInvalidParam)
|
||||
}
|
||||
if s.deviceService == nil {
|
||||
return nil, errors.New(errors.CodeInternalError, "开放接口设备解析依赖未配置")
|
||||
}
|
||||
|
||||
device, err := s.deviceService.GetDeviceByIdentifier(ctx, identifier)
|
||||
if err != nil {
|
||||
return nil, errors.New(errors.CodeForbidden, "无权限操作该资源或资源不存在")
|
||||
}
|
||||
|
||||
if device.ShopID == nil {
|
||||
return nil, errors.New(errors.CodeForbidden, "无权限操作该资源或资源不存在")
|
||||
}
|
||||
|
||||
subordinateIDs := middleware.GetSubordinateShopIDs(ctx)
|
||||
found := false
|
||||
for _, id := range subordinateIDs {
|
||||
if id == *device.ShopID {
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
return nil, errors.New(errors.CodeForbidden, "无权限操作该资源或资源不存在")
|
||||
}
|
||||
|
||||
return device, nil
|
||||
}
|
||||
|
||||
// GetDeviceTraffic 查询开放接口设备套餐内流量
|
||||
func (s *Service) GetDeviceTraffic(ctx context.Context, req *dto.AgentOpenAPIDeviceQueryRequest) (*dto.AgentOpenAPIDeviceTrafficResponse, error) {
|
||||
device, err := s.resolveOpenAPIDevice(ctx, req.DeviceNo)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
activeStatus := constants.PackageUsageStatusActive
|
||||
pendingStatus := constants.PackageUsageStatusPending
|
||||
activeUsages, err := s.packageUsageStore.ListByCarrier(ctx, "device", device.ID, &activeStatus)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(errors.CodeInternalError, err, "查询生效套餐失败")
|
||||
}
|
||||
pendingUsages, err := s.packageUsageStore.ListByCarrier(ctx, "device", device.ID, &pendingStatus)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(errors.CodeInternalError, err, "查询待生效套餐失败")
|
||||
}
|
||||
|
||||
packageMap, seriesMap, err := s.loadUsagePackageContext(ctx, append(activeUsages, pendingUsages...))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
resp := &dto.AgentOpenAPIDeviceTrafficResponse{
|
||||
DeviceNo: req.DeviceNo,
|
||||
ActivePackages: make([]dto.AgentOpenAPIPackageTrafficItem, 0, len(activeUsages)),
|
||||
PendingPackages: make([]dto.AgentOpenAPIPackageTrafficItem, 0, len(pendingUsages)),
|
||||
}
|
||||
for _, usage := range activeUsages {
|
||||
item := s.buildTrafficItem(usage, packageMap, seriesMap, true)
|
||||
resp.ActivePackages = append(resp.ActivePackages, item)
|
||||
resp.ActiveTotalFlowMB += item.TotalFlowMB
|
||||
resp.ActiveUsedFlowMB += item.UsedFlowMB
|
||||
resp.ActiveRemainingFlowMB += item.RemainingFlowMB
|
||||
if item.ExpiresAt != nil && (resp.ActiveExpiresAt == nil || item.ExpiresAt.After(*resp.ActiveExpiresAt)) {
|
||||
resp.ActiveExpiresAt = item.ExpiresAt
|
||||
}
|
||||
}
|
||||
for _, usage := range pendingUsages {
|
||||
resp.PendingPackages = append(resp.PendingPackages, s.buildTrafficItem(usage, packageMap, seriesMap, false))
|
||||
}
|
||||
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
// SwitchDeviceCard 开放接口切网(多卡设备切换到指定 ICCID)
|
||||
func (s *Service) SwitchDeviceCard(ctx context.Context, req *dto.AgentOpenAPIDeviceSwitchCardRequest) error {
|
||||
if _, err := s.resolveOpenAPIDevice(ctx, req.DeviceNo); err != nil {
|
||||
return err
|
||||
}
|
||||
return s.deviceService.GatewaySwitchCard(ctx, req.DeviceNo, &dto.SwitchCardRequest{
|
||||
TargetICCID: req.ICCID,
|
||||
})
|
||||
}
|
||||
|
||||
// RebootDevice 开放接口重启设备
|
||||
func (s *Service) RebootDevice(ctx context.Context, req *dto.AgentOpenAPIDeviceOperationRequest) error {
|
||||
if _, err := s.resolveOpenAPIDevice(ctx, req.DeviceNo); err != nil {
|
||||
return err
|
||||
}
|
||||
return s.deviceService.GatewayRebootDevice(ctx, req.DeviceNo)
|
||||
}
|
||||
|
||||
// ResetDevice 开放接口恢复出厂设置
|
||||
func (s *Service) ResetDevice(ctx context.Context, req *dto.AgentOpenAPIDeviceOperationRequest) error {
|
||||
if _, err := s.resolveOpenAPIDevice(ctx, req.DeviceNo); err != nil {
|
||||
return err
|
||||
}
|
||||
return s.deviceService.GatewayResetDevice(ctx, req.DeviceNo)
|
||||
}
|
||||
|
||||
// resolveOpenAPICard 将开放接口卡标识解析为当前代理可见的 IoT 卡
|
||||
func (s *Service) resolveOpenAPICard(ctx context.Context, cardNo string) (*model.IotCard, error) {
|
||||
identifier := strings.TrimSpace(cardNo)
|
||||
|
||||
Reference in New Issue
Block a user