chore: 初始开源发布
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 已说明。
This commit is contained in:
@@ -0,0 +1,219 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user