71 lines
2.2 KiB
Go
71 lines
2.2 KiB
Go
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)
|
|
}
|