// Package gen // @Link https://github.com/xiujiecn/xiu-admin // @Copyright Copyright (c) 2026 LiXiujie // @Author Lxj // @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE // @AutoGenerate Version package iot import ( "context" "database/sql" "errors" "fmt" "math" "sort" "strings" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/consts" "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" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/xgorm/handler" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/xgorm/hook" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/logic/iot/simcardbatch/addpackage" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model/entity" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/service" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/utility/convert" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/utility/excel" "github.com/gogf/gf/v2/database/gdb" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" "github.com/gogf/gf/v2/os/gctx" "github.com/gogf/gf/v2/os/gtime" "github.com/gogf/gf/v2/util/gconv" ) type sIotTSimCardBindPkg struct{} func NewIotTSimCardBindPkg() *sIotTSimCardBindPkg { return &sIotTSimCardBindPkg{} } func init() { service.RegisterIotTSimCardBindPkg(NewIotTSimCardBindPkg()) } // Model 订购表ORM模型 func (s *sIotTSimCardBindPkg) Model(ctx context.Context, option ...*handler.Option) *gdb.Model { if len(option) == 0 { option = append(option, &handler.Option{ FilterTenant: true, FilterAuth: true, }) } return handler.Model(dao.TSimCardBindPkg.Ctx(ctx), option...) } // List 获取订购表列表 func (s *sIotTSimCardBindPkg) List(ctx context.Context, in *model.TSimCardBindPkgListParam) (list []*model.TSimCardBindPkgListModel, totalCount int, err error) { mod := s.Model(ctx) bindPackage := dao.TSimCardBindPkg.Table() packageInfo := dao.TSimFlowPackageInfo.Table() // 先构建 Join mod = mod.LeftJoin(packageInfo, bindPackage+"."+dao.TSimCardBindPkg.Columns().PackageCode+" = "+packageInfo+"."+dao.TSimFlowPackageInfo.Columns().PackageCode) // 字段过滤(包含主表字段 + joined 表字段) mod = mod.FieldsPrefix(bindPackage, model.TSimCardBindPkgListModel{}) mod = mod.Fields(packageInfo + ".package_name as packageName") mod = mod.WhereIn(dao.TSimCardBindPkg.Columns().PackageType, []int{101, 102}) // 查询主键ID if in.Id > 0 { mod = mod.Where(dao.TSimCardBindPkg.Columns().Id, in.Id) } // 查询ICCID if in.Iccid != "" { mod = mod.Where(dao.TSimCardBindPkg.Columns().Iccid, in.Iccid) } // 查询订购状态 枚举 if in.EffectiveStatus > 0 { mod = mod.Where(dao.TSimCardBindPkg.Columns().EffectiveStatus, in.EffectiveStatus) } // 查询类型 枚举 if in.BusinessType != nil { mod = mod.Where(dao.TSimCardBindPkg.Columns().BusinessType, *in.BusinessType) } // 查询创建时间 if len(in.CreatedAt) == 2 { in.CreatedAt[1] = in.CreatedAt[1].EndOfDay() } if len(in.CreatedAt) == 2 { mod = mod.WhereBetween(dao.TSimCardBindPkg.Columns().CreatedAt, in.CreatedAt[0], in.CreatedAt[1]) } // 分页 mod = mod.Page(in.Page, in.PageSize) // 排序 mod = mod.OrderDesc(dao.TSimCardBindPkg.Columns().Id) // 操作人摘要信息 mod = mod.Hook(hook.MemberSummary) // 查询数据 if err = mod.ScanAndCount(&list, &totalCount, false); err != nil { err = gerror.Wrap(err, "获取订购表列表失败,请稍后重试!") return } return } // Export 导出订购表 func (s *sIotTSimCardBindPkg) Export(ctx context.Context, in *model.TSimCardBindPkgListParam) (err error) { list, totalCount, err := s.List(ctx, in) if err != nil { return } // 字段的排序是依据tags的字段顺序,如果你不想使用默认的排序方式,可以直接定义 tags = []string{"字段名称", "字段名称2", ...} tags, err := convert.GetEntityDescTags(model.TSimCardBindPkgExportModel{}) if err != nil { return } var ( fileName = "导出订购表-" + gctx.CtxId(ctx) sheetName = fmt.Sprintf("索引条件共%v行,共%v页,当前导出是第%v页,本页共%v行", totalCount, (totalCount+in.PageSize-1)/in.PageSize, in.Page, len(list)) exports []model.TSimCardBindPkgExportModel ) if err = gconv.Scan(list, &exports); err != nil { return } err = excel.ExportByStructs(ctx, tags, exports, fileName, sheetName) return } // Edit 修改/新增订购表 func (s *sIotTSimCardBindPkg) Edit(ctx context.Context, in *model.TSimCardBindPkgEditParam) (err error) { // 验证'SubscriptionNo'唯一 if err = xgorm.IsUnique(ctx, &dao.TSimCardBindPkg, g.Map{dao.TSimCardBindPkg.Columns().SubscriptionNo: in.SubscriptionNo}, "订购记录编号已存在", in.Id); err != nil { return } return g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) (err error) { // 修改 if in.Id > 0 { updatedBy := contexts.GetUserId(ctx) in.UpdatedBy = &updatedBy in.UpdatedAt = gtime.Now() if _, err = s.Model(ctx). Fields(model.TSimCardBindPkgUpdateFields{}). WherePri(in.Id).Data(in).Update(); err != nil { err = gerror.Wrap(err, "修改订购表失败,请稍后重试!") } return } // 新增 tenantId := contexts.GetTenantId(ctx) in.TenantId = &tenantId createdDept := contexts.GetDeptId(ctx) in.CreatedDept = &createdDept createdBy := contexts.GetUserId(ctx) in.CreatedBy = &createdBy in.CreatedAt = gtime.Now() if _, err = s.Model(ctx, &handler.Option{FilterAuth: false}). Fields(model.TSimCardBindPkgInsertFields{}). Data(in).Insert(); err != nil { err = gerror.Wrap(err, "新增订购表失败,请稍后重试!") } return }) } // Delete 删除订购表 func (s *sIotTSimCardBindPkg) Delete(ctx context.Context, in *model.TSimCardBindPkgDeleteParam) (err error) { if _, err = s.Model(ctx).WherePri(in.Id).Unscoped().Delete(); err != nil { err = gerror.Wrap(err, "删除订购表失败,请稍后重试!") return } return } // View 获取订购表指定信息 func (s *sIotTSimCardBindPkg) View(ctx context.Context, in *model.TSimCardBindPkgViewParam) (res *model.TSimCardBindPkgViewModel, err error) { if err = s.Model(ctx).WherePri(in.Id).Hook(hook.MemberSummary).Scan(&res); err != nil { err = gerror.Wrap(err, "获取订购表信息,请稍后重试!") return } return } // AddPackagePaymentContext 获取当前组织的加油包支付上下文。 func (s *sIotTSimCardBindPkg) AddPackagePaymentContext(ctx context.Context) (*model.TSimAddPackageOptionsRes, error) { return queryAddPackagePaymentContext(ctx) } // AddPackageOptions 获取当前卡共同可订购的加油包套餐。 func (s *sIotTSimCardBindPkg) AddPackageOptions(ctx context.Context, in *model.TSimCardAddPackageOptionsParam) (*model.TSimAddPackageOptionsRes, error) { if in == nil || len(in.Iccids) == 0 { return nil, gerror.New("ICCID不能为空") } iccids := uniqueNonEmptyStrings(in.Iccids) if len(iccids) == 0 { return nil, gerror.New("ICCID不能为空") } cardColumns := dao.TSimCardInfo.Columns() var cards []struct { Iccid string `orm:"iccid"` PackageStatus int `orm:"package_status"` DeptId int64 `orm:"dept_id"` } if err := handler.Model(dao.TSimCardInfo.Ctx(ctx), &handler.Option{FilterTenant: true, FilterAuth: true}). Fields(cardColumns.Iccid, cardColumns.PackageStatus, cardColumns.TenantId, cardColumns.DeptId, cardColumns.CreatedDept, cardColumns.CreatedBy). WhereIn(cardColumns.Iccid, iccids). Scan(&cards); err != nil { return nil, gerror.Wrap(err, "查询卡信息失败") } cardMap := make(map[string]int64, len(cards)) for _, card := range cards { code := strings.TrimSpace(card.Iccid) if code == "" { continue } if card.PackageStatus != consts.PackageStatusEffective { return nil, gerror.Newf("ICCID %s 当前套餐未生效,不能订购加油包", code) } if card.DeptId <= 0 { return nil, gerror.Newf("ICCID %s 未绑定客户组织", code) } cardMap[code] = card.DeptId } for _, code := range iccids { if _, ok := cardMap[code]; !ok { return nil, gerror.Newf("ICCID %s 不存在或无权限", code) } } if err := ensureNoActiveCardTopupPackages(ctx, iccids); err != nil { return nil, err } isTopDept, _, err := service.AgentDept().IsTopDept(ctx) if err != nil { return nil, gerror.Wrap(err, "判断当前组织类型失败") } availableBalance, err := queryAddPackageAvailableBalance(ctx, contexts.GetDeptId(ctx)) if err != nil { return nil, err } bindColumns := dao.TSimCardBindPkg.Columns() var binds []struct { Iccid string `orm:"iccid"` PackageCode string `orm:"package_code"` ExpectedExpireTime *gtime.Time `orm:"expected_expire_time"` } if err := handler.Model(dao.TSimCardBindPkg.Ctx(ctx), &handler.Option{FilterTenant: true, FilterAuth: true}). Fields(bindColumns.Iccid, bindColumns.PackageCode, bindColumns.ExpectedExpireTime, bindColumns.TenantId, bindColumns.DeptId, bindColumns.CreatedDept, bindColumns.CreatedBy). WhereIn(bindColumns.Iccid, iccids). WhereIn(bindColumns.PackageType, []int{consts.PackageTypeCard, consts.PackageTypePool}). Where(bindColumns.EffectiveStatus, consts.EffectiveStatusEffective). OrderDesc(bindColumns.ExpectedExpireTime). OrderDesc(bindColumns.Id). Scan(&binds); err != nil { return nil, gerror.Wrap(err, "查询卡基础套餐失败") } baseCodes := make(map[string]string, len(iccids)) for _, bind := range binds { iccid := strings.TrimSpace(bind.Iccid) if _, exists := baseCodes[iccid]; exists { continue } if bind.ExpectedExpireTime != nil && !bind.ExpectedExpireTime.After(gtime.Now()) { continue } baseCodes[iccid] = strings.TrimSpace(bind.PackageCode) } for _, code := range iccids { if baseCodes[code] == "" { return nil, gerror.Newf("ICCID %s 当前没有正在生效中的基础套餐", code) } } packageCodes := make([]string, 0, len(baseCodes)) for _, code := range baseCodes { packageCodes = append(packageCodes, code) } packageColumns := dao.TSimFlowPackageInfo.Columns() var packages []*entity.TSimFlowPackageInfo if err := handler.Model(dao.TSimFlowPackageInfo.Ctx(ctx), &handler.Option{FilterTenant: true, FilterAuth: false}). Fields(packageColumns.PackageCode, packageColumns.TopupPackageCodes). WhereIn(packageColumns.PackageCode, uniqueNonEmptyStrings(packageCodes)). Scan(&packages); err != nil { return nil, gerror.Wrap(err, "查询基础套餐配置失败") } packageMap := make(map[string]*entity.TSimFlowPackageInfo, len(packages)) for _, pkg := range packages { if pkg != nil { packageMap[strings.TrimSpace(pkg.PackageCode)] = pkg } } var commonCodes map[string]struct{} for _, code := range iccids { base := packageMap[baseCodes[code]] if base == nil { return nil, gerror.Newf("基础套餐不存在:%s", baseCodes[code]) } allowed := make(map[string]struct{}) for _, topupCode := range packageCodesFromJSON(base.TopupPackageCodes) { allowed[topupCode] = struct{}{} } if len(allowed) == 0 { return nil, gerror.Newf("基础套餐未配置可购加油包:%s", baseCodes[code]) } if commonCodes == nil { commonCodes = allowed continue } for candidate := range commonCodes { if _, ok := allowed[candidate]; !ok { delete(commonCodes, candidate) } } } if len(commonCodes) == 0 { return nil, gerror.New("所选卡没有共同可购的加油包套餐") } var addPackages []*entity.TSimFlowPackageInfo if err := handler.Model(dao.TSimFlowPackageInfo.Ctx(ctx), &handler.Option{FilterTenant: true, FilterAuth: false}). Fields( packageColumns.PackageCode, packageColumns.PackageName, packageColumns.FlowMb, packageColumns.CostPrice, packageColumns.TerminalCost, packageColumns.SysDefaultRatio, packageColumns.SysDefaultProfit, packageColumns.SysDefaultTerminalRatio, packageColumns.SysDefaultTerminalProfit, ). WhereIn(packageColumns.PackageCode, mapKeys(commonCodes)). Where(packageColumns.PackageType, consts.PackageTypeCardAddPackage). Where(packageColumns.Enabled, 1). OrderAsc(packageColumns.SortNo). Scan(&addPackages); err != nil { return nil, gerror.Wrap(err, "查询单卡加油包套餐失败") } items := make([]*model.TSimAddPackageOptionModel, 0, len(addPackages)) for _, pkg := range addPackages { if pkg == nil { continue } var totalAmount float64 var unitPrice float64 priceAvailable := true uniformPrice := true paymentAccounts := make(map[int64]*model.TSimAddPackagePaymentAccountModel) for index, iccid := range iccids { customerDeptID := cardMap[iccid] priceOwnerDeptID, err := loadPackagePriceParentDeptID(ctx, nil, contexts.GetTenantId(ctx), customerDeptID) if err != nil { return nil, err } salePrice, err := resolvePackageEffectiveSalePrice( ctx, nil, contexts.GetTenantId(ctx), priceOwnerDeptID, customerDeptID, packagePriceSourceFromEntity(pkg), ) if err != nil { priceAvailable = false break } if index == 0 { unitPrice = salePrice.AgentShipmentPrice } else if math.Abs(unitPrice-salePrice.AgentShipmentPrice) > 0.0001 { uniformPrice = false } totalAmount = roundAmount(totalAmount + salePrice.AgentShipmentPrice) account := paymentAccounts[customerDeptID] if account == nil { balance, err := queryAddPackageAvailableBalance(ctx, customerDeptID) if err != nil { return nil, err } account = &model.TSimAddPackagePaymentAccountModel{ PayerDeptId: customerDeptID, AvailableBalance: balance, } paymentAccounts[customerDeptID] = account } account.TargetCount++ account.RequiredAmount = roundAmount(account.RequiredAmount + salePrice.AgentShipmentPrice) } paymentAccountItems := make([]*model.TSimAddPackagePaymentAccountModel, 0, len(paymentAccounts)) for _, account := range paymentAccounts { account.BalanceEnough = account.AvailableBalance+0.0001 >= account.RequiredAmount paymentAccountItems = append(paymentAccountItems, account) } if !uniformPrice { unitPrice = 0 } items = append(items, &model.TSimAddPackageOptionModel{ PackageCode: strings.TrimSpace(pkg.PackageCode), PackageName: strings.TrimSpace(pkg.PackageName), FlowMb: pkg.FlowMb, UnitPrice: unitPrice, TotalAmount: totalAmount, PriceAvailable: priceAvailable, PaymentAccounts: paymentAccountItems, }) } return &model.TSimAddPackageOptionsRes{ Items: items, IsTopDept: isTopDept, DefaultPaymentMode: addPackageDefaultPaymentMode(isTopDept), AvailableBalance: availableBalance, }, nil } func uniqueNonEmptyStrings(values []string) []string { seen := make(map[string]struct{}, len(values)) result := make([]string, 0, len(values)) for _, value := range values { value = strings.TrimSpace(value) if value == "" { continue } if _, ok := seen[value]; ok { continue } seen[value] = struct{}{} result = append(result, value) } return result } func mapKeys(values map[string]struct{}) []string { keys := make([]string, 0, len(values)) for key := range values { keys = append(keys, key) } sort.Strings(keys) return keys } func ensureNoActiveCardTopupPackages(ctx context.Context, iccids []string) error { iccids = uniqueNonEmptyStrings(iccids) if len(iccids) == 0 { return nil } c := dao.TSimCardBindPkg.Columns() var row struct { Iccid string `orm:"iccid"` } if err := handler.Model(dao.TSimCardBindPkg.Ctx(ctx), &handler.Option{FilterTenant: true, FilterAuth: true}). Fields(c.Iccid). WhereIn(c.Iccid, iccids). Where(c.PackageType, consts.PackageTypeCardAddPackage). WhereIn(c.EffectiveStatus, []int{consts.EffectiveStatusPending, consts.EffectiveStatusEffective}). Where(fmt.Sprintf("(%s IS NULL OR %s > ?)", c.ExpectedExpireTime, c.ExpectedExpireTime), gtime.Now()). OrderAsc(c.Id). Limit(1). Scan(&row); err != nil && !errors.Is(err, sql.ErrNoRows) { return gerror.Wrap(err, "查询未过期单卡加油包失败") } if iccid := strings.TrimSpace(row.Iccid); iccid != "" { return gerror.Newf("ICCID %s 存在未过期加油包,不能重复订购", iccid) } return nil } func ensureNoActivePoolTopupPackages(ctx context.Context, poolCodes []string) error { poolCodes = uniqueNonEmptyStrings(poolCodes) if len(poolCodes) == 0 { return nil } c := dao.TSimPoolBindPackage.Columns() var row struct { PoolNo string `orm:"pool_no"` } if err := handler.Model(dao.TSimPoolBindPackage.Ctx(ctx), &handler.Option{FilterTenant: true, FilterAuth: true}). Fields(c.PoolNo). WhereIn(c.PoolNo, poolCodes). Where(c.PackageType, consts.PackageTypePoolAddPackage). WhereIn(c.EffectiveStatus, []int{consts.EffectiveStatusPending, consts.EffectiveStatusEffective}). Where(fmt.Sprintf("(%s IS NULL OR %s > ?)", c.ExpectedExpireTime, c.ExpectedExpireTime), gtime.Now()). OrderAsc(c.Id). Limit(1). Scan(&row); err != nil && !errors.Is(err, sql.ErrNoRows) { return gerror.Wrap(err, "查询未过期流量池加油包失败") } if poolNo := strings.TrimSpace(row.PoolNo); poolNo != "" { return gerror.Newf("流量池 %s 存在未过期加油包,不能重复订购", poolNo) } return nil } // 套餐详情查询 func (s *sIotTSimCardBindPkg) GetPkgInfo(ctx context.Context, in *model.TSimCardBindPkgInfoParam) (list []*model.TSimCardBindPkgListModel, totalCount int, err error) { mod := s.Model(ctx) bindPackage := dao.TSimCardBindPkg.Table() packageInfo := dao.TSimFlowPackageInfo.Table() orderTable := dao.TOrder.Table() // 先构建 Join mod = mod.LeftJoin(packageInfo, bindPackage+"."+dao.TSimCardBindPkg.Columns().PackageCode+" = "+packageInfo+"."+dao.TSimFlowPackageInfo.Columns().PackageCode) mod = mod.LeftJoin(orderTable, "CONVERT("+bindPackage+"."+dao.TSimCardBindPkg.Columns().OrderCode+" USING utf8mb4) = "+orderTable+"."+dao.TOrder.Columns().OrderSn) // 字段过滤(包含主表字段 + joined 表字段) mod = mod.FieldsPrefix(bindPackage, model.TSimCardBindPkgListModel{}) mod = mod.Fields(packageInfo + ".package_name as packageName") mod = mod.Fields(packageInfo + ".flow_mb as packageFlowMb") mod = mod.Fields(packageInfo + ".flow_gb as packageFlowGb") mod = mod.Fields(orderTable + ".pay_type as payType") mod = mod.Fields(orderTable + ".pay_status as payStatus") mod = mod.Fields(orderTable + ".pay_time as payTime") mod = mod.Fields(orderTable + ".total_amount as totalAmount") mod = mod.Fields(orderTable + ".paid_amount as paidAmount") mod = mod.Fields(orderTable + ".balance as balance") // 查询ICCID if in.Iccid != "" { mod = mod.Where(dao.TSimCardBindPkg.Columns().Iccid, in.Iccid) } mod = mod.Where(dao.TSimCardBindPkg.Columns().PackageType, 103) // 分页 mod = mod.Page(in.Page, in.PageSize) // 排序 mod = mod.OrderDesc(dao.TSimCardBindPkg.Columns().Id) // 操作人摘要信息 mod = mod.Hook(hook.MemberSummary) // 查询数据 if err = mod.ScanAndCount(&list, &totalCount, false); err != nil { err = gerror.Wrap(err, "获取订购表列表失败,请稍后重试!") return } return } // 变更套餐 func (s *sIotTSimCardBindPkg) GetChangePkg(ctx context.Context, in *model.TSimCardBindPkgInfoParam) (list []*model.TSimCardBindPkgListModel, totalCount int, err error) { mod := s.Model(ctx) bindPackage := dao.TSimCardBindPkg.Table() packageInfo := dao.TSimFlowPackageInfo.Table() // 构建 Join - 关联当前套餐信息(变更后) mod = mod.LeftJoin(packageInfo+" as curr_pkg", bindPackage+"."+dao.TSimCardBindPkg.Columns().PackageCode+" = curr_pkg."+dao.TSimFlowPackageInfo.Columns().PackageCode) // 构建 Join - 关联变更前套餐信息 mod = mod.LeftJoin(packageInfo+" as prev_pkg", bindPackage+"."+dao.TSimCardBindPkg.Columns().PreviousPackageCode+" = prev_pkg."+dao.TSimFlowPackageInfo.Columns().PackageCode) // 字段过滤(包含主表字段 + joined 表字段) mod = mod.FieldsPrefix(bindPackage, model.TSimCardBindPkgListModel{}) mod = mod.Fields("curr_pkg.package_name as packageName") mod = mod.Fields("prev_pkg.package_name as previousPackageName") // 查询ICCID mod = mod.Where(bindPackage+"."+dao.TSimCardBindPkg.Columns().Iccid, in.Iccid) mod = mod.Where("("+bindPackage+"."+dao.TSimCardBindPkg.Columns().BusinessType+" = ? OR "+bindPackage+"."+dao.TSimCardBindPkg.Columns().BatchNo+" LIKE ?)", consts.PackageBusinessTypeChange, "CHG%") // 分页 mod = mod.Page(in.Page, in.PageSize) // 排序 mod = mod.OrderDesc(dao.TSimCardBindPkg.Columns().Id) // 操作人摘要信息 mod = mod.Hook(hook.MemberSummary) // 查询数据 if err = mod.ScanAndCount(&list, &totalCount, false); err != nil { err = gerror.Wrap(err, "获取订购表列表失败,请稍后重试!") return } return } func (s *sIotTSimCardBindPkg) DownloadExcelTemplate(ctx context.Context) error { return addpackage.NewCardSubmitter().DownloadTemplate(ctx) } func (s *sIotTSimCardBindPkg) SubmitExcel(ctx context.Context, in *model.TSimCardBindPkgAddPackageExcelSubmitParam) (*model.TSimCardBindPkgAddPackageExcelSubmitRes, error) { if in == nil { in = &model.TSimCardBindPkgAddPackageExcelSubmitParam{} } file, err := cardAddPackageUploadFile(ctx) if err != nil { return nil, err } paymentMode, offlineContractCompleted, err := normalizeAddPackagePaymentMode(ctx, in.PaymentMode, in.OfflineContractCompleted) if err != nil { return nil, err } result, err := addpackage.NewCardSubmitter().SubmitExcel(ctx, file, addpackage.SubmitOptions{ PaymentMode: paymentMode, OfflineContractCompleted: offlineContractCompleted, ManualConfirm: in.ManualConfirm, }) if err != nil { return nil, err } return cardAddPackageSubmitRes(result), nil } func (s *sIotTSimCardBindPkg) SubmitInput(ctx context.Context, in *model.TSimCardBindPkgAddPackageInputSubmitParam) (*model.TSimCardBindPkgAddPackageInputSubmitRes, error) { if in == nil { in = &model.TSimCardBindPkgAddPackageInputSubmitParam{} } paymentMode, offlineContractCompleted, err := normalizeAddPackagePaymentMode(ctx, in.PaymentMode, in.OfflineContractCompleted) if err != nil { return nil, err } result, err := addpackage.NewCardSubmitter().SubmitInput(ctx, in.Input, addpackage.SubmitOptions{ PackageCode: in.PackageCode, Remark: in.Remark, PaymentMode: paymentMode, OfflineContractCompleted: offlineContractCompleted, EffectiveMode: in.EffectiveMode, }) if err != nil { return nil, err } return (*model.TSimCardBindPkgAddPackageInputSubmitRes)(cardAddPackageSubmitRes(result)), nil } func cardAddPackageUploadFile(ctx context.Context) (*ghttp.UploadFile, error) { r := g.RequestFromCtx(ctx) if r == nil { return nil, gerror.New("当前上下文不是HTTP请求") } file := r.GetUploadFile("file") if file == nil { return nil, gerror.New("请选择上传文件") } return file, nil } func cardAddPackageSubmitRes(result *addpackage.SubmitResult) *model.TSimCardBindPkgAddPackageBatchSubmitRes { res := &model.TSimCardBindPkgAddPackageBatchSubmitRes{} if result == nil { return res } res.BatchNo = result.BatchNo res.BatchType = result.BatchType res.TargetBatchType = result.TargetBatchType res.BatchAsyncStatus = result.BatchAsyncStatus res.Total = result.Total res.ValidCount = result.ValidCount res.FailCount = result.FailCount return res }