Files
iotlcm/upstream-proxy/internal/logic/simKeyFill/simKeyFill.go

194 lines
5.8 KiB
Go

package simKeyFill
import (
"context"
"encoding/json"
"strings"
"git.5iot.com/iotlcm-public/iotlcm-upstream-proxy/internal/dao"
"git.5iot.com/iotlcm-public/iotlcm-upstream-proxy/internal/model"
"git.5iot.com/iotlcm-public/iotlcm-upstream-proxy/internal/model/entity"
"git.5iot.com/iotlcm-public/iotlcm-upstream-proxy/internal/service"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
)
type sSimKeyFill struct {
}
func NewSimKeyFill() *sSimKeyFill {
return &sSimKeyFill{}
}
func init() {
service.RegisterSimKeyFill(NewSimKeyFill())
}
func (s *sSimKeyFill) SimKeyFill(ctx context.Context, input *model.SimBaseReqJson) (output model.SimBaseResJson, err error) {
var operation struct {
OperationID string `json:"operationId"`
}
request := g.RequestFromCtx(ctx)
if request != nil && (request.URL.Path == "/sim/change/sim-apn" || request.URL.Path == "/sim/query/sim-apn-capability") && json.Unmarshal(input.ReqData, &operation) == nil && operation.OperationID != "" {
if len(input.SimKeys) == 0 || len(input.SimKeys) > 100 {
return nil, gerror.New("异步子任务卡数必须在1至100之间")
}
for _, key := range input.SimKeys {
if key == nil || key.ChanKey == "" || key.ICCID == "" {
return nil, gerror.New("异步子任务必须保留chanKey和ICCID快照")
}
}
return service.UpstreamAPI().SimBase(ctx, input)
}
simKeys, err := s.batchGetSimKey(ctx, input.SimKeys)
if err != nil {
return nil, err
}
if len(simKeys) == 0 {
g.Log().Debug(ctx, "SimKeyFill.batchGetSimKey, simKeys is empty, input %+v", input)
return nil, gerror.New("simKeys is empty")
}
input.SimKeys = simKeys
output, err = service.UpstreamAPI().SimBase(ctx, input)
if err != nil {
return nil, err
}
return
}
func (s *sSimKeyFill) batchGetSimKey(ctx context.Context, inputs []*model.SimKey) ([]*model.SimKey, error) {
queryICCIDKey := "sim:code:iccid:"
queryMSISDNKey := "sim:code:msisdn:"
queryIMSIKey := "sim:code:imsi:"
if len(inputs) == 0 {
g.Log().Debugf(ctx, "SimKeyFill.batchGetSimKey, The parameter is empty, inputs %+v", inputs)
return nil, gerror.New("参数不能为空")
}
var redisKeys []string
var dbKeys []string
simKeys := []*model.SimKey{}
// 设置Redis查询Key
for _, in := range inputs {
switch {
case in.ICCID != "":
key := queryICCIDKey + in.ICCID
redisKeys = append(redisKeys, key)
case in.MSISDN != "":
key := queryMSISDNKey + in.MSISDN
redisKeys = append(redisKeys, key)
case in.IMSI != "":
key := queryIMSIKey + in.IMSI
redisKeys = append(redisKeys, key)
default:
g.Log().Debugf(ctx, "SimKeyFill.batchGetSimKey, The parameter is empty, inputs %+v", inputs)
return nil, gerror.New("iccid/msisdn/imsi至少一个不能为空")
}
}
// 查询Redis数据
g.Log().Info(ctx, "SimKeyFill.batchGetSimKey, query redis")
vals, err := g.Redis().MGet(ctx, redisKeys...)
if err != nil {
g.Log().Debug(ctx, "SimKeyFill.batchGetSimKey, query redis error %+v, redisKeys %+v, inputs %+v", err, redisKeys, inputs)
} else {
// 解析Redis数据
for _, key := range redisKeys {
simKey := new(model.SimKey)
err := vals[key].Struct(&simKey)
if err != nil {
g.Log().Debug(ctx, "SimKeyFill.batchGetSimKey, unmarshalValue error %+v, key %s, inputs %+v", err, key, inputs)
dbKeys = append(dbKeys, key)
continue
}
simKeys = append(simKeys, simKey)
}
}
g.Log().Info(ctx, "SimKeyFill.batchGetSimKey, query db")
if len(dbKeys) > 0 {
// 解析数据库查询Key
var dbIccid []string
var dbMsisdn []string
var dbImsi []string
for _, key := range dbKeys {
keySplit := strings.Split(key, ":")
if len(keySplit) != 4 {
g.Log().Debug(ctx, "SimKeyFill.batchGetSimKey, Error in splicing data, key %s, keySplit %v", key, keySplit)
continue
}
switch keySplit[2] {
case "iccid":
dbIccid = append(dbIccid, keySplit[3])
case "msisdn":
dbMsisdn = append(dbMsisdn, keySplit[3])
case "imsi":
dbImsi = append(dbImsi, keySplit[3])
}
}
mod := dao.TSimCardInfo.Ctx(ctx)
if len(dbIccid) > 0 {
mod = mod.WhereOrIn(dao.TSimCardInfo.Columns().Iccid, dbIccid)
}
if len(dbMsisdn) > 0 {
mod = mod.WhereOrIn(dao.TSimCardInfo.Columns().Msisdn, dbMsisdn)
}
if len(dbImsi) > 0 {
mod = mod.WhereOrIn(dao.TSimCardInfo.Columns().Imsi, dbImsi)
}
// 查询数据库数据
var simInfos []*entity.TSimCardInfo
err = mod.Scan(&simInfos)
if err != nil {
g.Log().Error(ctx, "SimKeyFill.batchGetSimKey, query db error %+v, dbKeys %+v, inputs %+v", err, dbKeys, inputs)
return nil, gerror.New("查询数据库数据失败")
}
if len(simInfos) == 0 {
g.Log().Debug(ctx, "SimKeyFill.batchGetSimKey, simInfos is empty, dbKeys %+v, inputs %+v", dbKeys, inputs)
return nil, gerror.New("卡信息不存在")
}
// 整理卡信息
simInfoMap := make(map[string]*model.SimKey)
for _, SimInfo := range simInfos {
simInfoMap[queryICCIDKey+SimInfo.Iccid] = &model.SimKey{
ICCID: SimInfo.Iccid,
MSISDN: SimInfo.Msisdn,
IMSI: SimInfo.Imsi,
}
simInfoMap[queryMSISDNKey+SimInfo.Msisdn] = &model.SimKey{
MSISDN: SimInfo.Msisdn,
IMSI: SimInfo.Imsi,
ICCID: SimInfo.Iccid,
}
simInfoMap[queryIMSIKey+SimInfo.Imsi] = &model.SimKey{
IMSI: SimInfo.Imsi,
ICCID: SimInfo.Iccid,
MSISDN: SimInfo.Msisdn,
}
}
// 新建一个线程,进行Redis数据存储
go s.SetRedis(ctx, simInfoMap)
// 解析数据库数据
for _, info := range dbKeys {
simKeys = append(simKeys, simInfoMap[info])
}
}
return simKeys, nil
}
func (s *sSimKeyFill) SetRedis(ctx context.Context, simInfoMap map[string]*model.SimKey) {
for key, simKey := range simInfoMap {
_, err := g.Redis().Set(ctx, key, *simKey)
if err != nil {
g.Log().Debugf(ctx, "SimKeyFill.batchGetSimKey, Set error %+v, key %s, simKey %+v", err, key, simKey)
continue
}
}
}