Files
iotlcm/server/internal/logic/iot/simcardbatch/warningconfig/schema.go
T
MiFaZhan 59eb34976a 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 已说明。
2026-10-23 14:48:30 +08:00

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)
}