package unsub 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/encoding/gjson" "github.com/gogf/gf/v2/frame/g" ) type Processor struct { config batchimport.ProcessorConfig } type submitOptions struct { SourceBatchNo string Remark string } func NewProcessor() *Processor { return &Processor{ config: batchimport.ProcessorConfig{ Code: "sim_card_unsub", BatchType: consts.BatchTypeUnsub, BatchNoPrefix: consts.BatchNoPrefixUnsub, TaskName: consts.ResourceBatchDownloadTaskSimCardUnsub, ExportScene: consts.ResourceExportSceneUnsub, ImportDir: consts.SimCardUnsubSubDirImportExcel, ResultDir: consts.SimCardUnsubSubDirResultExcel, MaxFileSize: consts.SimCardUnsubMaxFileSize, TemplateHeaders: []string{"ICCID", "MSISDN", "IMSI"}, RequiredHeaders: []string{"ICCID"}, }, } } func (p *Processor) Config() batchimport.ProcessorConfig { return p.config } func (p *Processor) ParseRows(ctx context.Context, filePath string) ([]batchimport.Row, error) { return ParseExcelFileRows(ctx, filePath) } func (p *Processor) ValidateRows(ctx context.Context, rows []batchimport.Row) error { unsubRows := make([]*Row, 0, len(rows)) for _, item := range rows { row, ok := item.(*Row) if !ok || row == nil { item.AddErrorReason("退订行类型错误") continue } unsubRows = append(unsubRows, row) } return validateRows(unsubRows) } func (p *Processor) BuildBatchInfo(ctx context.Context, req batchimport.SubmitRequest, result *batchimport.Result, importOss *model.SysOssSaveContentModel, resultOss *model.SysOssSaveContentModel, downloadId int64) *gjson.Json { info := g.Map{ "operation": "unsub", "resultFile": g.Map{"status": "pending"}, "submitScene": submitScene(req.BizParams), } if result != nil && result.ImportFileOssId > 0 { info["importFileOssId"] = result.ImportFileOssId } else if importOss != nil && importOss.OssId > 0 { info["importFileOssId"] = importOss.OssId } if opts, ok := maybeUnsubSubmitOptions(req.BizParams); ok { if opts.SourceBatchNo != "" { info["sourceBatchNo"] = opts.SourceBatchNo } if opts.Remark != "" { info["remark"] = opts.Remark } } return gjson.New(info) } func submitScene(params any) string { switch params.(type) { case *model.TSimCardUnsubBatchSubmitParam: return "sourceBatch" case *model.TSimCardUnsubExcelSubmitParam: return "excel" case *model.TSimCardUnsubInputSubmitParam: return "input" case *model.TSimCardUnsubRangeSubmitParam: return "range" default: return "" } } func validateRows(rows []*Row) error { firstByIccid := make(map[string]*Row, len(rows)) for _, row := range rows { if row == nil { continue } row.Iccid = strings.TrimSpace(row.Iccid) if row.Iccid == "" { row.AddReason("ICCID不能为空") continue } if first, ok := firstByIccid[row.Iccid]; ok { row.AddReason("ICCID重复") first.AddReason("ICCID重复") continue } firstByIccid[row.Iccid] = row } return nil } func maybeUnsubSubmitOptions(params any) (submitOptions, bool) { switch in := params.(type) { case *model.TSimCardUnsubBatchSubmitParam: if in == nil { return submitOptions{}, false } return submitOptions{ SourceBatchNo: strings.TrimSpace(in.SourceBatchNo), Remark: strings.TrimSpace(in.Remark), }, true case *model.TSimCardUnsubExcelSubmitParam: if in == nil { return submitOptions{}, false } return submitOptions{}, true case *model.TSimCardUnsubInputSubmitParam: if in == nil { return submitOptions{}, false } return submitOptions{Remark: strings.TrimSpace(in.Remark)}, true case *model.TSimCardUnsubRangeSubmitParam: if in == nil { return submitOptions{}, false } return submitOptions{Remark: strings.TrimSpace(in.Remark)}, true default: return submitOptions{}, false } }