59eb34976a
iotlcm-admin-svr:管理后台服务。 - Go module:iotlcm → git.5iot.com/iotlcm-public/iotlcm-admin-svr(729 文件) - 凭据与地址脱敏:JWT signingKey(含代码里的 MustGet 默认值)、 MySQL DSN、Redis 口令、告警邮件发件人邮箱全部改为占位; 私网 IP → 文档地址段;库名 xiujie_admin → iotlcm - 真实手机号/邮箱 → 合法 11 位编造号 / example.com - 移除内部资产:CI 触发器、过时 DDL(sql/db_iotlcm.sql)、 私有依赖 go get 行、明文 registry 登录口令 - 启动 banner 统一 IOTLCM 方块字 + 社区惯例署名 - Dockerfile 改用公共基础镜像 - 拼错的 RADEME.md → README.md,README 重写 - 需要真实数据库的用例改为可用 IOTLCM_TEST_WITH_DB=1 显式启用 - 补 Apache-2.0 LICENSE,LF 行尾 + .gitattributes 数据库 schema 不随本仓发布(生产 DDL 已过时),README 已说明。
220 lines
5.8 KiB
Go
220 lines
5.8 KiB
Go
package warningconfig
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/batchinput/excel"
|
|
|
|
"github.com/gogf/gf/v2/errors/gerror"
|
|
)
|
|
|
|
const (
|
|
cardHeaderIccid = "ICCID"
|
|
cardHeaderMsisdn = "MSISDN"
|
|
cardHeaderImsi = "IMSI"
|
|
cardHeaderFirstWarn = "第一档阈值(MB)"
|
|
cardHeaderSecondWarn = "第二档阈值(MB)"
|
|
cardHeaderThirdWarn = "第三档阈值(MB)"
|
|
cardHeaderAutoAction = "第三次是否断网"
|
|
|
|
poolHeaderCode = "流量池编号"
|
|
poolHeaderFirstWarn = "第一档阈值(%)"
|
|
poolHeaderSecondWarn = "第二档阈值(%)"
|
|
poolHeaderThirdWarn = "第三档阈值(%)"
|
|
|
|
headerWarnMethods = "提醒方式"
|
|
headerWarnPhones = "短信号码"
|
|
headerWarnEmails = "邮箱地址"
|
|
headerIsEnabled = "是否启用"
|
|
headerRemark = "备注"
|
|
)
|
|
|
|
func templateHeaders(itemType int) []string {
|
|
if itemType == warnItemTypeFlowPool {
|
|
return []string{
|
|
poolHeaderCode,
|
|
poolHeaderFirstWarn,
|
|
poolHeaderSecondWarn,
|
|
poolHeaderThirdWarn,
|
|
headerWarnMethods,
|
|
headerWarnPhones,
|
|
headerWarnEmails,
|
|
headerIsEnabled,
|
|
headerRemark,
|
|
}
|
|
}
|
|
return []string{
|
|
cardHeaderIccid,
|
|
cardHeaderMsisdn,
|
|
cardHeaderImsi,
|
|
cardHeaderFirstWarn,
|
|
cardHeaderSecondWarn,
|
|
cardHeaderThirdWarn,
|
|
cardHeaderAutoAction,
|
|
headerWarnMethods,
|
|
headerWarnPhones,
|
|
headerWarnEmails,
|
|
headerIsEnabled,
|
|
headerRemark,
|
|
}
|
|
}
|
|
|
|
func requiredHeaders(itemType int) []string {
|
|
return templateHeaders(itemType)
|
|
}
|
|
|
|
func NormalizeContextOptions(itemType, warnUnit int) (Options, error) {
|
|
itemType = normalizeItemType(itemType)
|
|
options := Options{
|
|
ItemType: itemType,
|
|
WarnType: deriveWarnType(itemType, warnUnit),
|
|
WarnUnit: warnUnit,
|
|
WarnMethods: warnMethodPlatform,
|
|
IsEnabled: 1,
|
|
}
|
|
if err := validateWarnTypeUnit(itemType, options.WarnType, warnUnit); err != nil {
|
|
return Options{}, err
|
|
}
|
|
return options, nil
|
|
}
|
|
|
|
func parseExcelRowOptions(parsed excel.ParsedRow, itemType, warnUnit int) (Options, error) {
|
|
if itemType == warnItemTypeFlowPool {
|
|
return parseRowOptions(itemType, warnUnit, []string{
|
|
excel.Field(parsed, poolHeaderFirstWarn),
|
|
excel.Field(parsed, poolHeaderSecondWarn),
|
|
excel.Field(parsed, poolHeaderThirdWarn),
|
|
excel.Field(parsed, headerWarnMethods),
|
|
excel.Field(parsed, headerWarnPhones),
|
|
excel.Field(parsed, headerWarnEmails),
|
|
excel.Field(parsed, headerIsEnabled),
|
|
excel.Field(parsed, headerRemark),
|
|
})
|
|
}
|
|
return parseRowOptions(itemType, warnUnit, []string{
|
|
excel.Field(parsed, cardHeaderFirstWarn),
|
|
excel.Field(parsed, cardHeaderSecondWarn),
|
|
excel.Field(parsed, cardHeaderThirdWarn),
|
|
excel.Field(parsed, cardHeaderAutoAction),
|
|
excel.Field(parsed, headerWarnMethods),
|
|
excel.Field(parsed, headerWarnPhones),
|
|
excel.Field(parsed, headerWarnEmails),
|
|
excel.Field(parsed, headerIsEnabled),
|
|
excel.Field(parsed, headerRemark),
|
|
})
|
|
}
|
|
|
|
func parseRowOptions(itemType, warnUnit int, fields []string) (Options, error) {
|
|
expected := 8
|
|
if itemType == warnItemTypeCard {
|
|
expected = 9
|
|
}
|
|
if len(fields) != expected {
|
|
return Options{}, gerror.New("预警配置字段数量不正确")
|
|
}
|
|
|
|
first, err := parseRequiredAmount(fields[0], "第一档阈值")
|
|
if err != nil {
|
|
return Options{}, err
|
|
}
|
|
second, err := parseOptionalAmount(fields[1], "第二档阈值")
|
|
if err != nil {
|
|
return Options{}, err
|
|
}
|
|
third, err := parseOptionalAmount(fields[2], "第三档阈值")
|
|
if err != nil {
|
|
return Options{}, err
|
|
}
|
|
|
|
offset := 3
|
|
autoAction := 0
|
|
if itemType == warnItemTypeCard {
|
|
if strings.TrimSpace(fields[offset]) != "" {
|
|
enabled, parseErr := excel.ParseBool(fields[offset])
|
|
if parseErr != nil {
|
|
return Options{}, gerror.New("第三次是否断网必须填写是或否")
|
|
}
|
|
if enabled {
|
|
autoAction = warnAutoActionDataCut
|
|
}
|
|
}
|
|
offset++
|
|
}
|
|
|
|
methods, err := parseWarnMethods(fields[offset])
|
|
if err != nil {
|
|
return Options{}, err
|
|
}
|
|
phones := strings.TrimSpace(fields[offset+1])
|
|
emails := strings.TrimSpace(fields[offset+2])
|
|
isEnabled := 1
|
|
if strings.TrimSpace(fields[offset+3]) != "" {
|
|
enabled, parseErr := excel.ParseBool(fields[offset+3])
|
|
if parseErr != nil {
|
|
return Options{}, gerror.New("是否启用必须填写是或否")
|
|
}
|
|
if !enabled {
|
|
isEnabled = 0
|
|
}
|
|
}
|
|
|
|
options := Options{
|
|
ItemType: itemType,
|
|
WarnType: deriveWarnType(itemType, warnUnit),
|
|
WarnUnit: warnUnit,
|
|
FirstWarn: first,
|
|
SecondWarn: second,
|
|
ThirdWarn: third,
|
|
WarnMethods: methods,
|
|
WarnPhones: phones,
|
|
WarnEmails: emails,
|
|
AutoAction: autoAction,
|
|
IsEnabled: isEnabled,
|
|
Remark: strings.TrimSpace(fields[offset+4]),
|
|
}
|
|
if err = validateOptions(&options); err != nil {
|
|
return Options{}, err
|
|
}
|
|
return options, nil
|
|
}
|
|
|
|
func parseRequiredAmount(value, name string) (float64, error) {
|
|
if strings.TrimSpace(value) == "" {
|
|
return 0, gerror.Newf("%s不能为空", name)
|
|
}
|
|
parsed, err := excel.ParseAmount(value)
|
|
if err != nil {
|
|
return 0, gerror.Newf("%s必须是非负数字", name)
|
|
}
|
|
return parsed, nil
|
|
}
|
|
|
|
func parseOptionalAmount(value, name string) (float64, error) {
|
|
if strings.TrimSpace(value) == "" {
|
|
return 0, nil
|
|
}
|
|
parsed, err := excel.ParseAmount(value)
|
|
if err != nil {
|
|
return 0, gerror.Newf("%s必须是非负数字", name)
|
|
}
|
|
return parsed, nil
|
|
}
|
|
|
|
func parseWarnMethods(value string) (string, error) {
|
|
if strings.TrimSpace(value) == "" {
|
|
return "", gerror.New("提醒方式不能为空,至少填写站内提醒")
|
|
}
|
|
for _, method := range splitWarnList(value) {
|
|
switch strings.ToLower(method) {
|
|
case "0", "短信", "1", "邮箱", "2", "电话", "3", "平台消息", "站内提醒", "站内消息":
|
|
default:
|
|
return "", gerror.Newf("提醒方式无效:%s", method)
|
|
}
|
|
}
|
|
return normalizeWarnMethods(value), nil
|
|
}
|
|
|
|
func parseInputConfig(itemType, warnUnit int, fields []string) (Options, error) {
|
|
return parseRowOptions(itemType, warnUnit, fields)
|
|
}
|