feat: support ticket settings in OMC
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
// 以下是具体的配置获取方法
|
||||
|
||||
@@ -11,16 +11,16 @@ import (
|
||||
)
|
||||
|
||||
type EmailConfig struct {
|
||||
Enabled bool `yaml:"enabled"` // 是否启用邮件发送
|
||||
Host string `yaml:"host"`
|
||||
Port int `yaml:"port"`
|
||||
Username string `yaml:"username"`
|
||||
Password string `yaml:"password"`
|
||||
TLSSkipVerify bool `yaml:"tlsSkipVerify"`
|
||||
From string `yaml:"from"`
|
||||
To []string `yaml:"to"`
|
||||
Subject string `yaml:"subject"`
|
||||
Body string `yaml:"body"`
|
||||
Enabled bool `yaml:"enabled" json:"enabled"` // 是否启用邮件发送
|
||||
Host string `yaml:"host" json:"host"` // SMTP服务器地址
|
||||
Port int `yaml:"port" json:"port"` // SMTP服务器端口
|
||||
Username string `yaml:"username" json:"username"` // SMTP用户名
|
||||
Password string `yaml:"password" json:"password"` // SMTP密码
|
||||
TLSSkipVerify bool `yaml:"tlsSkipVerify" json:"tlsSkipVerify"` // 是否跳过TLS证书验证
|
||||
From string `yaml:"from" json:"from"` // 发件人邮箱地址
|
||||
To string `yaml:"to" json:"to"` // 收件人邮箱地址列表
|
||||
Subject string `yaml:"subject" json:"subject"` // 邮件主题
|
||||
Body string `yaml:"body" json:"body"` // 邮件正文内容
|
||||
}
|
||||
|
||||
// 简单邮件发送函数
|
||||
@@ -31,7 +31,7 @@ func SendEmail(email EmailConfig) error {
|
||||
username := email.Username
|
||||
from := email.From
|
||||
password := email.Password
|
||||
to := strings.Join(email.To, ",") // 将多个收件人用逗号连接
|
||||
to := email.To
|
||||
subject := email.Subject
|
||||
body := email.Body
|
||||
smtpHost := email.Host
|
||||
@@ -48,7 +48,7 @@ func SendEmail(email EmailConfig) error {
|
||||
func SendEmailWithGomail(email EmailConfig) error {
|
||||
m := gomail.NewMessage()
|
||||
m.SetHeader("From", email.From)
|
||||
m.SetHeader("To", email.To...)
|
||||
m.SetHeader("To", strings.Split(email.To, ",")...) // 支持多个收件人
|
||||
m.SetHeader("Subject", email.Subject)
|
||||
m.SetBody("text/plain", email.Body)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user