chore: 初始开源发布

iotlcm-openapi:对外 OpenAPI 网关(V3 接口 + 旧版兼容接口)。

- Go module:iotlcm-openapi → git.5iot.com/iotlcm-public/iotlcm-openapi(178 文件)
- 凭据与地址脱敏:JWT signingKey、MySQL DSN、Redis 口令、
  RabbitMQ DSN 全部改为 ${*} 占位;私网 IP → 文档地址段
- 7 处真实手机号 → 合法 11 位编造号
- 启动 banner 统一 IOTLCM 方块字 + 社区惯例署名
- 移除内部资产:CI 触发器
- Dockerfile 改用公共基础镜像,移除 GOPRIVATE 内网设置
- README 重写(原为 GoFrame 模板占位文案),补 Apache-2.0 LICENSE,
  LF 行尾 + .gitattributes
This commit is contained in:
MiFaZhan
2026-10-23 14:15:47 +08:00
commit 88dfe5c640
482 changed files with 34475 additions and 0 deletions
+322
View File
@@ -0,0 +1,322 @@
package oldApi
import (
"context"
"git.5iot.com/iotlcm-public/iotlcm-openapi/internal/dao"
"git.5iot.com/iotlcm-public/iotlcm-openapi/internal/library/xgorm/handler"
"git.5iot.com/iotlcm-public/iotlcm-openapi/internal/model"
"git.5iot.com/iotlcm-public/iotlcm-openapi/internal/model/entity"
"git.5iot.com/iotlcm-public/iotlcm-openapi/internal/service"
"strconv"
"strings"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/os/gtime"
)
type sOldApiQuery struct {
}
func NewOldApiQuery() *sOldApiQuery {
return &sOldApiQuery{}
}
func init() {
service.RegisterOldApiQuery(NewOldApiQuery())
}
func (s *sOldApiQuery) StatusConversion(simCardInfo entity.TSimCardInfo) int {
switch simCardInfo.BossCardStatus {
case 0:
return 8
case 1:
return 3
case 2:
return 4
case 4:
return 5
case 6:
return 2
case 7:
return 1
case 8:
return 6
case 9:
return 7
default:
return 8
}
}
func oldApiDate(times ...*gtime.Time) string {
for _, item := range times {
if item == nil || item.IsZero() {
continue
}
return item.Format("Y-m-d")
}
return ""
}
func oldApiEndOfDay(t *gtime.Time) *gtime.Time {
if t == nil || t.IsZero() {
return nil
}
return t.EndOfDay()
}
func oldApiEndOfDayString(t *gtime.Time) string {
if t == nil || t.IsZero() {
return ""
}
return t.EndOfDay().Format("Y-m-d H:i:s")
}
func oldApiScopedCardByIccid(ctx context.Context, iccid string) (card *entity.TSimCardInfo, err error) {
err = service.IotTSimCardInfo().
Model(ctx).
Where(dao.TSimCardInfo.Columns().Iccid, iccid).
Limit(1).
Scan(&card)
if err != nil {
return nil, err
}
if card == nil {
return nil, gerror.New("sim卡不存在")
}
return card, nil
}
func (s *sOldApiQuery) QuerySimCard(ctx context.Context, input *model.SimCardInfoInput) (output *model.SimCardInfoOutput, err error) {
input.Param.Type = strings.ToLower(strings.TrimSpace(input.Param.Type))
input.Param.Cardno = strings.TrimSpace(input.Param.Cardno)
if input.Param.Type == "" {
return nil, gerror.New("数据类型不能为空")
}
if input.Param.Cardno == "" {
return nil, gerror.New("值不能为空")
}
field := ""
if input.Param.Type == "iccid" {
field = dao.TSimCardInfo.Columns().Iccid
} else if input.Param.Type == "imsi" {
field = dao.TSimCardInfo.Columns().Imsi
} else if input.Param.Type == "msisdn" {
field = dao.TSimCardInfo.Columns().Msisdn
} else {
return nil, gerror.New("数据类型错误")
}
var out []model.TSimCardInfoListModel
sysDept := dao.SysDept.Table()
cardInfoTable := dao.TSimCardInfo.Table()
flowPackage := dao.TSimFlowPackageInfo.Table()
err = service.IotTSimCardInfo().
Model(ctx, &handler.Option{FilterAuth: false, FilterTenant: true}).
Where(field, input.Param.Cardno).
LeftJoin(sysDept, sysDept+"."+dao.SysDept.Columns().DeptId+"="+cardInfoTable+"."+dao.TSimCardInfo.Columns().DeptId).
LeftJoin(flowPackage, flowPackage+"."+dao.TSimFlowPackageInfo.Columns().PackageCode+"="+cardInfoTable+"."+dao.TSimCardInfo.Columns().CurrentPackageCode).
Fields(cardInfoTable + ".*," + sysDept + "." + dao.SysDept.Columns().DeptName + " as DeptName," + flowPackage + "." + dao.TSimFlowPackageInfo.Columns().PackageName + " as PackageName").
Limit(1).
Scan(&out)
if err != nil {
return nil, gerror.New("查询sim卡信息失败")
}
if len(out) == 0 {
return nil, gerror.New("sim卡不存在")
}
output = &model.SimCardInfoOutput{
Vid: strconv.FormatInt(out[0].Id, 10),
Msisdn: out[0].Msisdn,
Iccid: out[0].Iccid,
Imei: out[0].Imei,
Imsi: out[0].Imsi,
DeptName: out[0].DeptName,
StatusId: s.StatusConversion(entity.TSimCardInfo{
BossCardStatus: out[0].BossCardStatus,
}),
PackageId: out[0].CurrentPackageCode,
PackageName: out[0].PackageName,
Used: out[0].UsedFlowMb,
Remaining: out[0].PackageTotalFlowMb - out[0].UsedFlowMb,
Type: model.SimCardNameMap[out[0].CardType],
PacketArr: nil,
Remark: out[0].Remark,
Grouping: "",
DeliverDate: "",
ActivateDate: oldApiDate(out[0].BossActivateAt, out[0].BossOpenAt, out[0].FlowPkgBeginAt),
ExpireTime: oldApiEndOfDay(out[0].FlowPkgEndAt),
}
return output, nil
}
func (s *sOldApiQuery) QuerySimDataUsage(ctx context.Context, input *model.SimDataUsageOldInput) (output *model.SimDataUsageOldOutput, err error) {
input.Param.Iccid = strings.TrimSpace(input.Param.Iccid)
if input.Param.Iccid == "" {
return nil, gerror.New("iccid不能为空")
}
card, err := oldApiScopedCardByIccid(ctx, input.Param.Iccid)
if err != nil {
return nil, err
}
output = &model.SimDataUsageOldOutput{
UseUnit: "MB",
UseAmount: card.UsedFlowMb,
}
return output, nil
}
func (s *sOldApiQuery) QuerySimDataUsageMonthly(ctx context.Context, input *model.SimDataUsageMonthlyOldInput) (output *model.SimDataUsageMonthlyOldOutput, err error) {
input.Param.Iccid = strings.TrimSpace(input.Param.Iccid)
input.Param.DateTime = strings.TrimSpace(input.Param.DateTime)
if input.Param.Iccid == "" {
return nil, gerror.New("iccid不能为空")
}
if input.Param.DateTime == "" {
return nil, gerror.New("日期时间不能为空")
}
if _, err = oldApiScopedCardByIccid(ctx, input.Param.Iccid); err != nil {
return nil, err
}
simDataUsageMonthlyInput := &model.SimDataUsageMonthlyInput{
SimKeys: []*model.SimKey{
{
ICCID: input.Param.Iccid,
},
},
ReqData: model.SimDataUsageMonthlyInputItem{
QueryDate: input.Param.DateTime,
},
}
out, err := service.UpstreamChan().QuerySimDatausageMonthly(ctx, simDataUsageMonthlyInput)
if err != nil {
return nil, gerror.New("查询sim卡历史用量失败")
}
if len(out) == 0 {
return &model.SimDataUsageMonthlyOldOutput{
UseUnit: "MB",
UseAmount: 0,
}, nil
}
output = &model.SimDataUsageMonthlyOldOutput{
UseUnit: "MB",
UseAmount: out[0].ResData.DataAmount,
}
return output, nil
}
func (s *sOldApiQuery) QuerySimStatus(ctx context.Context, input *model.SimStatusOldInput) (output *model.SimStatusOldOutput, err error) {
input.Param.Iccid = strings.TrimSpace(input.Param.Iccid)
if input.Param.Iccid == "" {
return nil, gerror.New("iccid不能为空")
}
card, err := oldApiScopedCardByIccid(ctx, input.Param.Iccid)
if err != nil {
return nil, err
}
status := s.StatusConversion(*card)
output = &model.SimStatusOldOutput{
StatusMessage: model.SimCardStatusMap[status],
StatusCode: status,
}
return output, nil
}
func (s *sOldApiQuery) QuerySimSession(ctx context.Context, input *model.SimStatusOnlineOldInput) (output *model.SimStatusOnlineOldOutput, err error) {
input.Param.Iccid = strings.TrimSpace(input.Param.Iccid)
if input.Param.Iccid == "" {
return nil, gerror.New("iccid不能为空")
}
if _, err = oldApiScopedCardByIccid(ctx, input.Param.Iccid); err != nil {
return nil, err
}
simSessionInput := &model.SimSessionInput{
SimKeys: []*model.SimKey{
{
ICCID: input.Param.Iccid,
},
},
}
outSession, err := service.UpstreamChan().QuerySimSession(ctx, simSessionInput)
if err != nil {
return nil, gerror.New("查询sim卡会话失败")
}
if len(outSession) == 0 {
return &model.SimStatusOnlineOldOutput{
TypeName: "",
Imei: "",
Data: model.SimStatusOnlineOldData{},
StatusMessage: "",
StatusCode: 0,
}, nil
}
simStatusOnlineOldData := model.SimStatusOnlineOldData{
ApnId: outSession[0].ResData.ApnId,
Rat: outSession[0].ResData.Rat,
Ipv6: outSession[0].ResData.Ipv6,
Ip: outSession[0].ResData.Ipv4,
Ipv6Prefix: outSession[0].ResData.Ipv6Prefix,
Status: outSession[0].ResData.Status,
CreateDate: outSession[0].ResData.CreateTime,
}
output = &model.SimStatusOnlineOldOutput{
TypeName: "",
Imei: "",
Data: simStatusOnlineOldData,
StatusMessage: "",
StatusCode: 0,
}
return output, nil
}
func (s *sOldApiQuery) QueryCardInfoList(ctx context.Context, input *model.QueryCardInfoListInput) (output []model.QueryCardInfoListOutput, err error) {
iccids := make([]string, 0, len(input.Param.Iccid))
for _, iccid := range input.Param.Iccid {
iccid = strings.TrimSpace(iccid)
if iccid == "" {
continue
}
iccids = append(iccids, iccid)
}
if len(iccids) == 0 {
return nil, gerror.New("iccid不能为空")
}
if len(iccids) > 100 {
return nil, gerror.New("iccid数量不能超过100个")
}
entity := []entity.TSimCardInfo{}
if err := service.IotTSimCardInfo().
Model(ctx).
WhereIn(dao.TSimCardInfo.Columns().Iccid, iccids).
Scan(&entity); err != nil {
return nil, gerror.New("查询sim卡信息失败")
}
if len(entity) == 0 {
return nil, gerror.New("sim卡不存在")
}
output = make([]model.QueryCardInfoListOutput, 0, len(entity))
for _, item := range entity {
output = append(output, model.QueryCardInfoListOutput{
Iccid: item.Iccid,
ActivateDate: oldApiDate(item.BossActivateAt, item.BossOpenAt, item.FlowPkgBeginAt),
DueExpireTime: oldApiEndOfDayString(item.FlowPkgEndAt),
Imei: item.Imei,
Imsi: item.Imsi,
Msisdn: item.Msisdn,
Type: model.SimCardNameMap[item.CardType],
Remarks: item.Remark,
Status: s.StatusConversion(item),
})
}
return output, nil
}