feat: support ticket settings in OMC

This commit is contained in:
zhangsz
2025-07-08 14:45:46 +08:00
parent 39ae16cf42
commit 8d76d68b96
11 changed files with 306 additions and 72 deletions

View File

@@ -264,7 +264,13 @@ func InitPsapConfig() error {
return nil
}
_, err := ReadPsapConfig(yamlConfig.PsapConfig.File)
// 确保使用正确的配置文件路径
configFile := yamlConfig.PsapConfig.File
if configFile == "" {
configFile = "./etc/psap.yaml" // 默认路径
}
_, err := ReadPsapConfig(configFile)
return err
}
@@ -320,6 +326,12 @@ func WriteOrignalConfig(configFile string, paramName string, paramData map[strin
for k, v := range paramData {
// find the first line nearby the paramName
for j := i + 1; j < len(lines); j++ {
// ignore comment lines
trimmedLine := strings.TrimSpace(lines[j])
if strings.HasPrefix(trimmedLine, "#") {
continue
}
if strings.Contains(lines[j], k+":") {
index := strings.Index(lines[j], k)
// Determine the type of v

View File

@@ -1,8 +1,11 @@
package config
import (
"bufio"
"fmt"
"os"
"reflect"
"strings"
"be.ems/lib/email"
"gopkg.in/yaml.v3"
@@ -11,24 +14,27 @@ import (
// PsapConfig PSAP配置结构体
type PsapConfig struct {
Ticket struct {
Notification struct {
SMTP email.EmailConfig `yaml:"smtp"`
} `yaml:"notifcation"` // 注意:配置文件中是 "notifcation",保持一致
Timeout struct {
// 时间单位为分钟
New int `yaml:"new"` // NEW状态超时时间分钟
InProgress int `yaml:"inProgress"` // IN_PROGRESS状态超时时间(分钟)
NoAnswer1 int `yaml:"noAnswer1"` // NO_ANSWER_1状态超时时间(分钟)
NoAnswer2 int `yaml:"noAnswer2"` // NO_ANSWER_2状态超时时间(分钟)
NearlyTimeout int `yaml:"nearlyTimeout"` // 提前提醒时间(分钟)
} `yaml:"timeout"`
} `yaml:"ticket"`
TicketNotification email.EmailConfig `yaml:"ticketNotification" json:"ticketNotification"` // 注意:配置文件中是 "ticketNotification",保持一致
TicketTimeout TicketTimeout `yaml:"ticketTimeout" json:"ticketTimeout"` // 注意:配置文件中是 "ticketTimeout",保持一致{
} `yaml:"ticket" json:"ticket"` // PSAP工单相关配置
}
type TicketTimeout struct {
New int `yaml:"new" json:"new"` // NEW状态超时时间(分钟)
InProgress int `yaml:"inProgress" json:"inProgress"` // IN_PROGRESS状态超时时间(分钟)
NoAnswer1 int `yaml:"noAnswer1" json:"noAnswer1"` // NO_ANSWER_1状态超时时间(分钟)
NoAnswer2 int `yaml:"noAnswer2" json:"noAnswer2"` // NO_ANSWER_2状态超时时间(分钟)
NearlyTimeout int `yaml:"nearlyTimeout" json:"nearlyTimeout"` // 提前提醒时间(分钟)
}
var psapConfig *PsapConfig
var PsapYamlConfigInfo YamlConfigFile = YamlConfigFile{}
// ReadPsapConfig 读取PSAP配置文件
func ReadPsapConfig(configFile string) (*PsapConfig, error) {
PsapYamlConfigInfo.FilePath = configFile
yamlFile, err := os.ReadFile(configFile)
if err != nil {
return nil, fmt.Errorf("read psap config file error: %w", err)
@@ -41,9 +47,110 @@ func ReadPsapConfig(configFile string) (*PsapConfig, error) {
}
psapConfig = &config
// PsapYamlConfigInfo.ConfigLines = config
// 读取原始文件行
err = ReadPsapOriginalConfig(configFile)
if err != nil {
return nil, fmt.Errorf("read psap original config error: %w", err)
}
return &config, nil
}
// ReadPsapOriginalConfig 读取PSAP原始配置文件行
func ReadPsapOriginalConfig(configFile string) error {
inputFile, err := os.Open(configFile)
if err != nil {
return fmt.Errorf("failed to open psap config file: %w", err)
}
defer inputFile.Close()
// 清空之前的内容
PsapYamlConfigInfo.OrignalLines = nil
scanner := bufio.NewScanner(inputFile)
for scanner.Scan() {
PsapYamlConfigInfo.OrignalLines = append(PsapYamlConfigInfo.OrignalLines, scanner.Text())
}
if err := scanner.Err(); err != nil {
return fmt.Errorf("failed to scan psap config file: %w", err)
}
return nil
}
// WritePsapOriginalConfig 写回PSAP原始配置文件
func WritePsapOriginalConfig(configFile string, paramName string, paramData map[string]any) error {
lines := PsapYamlConfigInfo.OrignalLines
for i, line := range lines {
if strings.Contains(line, paramName) {
for k, v := range paramData {
// 在paramName附近查找对应的字段
for j := i + 1; j < len(lines); j++ {
// 跳过注释行
trimmedLine := strings.TrimSpace(lines[j])
if strings.HasPrefix(trimmedLine, "#") {
continue
}
if strings.Contains(lines[j], k+":") {
index := strings.Index(lines[j], k)
// 根据v的类型确定格式
switch v := v.(type) {
case string:
lines[j] = lines[j][:index] + fmt.Sprintf("%s: \"%s\"", k, v)
case bool:
lines[j] = lines[j][:index] + fmt.Sprintf("%s: %t", k, v)
default:
lines[j] = lines[j][:index] + fmt.Sprintf("%s: %v", k, v)
}
break
}
}
}
break
}
}
// 写回yaml文件
outputFile, err := os.Create(configFile)
if err != nil {
return fmt.Errorf("failed to create psap config file: %w", err)
}
defer outputFile.Close()
writer := bufio.NewWriter(outputFile)
for _, line := range PsapYamlConfigInfo.OrignalLines {
writer.WriteString(line + "\n")
}
return writer.Flush()
}
// UpdatePsapStructFromMap 更新PSAP结构体字段
func UpdatePsapStructFromMap(s any, updates map[string]any) {
v := reflect.ValueOf(s).Elem()
t := v.Type()
for key, value := range updates {
for i := 0; i < t.NumField(); i++ {
field := t.Field(i)
if field.Tag.Get("json") == key {
structField := v.FieldByName(field.Name)
if structField.IsValid() && structField.CanSet() {
// 转换值为适当的类型
convertedValue := reflect.ValueOf(value).Convert(structField.Type())
if structField.Type() == convertedValue.Type() {
structField.Set(convertedValue)
}
}
break
}
}
}
}
// GetPsapConfig 获取PSAP配置
func GetPsapConfig() *PsapConfig {
if psapConfig == nil {
@@ -64,22 +171,16 @@ func GetSMTPConfig() *email.EmailConfig {
if config == nil {
return nil
}
return &config.Ticket.Notification.SMTP
return &config.Ticket.TicketNotification
}
// GetTimeoutConfig 获取超时配置
func GetTimeoutConfig() *struct {
New int `yaml:"new"`
InProgress int `yaml:"inProgress"`
NoAnswer1 int `yaml:"noAnswer1"`
NoAnswer2 int `yaml:"noAnswer2"`
NearlyTimeout int `yaml:"nearlyTimeout"`
} {
func GetTimeoutConfig() *TicketTimeout {
config := GetPsapConfig()
if config == nil {
return nil
}
return &config.Ticket.Timeout
return &config.Ticket.TicketTimeout
}
// 以下是具体的配置获取方法