package outbound import ( "context" "strings" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/batchimport" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/batchinput/numrange" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/logic/iot/simcardbatch/common/cardsource" "github.com/gogf/gf/v2/errors/gerror" ) const maxRangeRows = 100000 func BuildRangeRows(ctx context.Context, rangeCodeType, startIccid, endIccid, startMsisdn, endMsisdn, startImsi, endImsi string) ([]batchimport.Row, error) { if isLegacyFullIdentityRange(rangeCodeType, startIccid, endIccid, startMsisdn, endMsisdn, startImsi, endImsi) { return buildFullIdentityRangeRows(ctx, startIccid, endIccid, startMsisdn, endMsisdn, startImsi, endImsi) } codeType, start, end, err := selectedRange(ctx, rangeCodeType, startIccid, endIccid, startMsisdn, endMsisdn, startImsi, endImsi) if err != nil { return nil, err } values, err := numrange.Build(ctx, start, end, strings.ToUpper(codeType), maxRangeRows) if err != nil { return nil, err } if len(values) == 0 { return nil, gerror.New("连号出库数据为空") } rows := make([]batchimport.Row, 0, len(values)) for i, value := range values { row := &Row{RowNo: i + 1, RangeCodeType: codeType} switch codeType { case "msisdn": row.Msisdn = value case "imsi": row.Imsi = value default: row.Iccid = value } rows = append(rows, row) } return rows, nil } func buildFullIdentityRangeRows(ctx context.Context, startIccid, endIccid, startMsisdn, endMsisdn, startImsi, endImsi string) ([]batchimport.Row, error) { return cardsource.BuildRangeRows(ctx, cardsource.RangeConfig{ StartIccid: startIccid, EndIccid: endIccid, StartMsisdn: startMsisdn, EndMsisdn: endMsisdn, StartImsi: startImsi, EndImsi: endImsi, MaxRows: maxRangeRows, EmptyMessage: "连号出库数据为空", OverLimitMessage: "连号出库数量不能超过%d条", CountMismatchMessage: "ICCID号段数量(%d)、MSISDN号段数量(%d)、IMSI号段数量(%d)必须一致", }, func(rowNo int, iccid, msisdn, imsi string) *Row { return &Row{ RowNo: rowNo, Iccid: iccid, Msisdn: msisdn, Imsi: imsi, } }) } func isLegacyFullIdentityRange(rangeCodeType, startIccid, endIccid, startMsisdn, endMsisdn, startImsi, endImsi string) bool { return strings.TrimSpace(rangeCodeType) == "" && strings.TrimSpace(startIccid) != "" && strings.TrimSpace(endIccid) != "" && strings.TrimSpace(startMsisdn) != "" && strings.TrimSpace(endMsisdn) != "" && strings.TrimSpace(startImsi) != "" && strings.TrimSpace(endImsi) != "" } func selectedRange(ctx context.Context, rangeCodeType, startIccid, endIccid, startMsisdn, endMsisdn, startImsi, endImsi string) (codeType, start, end string, err error) { _ = ctx codeType = normalizeRangeCodeType(rangeCodeType) if codeType == "" { codeType = inferRangeCodeType(startIccid, endIccid, startMsisdn, endMsisdn, startImsi, endImsi) } switch codeType { case "iccid": start, end = strings.TrimSpace(startIccid), strings.TrimSpace(endIccid) case "msisdn": start, end = strings.TrimSpace(startMsisdn), strings.TrimSpace(endMsisdn) case "imsi": start, end = strings.TrimSpace(startImsi), strings.TrimSpace(endImsi) default: return "", "", "", gerror.New("请选择连号号码类型") } if start == "" || end == "" { return "", "", "", gerror.Newf("%s起止号不能为空", strings.ToUpper(codeType)) } return codeType, start, end, nil } func normalizeRangeCodeType(value string) string { switch strings.ToLower(strings.TrimSpace(value)) { case "iccid", "iccids": return "iccid" case "msisdn", "msisdns": return "msisdn" case "imsi", "imsis": return "imsi" default: return "" } } func inferRangeCodeType(startIccid, endIccid, startMsisdn, endMsisdn, startImsi, endImsi string) string { complete := func(start, end string) bool { return strings.TrimSpace(start) != "" && strings.TrimSpace(end) != "" } switch { case complete(startIccid, endIccid): return "iccid" case complete(startMsisdn, endMsisdn): return "msisdn" case complete(startImsi, endImsi): return "imsi" default: return "" } }