package allocate import ( "context" "fmt" "strings" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/consts" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/allocationunits" "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" ) const ( importDir = "sim-card-allocate/import" resultDir = "sim-card-allocate/result" maxFileSize = 50 << 20 maxAllocateRows = 10000 ) type Processor struct{} func NewProcessor() *Processor { return &Processor{} } func (p *Processor) Config() batchimport.ProcessorConfig { return batchimport.ProcessorConfig{ Code: "sim_card_allocate", BatchType: consts.BatchTypeAllocate, BatchNoPrefix: consts.BatchNoPrefixAllocate, TaskName: "卡划拨结果", ExportScene: consts.ResourceExportSceneAllocate, ImportDir: importDir, ResultDir: resultDir, MaxFileSize: maxFileSize, MaxRows: maxAllocateRows, TemplateHeaders: []string{"ICCID", "MSISDN", "IMSI", "目标客户名称"}, RequiredHeaders: []string{"ICCID"}, } } func (p *Processor) ParseRows(ctx context.Context, filePath string) ([]batchimport.Row, error) { return ParseExcelFileRows(ctx, filePath) } func (p *Processor) ValidateRows(_ context.Context, rows []batchimport.Row) error { firstByIccid := make(map[string]*Row, len(rows)) for _, item := range rows { row, ok := item.(*Row) if !ok || row == nil { continue } row.Iccid = strings.TrimSpace(row.Iccid) row.Msisdn = strings.TrimSpace(row.Msisdn) row.Imsi = strings.TrimSpace(row.Imsi) row.TargetDeptKey = strings.TrimSpace(row.TargetDeptKey) row.TargetDeptName = strings.TrimSpace(row.TargetDeptName) row.Remark = strings.TrimSpace(row.Remark) if row.Iccid == "" { row.AddErrorReason("ICCID不能为空") continue } if first, exists := firstByIccid[row.Iccid]; exists { row.AddErrorReason(fmt.Sprintf("ICCID与第%d行重复", first.RowNo)) first.AddErrorReason("ICCID重复") continue } firstByIccid[row.Iccid] = row } return nil } func (p *Processor) BuildBatchInfo(_ context.Context, req batchimport.SubmitRequest, result *batchimport.Result, importOss *model.SysOssSaveContentModel, resultOss *model.SysOssSaveContentModel, downloadId int64) *gjson.Json { options := optionsFromParams(req.BizParams) info := g.Map{ "operation": "sim_card_allocate", "configName": "卡划拨", "submitScene": submitScene(req.SourceType), "targetDeptId": options.TargetDeptId, "remark": strings.TrimSpace(options.Remark), "resultFile": g.Map{"status": "pending"}, } if result != nil && result.ImportFileOssId > 0 { info["importFileOssId"] = result.ImportFileOssId } else if importOss != nil && importOss.OssId > 0 { info["importFileOssId"] = importOss.OssId } if resultOss != nil && resultOss.OssId > 0 { info["resultFileOssId"] = resultOss.OssId } if downloadId > 0 { info["resultDownloadId"] = downloadId } return allocationunits.Merge(gjson.New(info), options.Units) } func optionsFromParams(params any) SubmitOptions { if options, ok := params.(*SubmitOptions); ok && options != nil { return *options } return SubmitOptions{} } func submitScene(sourceType int) string { switch sourceType { case consts.BatchSourceTypeFile: return "excel" case consts.BatchSourceTypeBatchInput: return "input" default: return "" } }