@@ -391,214 +391,3 @@ func (s *Service) ListDevices(ctx context.Context, enterpriseID uint, req *dto.E
Total : total ,
} , nil
}
// ListDevicesForEnterprise 查询企业授权设备列表( H5企业用户)
func ( s * Service ) ListDevicesForEnterprise ( ctx context . Context , req * dto . EnterpriseDeviceListReq ) ( * dto . EnterpriseDeviceListResp , error ) {
enterpriseID := middleware . GetEnterpriseIDFromContext ( ctx )
if enterpriseID == 0 {
return nil , errors . New ( errors . CodeUnauthorized , "未授权访问" )
}
opts := postgres . DeviceAuthListOptions {
EnterpriseID : & enterpriseID ,
IncludeRevoked : false ,
Page : req . Page ,
PageSize : req . PageSize ,
}
auths , total , err := s . enterpriseDeviceAuthStore . ListByEnterprise ( ctx , opts )
if err != nil {
return nil , errors . Wrap ( errors . CodeInternalError , err , "查询授权记录失败" )
}
if len ( auths ) == 0 {
return & dto . EnterpriseDeviceListResp {
List : make ( [ ] dto . EnterpriseDeviceItem , 0 ) ,
Total : 0 ,
} , nil
}
deviceIDs := make ( [ ] uint , 0 , len ( auths ) )
authMap := make ( map [ uint ] * model . EnterpriseDeviceAuthorization )
for _ , auth := range auths {
deviceIDs = append ( deviceIDs , auth . DeviceID )
authMap [ auth . DeviceID ] = auth
}
var devices [ ] model . Device
query := s . db . WithContext ( ctx ) . Where ( "id IN ?" , deviceIDs )
if req . VirtualNo != "" {
query = query . Where ( "virtual_no LIKE ?" , "%" + req . VirtualNo + "%" )
}
if err := query . Find ( & devices ) . Error ; err != nil {
return nil , errors . Wrap ( errors . CodeInternalError , err , "查询设备信息失败" )
}
var bindings [ ] model . DeviceSimBinding
if err := s . db . WithContext ( ctx ) .
Where ( "device_id IN ? AND bind_status = 1" , deviceIDs ) .
Find ( & bindings ) . Error ; err != nil {
return nil , errors . Wrap ( errors . CodeInternalError , err , "查询设备绑定卡失败" )
}
cardCountMap := make ( map [ uint ] int )
for _ , binding := range bindings {
cardCountMap [ binding . DeviceID ] ++
}
items := make ( [ ] dto . EnterpriseDeviceItem , 0 , len ( devices ) )
for _ , device := range devices {
auth := authMap [ device . ID ]
items = append ( items , dto . EnterpriseDeviceItem {
DeviceID : device . ID ,
VirtualNo : device . VirtualNo ,
DeviceName : device . DeviceName ,
DeviceModel : device . DeviceModel ,
CardCount : cardCountMap [ device . ID ] ,
AuthorizedAt : auth . AuthorizedAt ,
} )
}
return & dto . EnterpriseDeviceListResp {
List : items ,
Total : total ,
} , nil
}
// GetDeviceDetail 获取设备详情( H5企业用户)
func ( s * Service ) GetDeviceDetail ( ctx context . Context , deviceID uint ) ( * dto . EnterpriseDeviceDetailResp , error ) {
enterpriseID := middleware . GetEnterpriseIDFromContext ( ctx )
if enterpriseID == 0 {
return nil , errors . New ( errors . CodeUnauthorized , "未授权访问" )
}
auth , err := s . enterpriseDeviceAuthStore . GetByDeviceID ( ctx , deviceID )
if err != nil || auth . EnterpriseID != enterpriseID || auth . RevokedAt != nil {
return nil , errors . New ( errors . CodeDeviceNotAuthorized , "设备未授权给此企业" )
}
var device model . Device
if err := s . db . WithContext ( ctx ) . Where ( "id = ?" , deviceID ) . First ( & device ) . Error ; err != nil {
return nil , errors . Wrap ( errors . CodeInternalError , err , "查询设备信息失败" )
}
var bindings [ ] model . DeviceSimBinding
if err := s . db . WithContext ( ctx ) .
Where ( "device_id = ? AND bind_status = 1" , deviceID ) .
Find ( & bindings ) . Error ; err != nil {
return nil , errors . Wrap ( errors . CodeInternalError , err , "查询设备绑定卡失败" )
}
cardIDs := make ( [ ] uint , 0 , len ( bindings ) )
for _ , binding := range bindings {
cardIDs = append ( cardIDs , binding . IotCardID )
}
var cards [ ] model . IotCard
cardInfos := make ( [ ] dto . DeviceCardInfo , 0 )
if len ( cardIDs ) > 0 {
if err := s . db . WithContext ( ctx ) . Where ( "id IN ?" , cardIDs ) . Find ( & cards ) . Error ; err != nil {
return nil , errors . Wrap ( errors . CodeInternalError , err , "查询卡信息失败" )
}
carrierIDs := make ( [ ] uint , 0 , len ( cards ) )
for _ , card := range cards {
carrierIDs = append ( carrierIDs , card . CarrierID )
}
var carriers [ ] model . Carrier
carrierMap := make ( map [ uint ] string )
if len ( carrierIDs ) > 0 {
if err := s . db . WithContext ( ctx ) . Where ( "id IN ?" , carrierIDs ) . Find ( & carriers ) . Error ; err == nil {
for _ , carrier := range carriers {
carrierMap [ carrier . ID ] = carrier . CarrierName
}
}
}
for _ , card := range cards {
cardInfos = append ( cardInfos , dto . DeviceCardInfo {
CardID : card . ID ,
ICCID : card . ICCID ,
MSISDN : card . MSISDN ,
CarrierName : carrierMap [ card . CarrierID ] ,
NetworkStatus : card . NetworkStatus ,
NetworkStatusName : constants . GetNetworkStatusName ( card . NetworkStatus ) ,
} )
}
}
return & dto . EnterpriseDeviceDetailResp {
Device : dto . EnterpriseDeviceInfo {
DeviceID : device . ID ,
VirtualNo : device . VirtualNo ,
DeviceName : device . DeviceName ,
DeviceModel : device . DeviceModel ,
DeviceType : device . DeviceType ,
AuthorizedAt : auth . AuthorizedAt ,
} ,
Cards : cardInfos ,
} , nil
}
func ( s * Service ) SuspendCard ( ctx context . Context , deviceID , cardID uint , req * dto . DeviceCardOperationReq ) ( * dto . DeviceCardOperationResp , error ) {
if err := s . validateCardOperation ( ctx , deviceID , cardID ) ; err != nil {
return nil , err
}
if err := s . db . WithContext ( ctx ) . Model ( & model . IotCard { } ) .
Where ( "id = ?" , cardID ) .
Update ( "network_status" , 0 ) . Error ; err != nil {
return nil , errors . Wrap ( errors . CodeInternalError , err , "停机操作失败" )
}
return & dto . DeviceCardOperationResp {
Success : true ,
Message : "停机成功" ,
} , nil
}
func ( s * Service ) ResumeCard ( ctx context . Context , deviceID , cardID uint , req * dto . DeviceCardOperationReq ) ( * dto . DeviceCardOperationResp , error ) {
if err := s . validateCardOperation ( ctx , deviceID , cardID ) ; err != nil {
return nil , err
}
if err := s . db . WithContext ( ctx ) . Model ( & model . IotCard { } ) .
Where ( "id = ?" , cardID ) .
Update ( "network_status" , 1 ) . Error ; err != nil {
return nil , errors . Wrap ( errors . CodeInternalError , err , "复机操作失败" )
}
return & dto . DeviceCardOperationResp {
Success : true ,
Message : "复机成功" ,
} , nil
}
func ( s * Service ) validateCardOperation ( ctx context . Context , deviceID , cardID uint ) error {
enterpriseID := middleware . GetEnterpriseIDFromContext ( ctx )
if enterpriseID == 0 {
return errors . New ( errors . CodeUnauthorized , "未授权访问" )
}
auth , err := s . enterpriseDeviceAuthStore . GetByDeviceID ( ctx , deviceID )
if err != nil || auth . EnterpriseID != enterpriseID || auth . RevokedAt != nil {
return errors . New ( errors . CodeDeviceNotAuthorized , "设备未授权给此企业" )
}
var binding model . DeviceSimBinding
if err := s . db . WithContext ( ctx ) .
Where ( "device_id = ? AND iot_card_id = ? AND bind_status = 1" , deviceID , cardID ) .
First ( & binding ) . Error ; err != nil {
return errors . New ( errors . CodeForbidden , "卡不属于该设备" )
}
var cardAuth model . EnterpriseCardAuthorization
if err := s . db . WithContext ( ctx ) .
Where ( "enterprise_id = ? AND card_id = ? AND device_auth_id IS NOT NULL AND revoked_at IS NULL" , enterpriseID , cardID ) .
First ( & cardAuth ) . Error ; err != nil {
return errors . New ( errors . CodeForbidden , "无权操作此卡" )
}
return nil
}