package lifecycle import ( "fmt" "sort" "strings" "git.5iot.com/iotlcm-public/iotlcm-worker-svr/internal/model/entity" lifecycle "git.5iot.com/iotlcm-public/iotlcm-worker-svr/internal/service/lifecycle" ) // batchFailureSummary 生成中文失败汇总,替代原先的英文「N SIM cards failed」。 // 形如:共50张,成功28张,失败22张;主要失败原因:当前卡状态不支持该操作 func batchFailureSummary(total, success, fail int, reasons []string) string { var builder strings.Builder fmt.Fprintf(&builder, "共%d张,成功%d张,失败%d张", total, success, fail) if reason := dominantReason(reasons); reason != "" { builder.WriteString(";主要失败原因:") builder.WriteString(reason) } return builder.String() } // dominantReason 取出现次数最多的失败原因;次数相同时按字典序,保证结果稳定可测。 func dominantReason(reasons []string) string { counts := make(map[string]int, len(reasons)) for _, reason := range reasons { trimmed := strings.TrimSpace(reason) if trimmed == "" { continue } counts[trimmed]++ } if len(counts) == 0 { return "" } keys := make([]string, 0, len(counts)) for key := range counts { keys = append(keys, key) } sort.Slice(keys, func(i, j int) bool { if counts[keys[i]] != counts[keys[j]] { return counts[keys[i]] > counts[keys[j]] } return keys[i] < keys[j] }) return keys[0] } // lifecycleFailureSummary 依据内存中的任务明细生成汇总。 func lifecycleFailureSummary(details []*lifecycle.Detail, success, fail int) string { reasons := make([]string, 0, fail) for _, detail := range details { if detail != nil && strings.TrimSpace(detail.Reason) != "" { reasons = append(reasons, detail.Reason) } } return batchFailureSummary(len(details), success, fail, reasons) } // storedFailureSummary 依据已落库的批次明细生成汇总(重启批次的复机阶段使用)。 func storedFailureSummary(details []*entity.BatchDetail, success, fail int) string { reasons := make([]string, 0, fail) for _, detail := range details { if detail != nil && strings.TrimSpace(detail.ErrorReason) != "" { reasons = append(reasons, detail.ErrorReason) } } return batchFailureSummary(len(details), success, fail, reasons) }