Files
iotlcm/server/internal/logic/app/app_warning.go
T

781 lines
24 KiB
Go

package app
import (
"context"
"strings"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/consts"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/dao"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/do"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/entity"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/service"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gtime"
)
const (
appWarningItemTypeCard = 1
appWarningUnitMb = 1
appWarningTypeCardTraffic = 1
appWarningMessageMethod = "3"
// 微信订阅消息模板 ID 默认值:物联卡预警提醒
appWarningWechatTemplateIdDefault = "DMDP2PKktdtG1ES_3Ic1JcR0LGELQmWE6LunYyerHCY"
)
type sAppWarning struct{}
type appWarningConfigRow = entity.TWarnConfig
func NewAppWarning() *sAppWarning {
return &sAppWarning{}
}
func init() {
service.RegisterAppWarning(NewAppWarning())
}
func (s *sAppWarning) ConfigList(ctx context.Context, param *model.AppWarningConfigListParam) (res *model.AppWarningConfigListModel, err error) {
if param == nil {
return nil, gerror.New("预警配置查询参数不能为空")
}
param.CardValue = strings.TrimSpace(param.CardValue)
user, cardRow, cardModel, err := s.resolveWarningCard(ctx, param.CardValue)
if err != nil {
return nil, err
}
var rows []*appWarningConfigRow
err = s.configModel(ctx).
Where(dao.TWarnConfig.Columns().TenantId, user.TenantId).
Where(dao.TWarnConfig.Columns().ItemType, appWarningItemTypeCard).
Where(dao.TWarnConfig.Columns().ItemId, cardRow.Id).
Where(dao.TWarnConfig.Columns().WarnUnit, appWarningUnitMb).
OrderAsc(dao.TWarnConfig.Columns().WarnUnit).
Scan(&rows)
if err != nil {
return nil, gerror.Wrap(err, "查询预警配置失败,请稍后重试")
}
wechatBound, wechatBindText, err := appUserWechatBindingStatus(ctx, user)
if err != nil {
return nil, err
}
return &model.AppWarningConfigListModel{
Card: cardModel,
Items: s.configRowsToModels(rows),
TemplateId: appWarningWechatTemplateId(ctx),
TemplateReady: appWarningTemplateReady(ctx),
WechatBound: wechatBound,
WechatBindText: wechatBindText,
}, nil
}
func (s *sAppWarning) ConfigMeta(ctx context.Context) (res *model.AppWarningConfigMetaModel, err error) {
user, err := appCurrentUser(ctx)
if err != nil {
return nil, err
}
wechatBound, wechatBindText, err := appUserWechatBindingStatus(ctx, user)
if err != nil {
return nil, err
}
var summary appWarningNotifySummary
if err = appWarningNotifySummaryModel(s.configModel(ctx), user).Scan(&summary); err != nil {
return nil, gerror.Wrap(err, "查询当前账号预警提醒配置失败")
}
return &model.AppWarningConfigMetaModel{
TemplateId: appWarningWechatTemplateId(ctx),
TemplateReady: appWarningTemplateReady(ctx),
WechatBound: wechatBound,
WechatBindText: wechatBindText,
AppNotifyEnabled: appWarningNotifyEnabledValue(nil),
ActiveConfigCount: summary.ActiveConfigCount,
NotifyConfigCount: summary.NotifyConfigCount,
}, nil
}
type appWarningNotifySummary struct {
ActiveConfigCount int `orm:"active_config_count"`
NotifyConfigCount int `orm:"notify_config_count"`
}
func appWarningNotifySummaryModel(mod *gdb.Model, user *entity.SysUser) *gdb.Model {
columns := dao.TWarnConfig.Columns()
return mod.
Where(columns.TenantId, user.TenantId).
Where(columns.CreatedBy, user.UserId).
Where(columns.ItemType, appWarningItemTypeCard).
Where(columns.WarnUnit, appWarningUnitMb).
Where(columns.IsEnabled, 1).
Fields("COUNT(*) AS active_config_count, COALESCE(SUM(CASE WHEN " + columns.AppNotifyEnabled + " = 1 THEN 1 ELSE 0 END), 0) AS notify_config_count")
}
func (s *sAppWarning) ConfigSave(ctx context.Context, param *model.AppWarningConfigSaveParam) (res *model.AppWarningConfigSaveModel, err error) {
if err = normalizeAppWarningSaveParam(param); err != nil {
return nil, err
}
user, cardRow, _, err := s.resolveWarningCard(ctx, param.CardValue)
if err != nil {
return nil, err
}
saveParam, err := s.prepareWarningSaveParam(ctx, nil, user, cardRow, param)
if err != nil {
return nil, err
}
now := gtime.Now()
batchNo, err := appNextBatchNo(ctx, consts.BatchNoPrefixWarning)
if err != nil {
return nil, err
}
data := appWarningBuildSaveRow(ctx, user, cardRow, saveParam, batchNo, now)
_, err = dao.TWarnConfig.Ctx(ctx).
Data(data).
OnConflict(
dao.TWarnConfig.Columns().TenantId,
dao.TWarnConfig.Columns().ItemType,
dao.TWarnConfig.Columns().ItemId,
dao.TWarnConfig.Columns().WarnUnit,
).
OnDuplicateEx(appWarningSaveDuplicateExcludeFields()).
Save()
if err != nil {
return nil, gerror.Wrap(err, "保存预警配置失败,请稍后重试")
}
config, err := s.findConfigByItem(ctx, user.TenantId, cardRow.Id, param.WarnUnit)
if err != nil {
return nil, err
}
wechatBound, wechatBindText, err := appUserWechatBindingStatus(ctx, user)
if err != nil {
return nil, err
}
if config == nil || config.Id == 0 {
return nil, gerror.New("保存预警配置后未查询到配置")
}
return &model.AppWarningConfigSaveModel{
Id: config.Id,
Config: s.configRowToModel(config),
TemplateId: appWarningWechatTemplateId(ctx),
TemplateReady: appWarningTemplateReady(ctx),
WechatBound: wechatBound,
WechatBindText: wechatBindText,
}, nil
}
func (s *sAppWarning) ConfigBatchSave(ctx context.Context, param *model.AppWarningConfigBatchSaveParam) (res *model.AppWarningConfigBatchSaveModel, err error) {
user, err := appCurrentUser(ctx)
if err != nil {
return nil, err
}
cardValues, configs, err := normalizeAppWarningBatchSaveParam(param)
if err != nil {
return nil, err
}
cardLogic := NewAppCard()
type validCard struct {
Value string
Row *appCardQueryRow
}
validCards := make([]validCard, 0, len(cardValues))
failItems := make([]*model.AppWarningConfigBatchFailItem, 0)
seenCardIds := make(map[int64]struct{}, len(cardValues))
for _, cardValue := range cardValues {
cardRow, err := cardLogic.findVisibleCard(ctx, user, cardValue)
if err != nil {
failItems = append(failItems, &model.AppWarningConfigBatchFailItem{CardValue: cardValue, Reason: "查询卡片失败"})
continue
}
if cardRow == nil || cardRow.Id == 0 {
failItems = append(failItems, &model.AppWarningConfigBatchFailItem{CardValue: cardValue, Reason: "卡片不存在或无权配置"})
continue
}
if _, exists := seenCardIds[cardRow.Id]; exists {
continue
}
if err = cardLogic.ensureOperateCard(ctx, user, cardRow, "配置预警"); err != nil {
failItems = append(failItems, &model.AppWarningConfigBatchFailItem{CardValue: cardValue, Reason: err.Error()})
continue
}
seenCardIds[cardRow.Id] = struct{}{}
validCards = append(validCards, validCard{Value: cardValue, Row: cardRow})
}
if len(validCards) == 0 {
return nil, gerror.New("没有可配置预警的卡片")
}
now := gtime.Now()
batchNo, err := appNextBatchNo(ctx, consts.BatchNoPrefixWarning)
if err != nil {
return nil, err
}
err = dao.TWarnConfig.Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
for _, card := range validCards {
for _, config := range configs {
saveParam, err := s.prepareWarningSaveParam(ctx, tx, user, card.Row, config)
if err != nil {
return err
}
data := appWarningBuildSaveRow(ctx, user, card.Row, saveParam, batchNo, now)
if _, err = dao.TWarnConfig.Ctx(ctx).TX(tx).
Data(data).
OnConflict(
dao.TWarnConfig.Columns().TenantId,
dao.TWarnConfig.Columns().ItemType,
dao.TWarnConfig.Columns().ItemId,
dao.TWarnConfig.Columns().WarnUnit,
).
OnDuplicateEx(appWarningSaveDuplicateExcludeFields()).
Save(); err != nil {
return err
}
}
}
return nil
})
if err != nil {
return nil, gerror.Wrap(err, "批量保存预警配置失败,请稍后重试")
}
wechatBound, wechatBindText, err := appUserWechatBindingStatus(ctx, user)
if err != nil {
return nil, err
}
return &model.AppWarningConfigBatchSaveModel{
BatchNo: batchNo,
TotalCount: len(cardValues),
SuccessCount: len(validCards),
FailCount: len(failItems),
FailItems: failItems,
TemplateId: appWarningWechatTemplateId(ctx),
TemplateReady: appWarningTemplateReady(ctx),
WechatBound: wechatBound,
WechatBindText: wechatBindText,
}, nil
}
func (s *sAppWarning) ConfigNotify(ctx context.Context, param *model.AppWarningConfigNotifyParam) (res *model.AppWarningConfigNotifyModel, err error) {
if err = normalizeAppWarningNotifyParam(param); err != nil {
return nil, err
}
user, cardRow, _, err := s.resolveWarningCard(ctx, param.CardValue)
if err != nil {
return nil, err
}
config, err := s.findConfigByItem(ctx, user.TenantId, cardRow.Id, param.WarnUnit)
if err != nil {
return nil, err
}
if config == nil || config.Id == 0 {
return nil, gerror.New("请先保存预警阈值后再设置小程序提醒")
}
now := gtime.Now()
_, err = dao.TWarnConfig.Ctx(ctx).
Where(dao.TWarnConfig.Columns().TenantId, user.TenantId).
Where(dao.TWarnConfig.Columns().ItemType, appWarningItemTypeCard).
Where(dao.TWarnConfig.Columns().ItemId, cardRow.Id).
Where(dao.TWarnConfig.Columns().WarnUnit, param.WarnUnit).
Data(do.TWarnConfig{
AppNotifyEnabled: appWarningNotifyEnabledValue(param.AppNotifyEnabled),
UpdatedBy: user.UserId,
UpdatedAt: now,
}).
Update()
if err != nil {
return nil, gerror.Wrap(err, "设置小程序预警通知失败,请稍后重试")
}
config, err = s.findConfigByItem(ctx, user.TenantId, cardRow.Id, param.WarnUnit)
if err != nil {
return nil, err
}
wechatBound, wechatBindText, err := appUserWechatBindingStatus(ctx, user)
if err != nil {
return nil, err
}
return &model.AppWarningConfigNotifyModel{
AppNotifyEnabled: appWarningNotifyEnabledValue(param.AppNotifyEnabled),
Config: s.configRowToModel(config),
TemplateId: appWarningWechatTemplateId(ctx),
TemplateReady: appWarningTemplateReady(ctx),
WechatBound: wechatBound,
WechatBindText: wechatBindText,
}, nil
}
func (s *sAppWarning) ConfigBatchNotify(ctx context.Context, param *model.AppWarningConfigBatchNotifyParam) (res *model.AppWarningConfigBatchNotifyModel, err error) {
user, err := appCurrentUser(ctx)
if err != nil {
return nil, err
}
cardValues, err := normalizeAppWarningBatchNotifyParam(param)
if err != nil {
return nil, err
}
cardLogic := NewAppCard()
type validCard struct {
Value string
Row *appCardQueryRow
}
validCards := make([]validCard, 0, len(cardValues))
failItems := make([]*model.AppWarningConfigBatchFailItem, 0)
seenCardIds := make(map[int64]struct{}, len(cardValues))
for _, cardValue := range cardValues {
cardRow, err := cardLogic.findVisibleCard(ctx, user, cardValue)
if err != nil {
failItems = append(failItems, &model.AppWarningConfigBatchFailItem{CardValue: cardValue, Reason: "查询卡片失败"})
continue
}
if cardRow == nil || cardRow.Id == 0 {
failItems = append(failItems, &model.AppWarningConfigBatchFailItem{CardValue: cardValue, Reason: "卡片不存在或无权配置"})
continue
}
if _, exists := seenCardIds[cardRow.Id]; exists {
continue
}
if err = cardLogic.ensureOperateCard(ctx, user, cardRow, "配置预警"); err != nil {
failItems = append(failItems, &model.AppWarningConfigBatchFailItem{CardValue: cardValue, Reason: err.Error()})
continue
}
config, err := s.findConfigByItem(ctx, user.TenantId, cardRow.Id, param.WarnUnit)
if err != nil {
failItems = append(failItems, &model.AppWarningConfigBatchFailItem{CardValue: cardValue, Reason: "查询预警配置失败"})
continue
}
if config == nil || config.Id == 0 {
failItems = append(failItems, &model.AppWarningConfigBatchFailItem{CardValue: cardValue, Reason: "请先保存预警配置"})
continue
}
seenCardIds[cardRow.Id] = struct{}{}
validCards = append(validCards, validCard{Value: cardValue, Row: cardRow})
}
now := gtime.Now()
err = dao.TWarnConfig.Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
for _, card := range validCards {
if _, err = dao.TWarnConfig.Ctx(ctx).TX(tx).
Where(dao.TWarnConfig.Columns().TenantId, user.TenantId).
Where(dao.TWarnConfig.Columns().ItemType, appWarningItemTypeCard).
Where(dao.TWarnConfig.Columns().ItemId, card.Row.Id).
Where(dao.TWarnConfig.Columns().WarnUnit, param.WarnUnit).
Data(do.TWarnConfig{
AppNotifyEnabled: appWarningNotifyEnabledValue(param.AppNotifyEnabled),
UpdatedBy: user.UserId,
UpdatedAt: now,
}).
Update(); err != nil {
return err
}
}
return nil
})
if err != nil {
return nil, gerror.Wrap(err, "批量设置小程序预警通知失败,请稍后重试")
}
wechatBound, wechatBindText, err := appUserWechatBindingStatus(ctx, user)
if err != nil {
return nil, err
}
return &model.AppWarningConfigBatchNotifyModel{
AppNotifyEnabled: appWarningNotifyEnabledValue(param.AppNotifyEnabled),
TotalCount: len(cardValues),
SuccessCount: len(validCards),
FailCount: len(failItems),
FailItems: failItems,
TemplateId: appWarningWechatTemplateId(ctx),
TemplateReady: appWarningTemplateReady(ctx),
WechatBound: wechatBound,
WechatBindText: wechatBindText,
}, nil
}
func (s *sAppWarning) resolveWarningCard(ctx context.Context, cardValue string) (*entity.SysUser, *appCardQueryRow, *model.AppCardModel, error) {
user, err := appCurrentUser(ctx)
if err != nil {
return nil, nil, nil, err
}
cardLogic := NewAppCard()
cardRow, err := cardLogic.findVisibleCard(ctx, user, cardValue)
if err != nil {
return nil, nil, nil, gerror.Wrap(err, "查询卡片失败,请稍后重试")
}
if cardRow == nil || cardRow.Id == 0 {
return nil, nil, nil, gerror.New("卡片不存在或不在当前账号可配置范围内")
}
if err = cardLogic.ensureOperateCard(ctx, user, cardRow, "配置预警"); err != nil {
return nil, nil, nil, err
}
return user, cardRow, cardLogic.cardRowToModel(ctx, cardRow, user, cardLogic.ownerType(ctx, user), true), nil
}
func (s *sAppWarning) configModel(ctx context.Context) *gdb.Model {
return dao.TWarnConfig.Ctx(ctx)
}
func (s *sAppWarning) findConfigByItem(ctx context.Context, tenantId string, itemId int64, warnUnit int) (*appWarningConfigRow, error) {
return s.findConfigByItemWithModel(
dao.TWarnConfig.Ctx(ctx),
tenantId,
itemId,
warnUnit,
)
}
func (s *sAppWarning) findConfigByItemWithTx(ctx context.Context, tx gdb.TX, tenantId string, itemId int64, warnUnit int) (*appWarningConfigRow, error) {
return s.findConfigByItemWithModel(
dao.TWarnConfig.Ctx(ctx).TX(tx),
tenantId,
itemId,
warnUnit,
)
}
func (s *sAppWarning) findConfigByItemWithModel(mod *gdb.Model, tenantId string, itemId int64, warnUnit int) (*appWarningConfigRow, error) {
var row *appWarningConfigRow
err := mod.
Where(dao.TWarnConfig.Columns().TenantId, tenantId).
Where(dao.TWarnConfig.Columns().ItemType, appWarningItemTypeCard).
Where(dao.TWarnConfig.Columns().ItemId, itemId).
Where(dao.TWarnConfig.Columns().WarnUnit, warnUnit).
Limit(1).
Scan(&row)
if err != nil {
return nil, gerror.Wrap(err, "查询预警配置失败,请稍后重试")
}
return row, nil
}
func (s *sAppWarning) prepareWarningSaveParam(
ctx context.Context,
tx gdb.TX,
user *entity.SysUser,
cardRow *appCardQueryRow,
param *model.AppWarningConfigSaveParam,
) (*model.AppWarningConfigSaveParam, error) {
if param == nil {
return nil, gerror.New("预警配置参数不能为空")
}
saveParam := *param
var (
config *appWarningConfigRow
err error
)
if tx != nil {
config, err = s.findConfigByItemWithTx(ctx, tx, user.TenantId, cardRow.Id, param.WarnUnit)
} else {
config, err = s.findConfigByItem(ctx, user.TenantId, cardRow.Id, param.WarnUnit)
}
if err != nil {
return nil, err
}
if config != nil {
if saveParam.IsEnabled == nil {
value := config.IsEnabled
saveParam.IsEnabled = &value
}
if saveParam.AppNotifyEnabled == nil {
value := config.AppNotifyEnabled
saveParam.AppNotifyEnabled = &value
}
}
return &saveParam, nil
}
func (s *sAppWarning) configRowsToModels(rows []*appWarningConfigRow) []*model.AppWarningConfigModel {
items := make([]*model.AppWarningConfigModel, 0, len(rows))
for _, row := range rows {
items = append(items, s.configRowToModel(row))
}
return items
}
func (s *sAppWarning) configRowToModel(row *appWarningConfigRow) *model.AppWarningConfigModel {
if row == nil {
return nil
}
warnType := appWarningTypeByUnit(row.WarnUnit)
return &model.AppWarningConfigModel{
Id: row.Id,
ItemType: row.ItemType,
ItemId: row.ItemId,
ItemCode: row.ItemCode,
WarnType: warnType,
WarnUnit: row.WarnUnit,
WarnTitle: appWarningTitle(row.WarnUnit),
UnitText: appWarningUnitText(row.WarnUnit),
FirstWarn: row.FirstWarn,
SecondWarn: row.SecondWarn,
ThirdWarn: row.ThirdWarn,
AutoAction: row.AutoAction,
IsEnabled: row.IsEnabled,
AppNotifyEnabled: row.AppNotifyEnabled,
WxTemplateId: row.WxTemplateId,
Remark: row.Remark,
UpdatedAt: row.UpdatedAt,
}
}
func normalizeAppWarningSaveParam(param *model.AppWarningConfigSaveParam) error {
if param == nil {
return gerror.New("预警配置参数不能为空")
}
param.CardValue = strings.TrimSpace(param.CardValue)
param.Remark = strings.TrimSpace(param.Remark)
if param.IsEnabled != nil && *param.IsEnabled != 0 && *param.IsEnabled != 1 {
return gerror.New("启停状态无效")
}
if param.AppNotifyEnabled != nil && *param.AppNotifyEnabled != 0 && *param.AppNotifyEnabled != 1 {
return gerror.New("小程序预警通知状态无效")
}
switch param.WarnUnit {
case appWarningUnitMb:
return validateAppWarningTrafficMb(param.FirstWarn, param.SecondWarn, param.ThirdWarn)
default:
return gerror.New("小程序仅支持按MB配置流量预警")
}
}
func normalizeAppWarningBatchSaveParam(param *model.AppWarningConfigBatchSaveParam) ([]string, []*model.AppWarningConfigSaveParam, error) {
if param == nil {
return nil, nil, gerror.New("批量预警配置参数不能为空")
}
cardValues, err := normalizeAppWarningCardValues(param.CardValues)
if err != nil {
return nil, nil, err
}
if len(cardValues) > 100 {
return nil, nil, gerror.New("单次批量预警配置最多支持100张卡")
}
configs := make([]*model.AppWarningConfigSaveParam, 0, len(param.Configs))
seenUnits := make(map[int]struct{}, len(param.Configs))
for _, config := range param.Configs {
if config == nil {
continue
}
copied := model.AppWarningConfigSaveParam{
WarnUnit: config.WarnUnit,
FirstWarn: config.FirstWarn,
SecondWarn: config.SecondWarn,
ThirdWarn: config.ThirdWarn,
IsEnabled: config.IsEnabled,
AppNotifyEnabled: config.AppNotifyEnabled,
Remark: config.Remark,
}
if _, exists := seenUnits[copied.WarnUnit]; exists {
return nil, nil, gerror.New("同一预警类型不能重复配置")
}
if err := normalizeAppWarningSaveParam(&copied); err != nil {
return nil, nil, err
}
seenUnits[copied.WarnUnit] = struct{}{}
configs = append(configs, &copied)
}
if len(configs) == 0 {
return nil, nil, gerror.New("请至少填写一项预警配置")
}
return cardValues, configs, nil
}
func normalizeAppWarningNotifyParam(param *model.AppWarningConfigNotifyParam) error {
if param == nil {
return gerror.New("小程序预警通知参数不能为空")
}
param.CardValue = strings.TrimSpace(param.CardValue)
if param.WarnUnit == 0 {
param.WarnUnit = appWarningUnitMb
}
if param.AppNotifyEnabled == nil {
return gerror.New("请选择是否开启小程序预警通知")
}
if *param.AppNotifyEnabled != 0 && *param.AppNotifyEnabled != 1 {
return gerror.New("小程序预警通知状态无效")
}
if param.WarnUnit != appWarningUnitMb {
return gerror.New("小程序仅支持配置MB流量预警通知")
}
return nil
}
func normalizeAppWarningBatchNotifyParam(param *model.AppWarningConfigBatchNotifyParam) ([]string, error) {
if param == nil {
return nil, gerror.New("批量小程序预警通知参数不能为空")
}
if param.WarnUnit == 0 {
param.WarnUnit = appWarningUnitMb
}
if param.AppNotifyEnabled == nil {
return nil, gerror.New("请选择是否开启小程序预警通知")
}
if *param.AppNotifyEnabled != 0 && *param.AppNotifyEnabled != 1 {
return nil, gerror.New("小程序预警通知状态无效")
}
if param.WarnUnit != appWarningUnitMb {
return nil, gerror.New("小程序仅支持配置MB流量预警通知")
}
cardValues, err := normalizeAppWarningCardValues(param.CardValues)
if err != nil {
return nil, err
}
if len(cardValues) > 100 {
return nil, gerror.New("单次批量预警通知最多支持100张卡")
}
return cardValues, nil
}
func normalizeAppWarningCardValues(values []string) ([]string, error) {
cardValues := make([]string, 0, len(values))
seenCards := make(map[string]struct{}, len(values))
for _, value := range values {
value = strings.TrimSpace(value)
if value == "" {
continue
}
if _, exists := seenCards[value]; exists {
continue
}
seenCards[value] = struct{}{}
cardValues = append(cardValues, value)
}
if len(cardValues) == 0 {
return nil, gerror.New("请选择需要配置预警的卡片")
}
return cardValues, nil
}
func appWarningBuildSaveRow(ctx context.Context, user *entity.SysUser, cardRow *appCardQueryRow, param *model.AppWarningConfigSaveParam, batchNo string, now *gtime.Time) do.TWarnConfig {
return do.TWarnConfig{
TenantId: user.TenantId,
BatchNo: batchNo,
ItemType: appWarningItemTypeCard,
ItemId: cardRow.Id,
ItemCode: appWarningCardCode(cardRow),
WarnUnit: param.WarnUnit,
FirstWarn: param.FirstWarn,
SecondWarn: param.SecondWarn,
ThirdWarn: param.ThirdWarn,
WarnMethods: appWarningMessageMethod,
WarnPhones: "",
WarnEmails: "",
AutoAction: 0,
IsEnabled: appWarningEnabledValue(param.IsEnabled),
AppNotifyEnabled: appWarningNotifyEnabledValue(param.AppNotifyEnabled),
WxTemplateId: appWarningWechatTemplateId(ctx),
Remark: strings.TrimSpace(param.Remark),
CreatedDept: appUserDeptOrDefault(user),
CreatedBy: user.UserId,
CreatedAt: now,
UpdatedBy: user.UserId,
UpdatedAt: now,
}
}
func appWarningSaveDuplicateExcludeFields() string {
columns := dao.TWarnConfig.Columns()
return strings.Join([]string{
columns.Id,
columns.TenantId,
columns.ItemType,
columns.ItemId,
columns.WarnUnit,
columns.CreatedDept,
columns.CreatedBy,
columns.CreatedAt,
}, ",")
}
func validateAppWarningTrafficMb(first, second, third float64) error {
if first <= 0 {
return gerror.New("第一档阈值必须大于0")
}
if second < 0 || third < 0 {
return gerror.New("预警阈值不能小于0")
}
if second > 0 && second <= first {
return gerror.New("第二档阈值必须大于第一档")
}
if third > 0 {
if second <= 0 {
return gerror.New("配置第三档时必须先配置第二档")
}
if third <= second {
return gerror.New("第三档阈值必须大于第二档")
}
}
return nil
}
func appWarningEnabledValue(value *int) int {
if value == nil {
return 1
}
return *value
}
func appWarningNotifyEnabledValue(value *int) int {
if value == nil {
return 0
}
return *value
}
func appWarningTypeByUnit(warnUnit int) int {
switch warnUnit {
case appWarningUnitMb:
return appWarningTypeCardTraffic
default:
return 0
}
}
func appWarningTitle(warnUnit int) string {
switch warnUnit {
case appWarningUnitMb:
return "流量使用预警"
default:
return "预警配置"
}
}
func appWarningUnitText(warnUnit int) string {
switch warnUnit {
case appWarningUnitMb:
return "MB"
default:
return ""
}
}
func appWarningCardCode(card *appCardQueryRow) string {
if card == nil {
return ""
}
return appFirstNotEmpty(card.Iccid, card.Msisdn, card.Imsi, card.Imei)
}
func appWarningWechatTemplateId(ctx context.Context) string {
return strings.TrimSpace(g.Cfg().MustGet(ctx, "appWarning.wechatSubscribeTemplateId", appWarningWechatTemplateIdDefault).String())
}
func appWarningTemplateReady(ctx context.Context) bool {
value := appWarningWechatTemplateId(ctx)
return value != "" && !strings.Contains(strings.ToUpper(value), "TODO") && !strings.Contains(strings.ToUpper(value), "REPLACE")
}