feat: new

This commit is contained in:
zhangsz
2025-06-16 11:28:45 +08:00
parent 147ae77249
commit cda02d6b5c
9 changed files with 99 additions and 29 deletions

View File

@@ -93,15 +93,9 @@ func PostCDREventFrom(w http.ResponseWriter, r *http.Request) {
// 解析座席列表响应
var agentResp struct {
Code int `json:"code"`
Data []struct {
Domain string `json:"domain"`
Index int `json:"index"`
Name string `json:"name"`
Online bool `json:"online"`
Password string `json:"password"`
} `json:"data"`
Msg string `json:"msg"`
Code int `json:"code"`
Data []ueCallBackTicket.AgentInfo `json:"data"`
Msg string `json:"msg"`
}
if err := json.NewDecoder(resp.Body).Decode(&agentResp); err != nil {
@@ -130,6 +124,7 @@ func PostCDREventFrom(w http.ResponseWriter, r *http.Request) {
AgentName: selectedAgent,
Comment: "",
MsdData: cdrEvent.CDR["msdData"].(string),
RmUid: cdrEvent.RmUID,
CreatedAt: time.Now().UnixMicro(),
UpdatedAt: updatedAt,
}

View File

@@ -105,10 +105,21 @@ type CallbackTicket struct {
AgentName string `json:"agentName" gorm:"column:agent_name"` // 坐席名称
Comment string `json:"comment" gorm:"column:comment"` // 工单备注
MsdData string `json:"msdData" gorm:"column:msd_data"` // MSD数据
RmUid string `json:"rmUid" gorm:"column:rm_uid"` // RM用户ID
CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 创建时间
UpdatedAt *int64 `json:"updatedAt" gorm:"column:updated_at;autoUpdateTime:false"` // 更新时间
}
type AgentInfo struct {
Index int `json:"index"`
Name string `json:"name"`
Online bool `json:"online"`
Email string `json:"email"`
Mobile string `json:"mobile"`
Domain string `json:"domain"`
Password string `json:"password"`
}
// TableName 表名称
func (*CallbackTicket) TableName() string {
return "mf_callback_ticket"

View File

@@ -180,13 +180,7 @@ func (s *CallbackTicketService) GetLastAssignedAgent() (string, error) {
// @param agents 座席列表
// @param lastAgentName 上一个座席名称
// @return string 下一个座席名称
func (s *CallbackTicketService) SelectNextAgent(agents []struct {
Domain string `json:"domain"`
Index int `json:"index"`
Name string `json:"name"`
Online bool `json:"online"`
Password string `json:"password"`
}, lastAgentName string) string {
func (s *CallbackTicketService) SelectNextAgent(agents []AgentInfo, lastAgentName string) string {
if len(agents) == 0 {
return ""
}
@@ -330,24 +324,44 @@ func (s *CallbackTicketService) FindTimeoutTickets(status string, timeoutMicros
// @param ticket 要更新的工单
// @param originalStatus 原工单状态
// @return error 错误信息
func (s *CallbackTicketService) UpdateTicketToTimeout(ticket *CallbackTicket, originalStatus string) error {
func (s *CallbackTicketService) UpdateTicketToTimeout(ticket *CallbackTicket, originalStatus string, agents []AgentInfo) error {
if ticket == nil {
return fmt.Errorf("ticket cannot be nil")
}
now := time.Now().UnixMicro()
// 1. 更新原工单为超时
updatedTicket := CallbackTicket{
TicketId: ticket.TicketId,
Status: TicketStatusTimeout.Enum(),
Comment: fmt.Sprintf("%s - 工单状态为 %s 处理超时,系统自动更新为超时状态", ticket.Comment, originalStatus),
UpdatedAt: &now,
}
if err := s.db.Table("mf_callback_ticket").
Where("ticket_id = ?", ticket.TicketId).
Updates(updatedTicket).Error; err != nil {
return fmt.Errorf("更新工单 %d 状态失败: %w", ticket.TicketId, err)
}
// 2. 选择新座席
lastAgent := ticket.AgentName
newAgent := s.SelectNextAgent(agents, lastAgent)
// 3. 创建新工单
newTicket := CallbackTicket{
CallerNumber: ticket.CallerNumber,
CalleeNumber: ticket.CalleeNumber,
Status: TicketStatusNew.Enum(),
AgentName: newAgent,
Comment: fmt.Sprintf("由超时工单 %d 自动重建", ticket.TicketId),
MsdData: ticket.MsdData,
RmUid: ticket.RmUid,
CreatedAt: now,
UpdatedAt: nil,
}
if err := s.db.Table("mf_callback_ticket").Create(&newTicket).Error; err != nil {
return fmt.Errorf("创建新工单失败: %w", err)
}
return nil
}