package iot import ( "context" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/dao" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/contexts" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/xgorm/handler" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/frame/g" "strings" ) type legacyDiagnoseCard struct { ICCID string `orm:"iccid"` IMSI string `orm:"imsi"` MSISDN string `orm:"msisdn"` ChannelKey string `orm:"channel_id"` } func queryLegacyDiagnoseCard(ctx context.Context, code string) (*legacyDiagnoseCard, error) { code = strings.TrimSpace(code) if code == "" { return nil, nil } if strings.TrimSpace(g.Cfg().MustGet(ctx, "database.legacyCard.link").String()) == "" { return nil, gerror.New("旧平台只读数据库未配置") } var cards []*legacyDiagnoseCard err := g.DB("legacyCard").Model("yz_card_info c").Ctx(ctx). InnerJoin("yz_card_route r", "r.cd_id = c.channel_id"). Fields("c.iccid,c.imsi,c.msisdn,r.cd_id AS channel_id"). Where("c.iccid = ? OR c.msisdn = ? OR c.imsi = ?", code, code, code). Limit(2).Scan(&cards) if err != nil { return nil, gerror.New("旧平台卡信息查询失败,请稍后重试") } if len(cards) > 1 { return nil, gerror.New("卡号对应多张卡,无法确定通道") } if len(cards) == 0 || strings.TrimSpace(cards[0].ChannelKey) == "" { return nil, nil } return cards[0], nil } func resolveLegacyDiagnoseCardInfo(ctx context.Context, code string) (*tSimDiagnoseCardInfo, error) { if contexts.GetUserId(ctx) <= 0 || strings.TrimSpace(contexts.GetTenantId(ctx)) == "" { return nil, gerror.New("请先登录") } columns := dao.TSimCardInfo.Columns() count, err := dao.TSimCardInfo.Ctx(ctx).Where(columns.TenantId, contexts.GetTenantId(ctx)). Where("("+columns.Iccid+" = ? OR "+columns.Msisdn+" = ? OR "+columns.Imsi+" = ?)", code, code, code).Count() if err != nil { return nil, gerror.Wrap(err, "检查卡片访问范围失败") } if count > 0 { return nil, gerror.New("卡片不存在或无权诊断") } card, err := queryLegacyDiagnoseCard(ctx, code) if err != nil || card == nil { return nil, err } channelColumns := dao.TSimChannels.Columns() var channel *struct { ChanKey string `orm:"chan_key"` TempKey string `orm:"temp_key"` ChanStatus int `orm:"chan_status"` } err = handler.Model(dao.TSimChannels.Ctx(ctx).Fields(channelColumns.ChanKey, channelColumns.TempKey, channelColumns.ChanStatus, channelColumns.CreatedBy, channelColumns.CreatedDept)). Where(channelColumns.TenantId, contexts.GetTenantId(ctx)). Where(channelColumns.ChanKey, card.ChannelKey).Limit(1).Scan(&channel) if err != nil { return nil, gerror.Wrap(err, "查询诊断通道失败") } if channel == nil || channel.ChanKey == "" || channel.TempKey == "" { return nil, gerror.New("旧平台卡片已找到,但当前账号无可用的对应通道") } if channel.ChanStatus != 0 { return nil, gerror.New("卡对应的上游通道已停用") } return &tSimDiagnoseCardInfo{Iccid: card.ICCID, Imsi: card.IMSI, Msisdn: card.MSISDN, ChanKey: channel.ChanKey, TempKey: channel.TempKey}, nil }