feat: new
This commit is contained in:
@@ -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,
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user