package renew import ( "context" "strings" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/consts" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/batchimport" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model" "github.com/gogf/gf/v2/database/gdb" "github.com/gogf/gf/v2/encoding/gjson" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/frame/g" ) // PrepareProcessor 描述 batch_type=4 的卡续费预处理批次。 // 与正式续费 Processor 共享 row/validate 逻辑,但 BatchType/BuildBatchInfo 走 prepare 语义。 type PrepareProcessor struct { inner *Processor repo *Repository config batchimport.ProcessorConfig } func NewPrepareProcessor() *PrepareProcessor { inner := NewProcessor() cfg := inner.config cfg.Code = "sim_card_renew_prepare" cfg.BatchType = consts.BatchTypePrepare cfg.BatchNoPrefix = consts.BatchNoPrefixRenew return &PrepareProcessor{ inner: inner, repo: inner.repo, config: cfg, } } func (p *PrepareProcessor) Config() batchimport.ProcessorConfig { return p.config } func (p *PrepareProcessor) ParseRows(ctx context.Context, filePath string) ([]batchimport.Row, error) { return nil, nil } func (p *PrepareProcessor) ValidateRows(ctx context.Context, rows []batchimport.Row) error { // Keep submit non-blocking; the worker owns prepare validation. return nil } func (p *PrepareProcessor) Execute(ctx context.Context, tx gdb.TX, req *batchimport.SubmitRequest, rows []batchimport.Row) error { if req == nil { return gerror.New("续费预处理请求不能为空") } renewRows := make([]*Row, 0, len(rows)) for _, item := range rows { row, ok := item.(*Row) if !ok || row == nil { return gerror.New("续费行类型错误") } renewRows = append(renewRows, row) } submitParam := renewPrepareSubmitParam(req) prepared, err := p.inner.ValidatePrepareContext(ctx, tx, submitParam, req.Operator, renewRows) if err != nil { return err } priceSnapshot, err := ensurePriceSnapshot(ctx, tx, req.Operator, prepared, nil) if err != nil { return err } req.TargetDeptId = prepared.CustomerAgentId req.ExecutionResult = priceSnapshot return nil } func (p *PrepareProcessor) BuildBatchInfo(ctx context.Context, req batchimport.SubmitRequest, result *batchimport.Result, importOss *model.SysOssSaveContentModel, resultOss *model.SysOssSaveContentModel, downloadId int64) *gjson.Json { info := g.Map{} if result != nil && result.ImportFileOssId > 0 { info["importFileOssId"] = result.ImportFileOssId } else if importOss != nil && importOss.OssId > 0 { info["importFileOssId"] = importOss.OssId } if resultOss != nil { info["resultFileOssId"] = resultOss.OssId } if downloadId > 0 { info["resultDownloadId"] = downloadId } info["targetBatchType"] = consts.BatchTypeRenew info["targetBatchName"] = "卡续费" if in, ok := req.BizParams.(*model.TSimCardRenewBatchPrepareParam); ok && in != nil { if sourceBatchNo := strings.TrimSpace(in.SourceBatchNo); sourceBatchNo != "" { info["sourceBatchNo"] = sourceBatchNo } } if in, ok := req.BizParams.(*model.TSimCardRenewBatchPrepareAllParam); ok && in != nil { if sourceBatchNo := strings.TrimSpace(in.SourceBatchNo); sourceBatchNo != "" { info["sourceBatchNo"] = sourceBatchNo } } if in, ok := req.BizParams.(*model.TSimCardRenewBatchSubmitParam); ok && in != nil { durationValue := renewDisplayDurationValue(in) if durationValue > 0 { actualDurationMonths := renewActualDurationMonths(nil, durationValue) info["durationValue"] = durationValue info["durationYears"] = durationValue info["durationMonths"] = actualDurationMonths info["actualDurationMonths"] = actualDurationMonths } if paymentMode := strings.TrimSpace(in.PaymentMode); paymentMode != "" { info["paymentMode"] = paymentMode } if packageCode := strings.TrimSpace(in.PackageCode); packageCode != "" { info["packageCode"] = packageCode } info["offlineContractCompleted"] = in.OfflineContractCompleted if sourceBatchNo := strings.TrimSpace(in.SourceBatchNo); sourceBatchNo != "" { info["sourceBatchNo"] = sourceBatchNo } } if snapshot, ok := req.ExecutionResult.(*model.TSimCardRenewPriceSnapshot); ok && snapshot != nil { info["customerAgentId"] = snapshot.CustomerAgentId info["packageCode"] = snapshot.PackageCode info["packageName"] = snapshot.PackageName info["billingMethod"] = snapshot.BillingMethod info["renewDurationUnit"] = snapshot.RenewDurationUnit info["renewDurationUnitText"] = snapshot.RenewDurationUnitText info["priceSource"] = snapshot.PriceSource info["priceOwnerDeptId"] = snapshot.PriceOwnerDeptId info["agentDefaultPriceId"] = snapshot.AgentDefaultPriceId info["targetPriceId"] = snapshot.TargetPriceId info["renewUnitPrice"] = snapshot.RenewUnitPrice info["renewableDurationOptions"] = snapshot.RenewableDurationOptions info["renewablePackageCodes"] = snapshot.RenewablePackageCodes info["renewablePackages"] = snapshot.RenewablePackages info["renewBeginDate"] = snapshot.RenewBeginDate info["renewBeginDateMin"] = snapshot.RenewBeginDateMin info["renewBeginDateMax"] = snapshot.RenewBeginDateMax info["sameRenewBeginDate"] = snapshot.SameRenewBeginDate if result != nil { info["quantity"] = result.ValidRows } } return gjson.New(info) } func (p *PrepareProcessor) ValidatePrepareContext(ctx context.Context, tx gdb.TX, in *model.TSimCardRenewBatchSubmitParam, operator batchimport.OperatorContext, rows []*Row) (*PrepareContext, error) { return p.inner.ValidatePrepareContext(ctx, tx, in, operator, rows) } func renewPrepareSubmitParam(req *batchimport.SubmitRequest) *model.TSimCardRenewBatchSubmitParam { submitParam := &model.TSimCardRenewBatchSubmitParam{} if req == nil { return submitParam } switch in := req.BizParams.(type) { case *model.TSimCardRenewBatchSubmitParam: if in != nil { submitParam = in } case *model.TSimCardRenewBatchPrepareParam: if in != nil { submitParam.SourceBatchNo = strings.TrimSpace(in.SourceBatchNo) } case *model.TSimCardRenewBatchPrepareAllParam: if in != nil { submitParam.SourceBatchNo = strings.TrimSpace(in.SourceBatchNo) } } if strings.TrimSpace(submitParam.SourceBatchNo) == "" { submitParam.SourceBatchNo = strings.TrimSpace(req.SourceBatchNo) } return submitParam }