fix: mf cdr event adjust
This commit is contained in:
@@ -79,16 +79,34 @@ func PostCDREventFrom(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
// MF网元类型特殊处理, 未接电话的回拨工单流转处理
|
// MF网元类型特殊处理, 未接电话的回拨工单流转处理
|
||||||
if neTypeLower == "mf" && cdrEvent.CDR["recordType"] == "MOC" && cdrEvent.CDR["agentName"] == "" {
|
if neTypeLower == "mf" && cdrEvent.CDR["recordType"] == "MOC" && cdrEvent.CDR["agentName"] == "" {
|
||||||
// 发送到MF网元
|
|
||||||
// 构造网元MF的API地址
|
// 构造网元MF的API地址
|
||||||
url := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/agents",
|
url := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/agents",
|
||||||
neInfo.IP, neInfo.Port, strings.ToLower(neInfo.NeType))
|
neInfo.IP, neInfo.Port, strings.ToLower(neInfo.NeType))
|
||||||
|
if err := handleMFMissedCallCDR(url, cdrEvent); err != nil {
|
||||||
|
log.Error("Failed to handle MF missed call CDR", err)
|
||||||
|
services.ResponseInternalServerError500ProcessError(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MF网元类型特殊处理, 处理座席回拨的工单流转
|
||||||
|
if neTypeLower == "mf" && cdrEvent.CDR["recordType"] == "MTC" {
|
||||||
|
if err := handleMFCDRCallBack(cdrEvent); err != nil {
|
||||||
|
log.Error("Failed to handle MF CDR callback", err)
|
||||||
|
services.ResponseInternalServerError500ProcessError(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
services.ResponseStatusOK204NoContent(w)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MF网元类型特殊处理, 未接电话的回拨工单流转处理
|
||||||
|
func handleMFMissedCallCDR(url string, cdrEvent CDREvent) error {
|
||||||
// 发送HTTP请求获取座席列表
|
// 发送HTTP请求获取座席列表
|
||||||
resp, err := http.Get(url)
|
resp, err := http.Get(url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("Failed to get MF agents", err)
|
return fmt.Errorf("failed to get MF agents: %w", err)
|
||||||
services.ResponseInternalServerError500ProcessError(w, err)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
|
||||||
@@ -100,17 +118,14 @@ func PostCDREventFrom(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := json.NewDecoder(resp.Body).Decode(&agentResp); err != nil {
|
if err := json.NewDecoder(resp.Body).Decode(&agentResp); err != nil {
|
||||||
log.Error("Failed to decode MF agents response", err)
|
return fmt.Errorf("failed to decode MF agent response: %w", err)
|
||||||
services.ResponseInternalServerError500ProcessError(w, err)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 调用服务获取最新一个被分配工单的座席和下一个要分配的座席
|
// 调用服务获取最新一个被分配工单的座席和下一个要分配的座席
|
||||||
mfService := ueCallBackTicket.NewCallbackTicketService()
|
mfService := ueCallBackTicket.NewCallbackTicketService()
|
||||||
lastAgentName, err := mfService.GetLastAssignedAgent()
|
lastAgentName, err := mfService.GetLastAssignedAgent()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("Failed to get last assigned agent", err)
|
return fmt.Errorf("failed to get last assigned agent: %w", err)
|
||||||
// 可以继续执行,不返回错误
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 选择下一个要分配的座席
|
// 选择下一个要分配的座席
|
||||||
@@ -132,9 +147,7 @@ func PostCDREventFrom(w http.ResponseWriter, r *http.Request) {
|
|||||||
UpdatedAt: updatedAt,
|
UpdatedAt: updatedAt,
|
||||||
}
|
}
|
||||||
if err := mfService.InsertCallbackTicket(&ticket); err != nil {
|
if err := mfService.InsertCallbackTicket(&ticket); err != nil {
|
||||||
log.Error("Failed to insert MF callback ticket", err)
|
return fmt.Errorf("failed to insert MF callback ticket: %w", err)
|
||||||
// services.ResponseInternalServerError500ProcessError(w, err)
|
|
||||||
// return
|
|
||||||
}
|
}
|
||||||
// 新工单分配后发送邮件通知
|
// 新工单分配后发送邮件通知
|
||||||
if selectedAgent.Email != "" {
|
if selectedAgent.Email != "" {
|
||||||
@@ -164,21 +177,20 @@ func PostCDREventFrom(w http.ResponseWriter, r *http.Request) {
|
|||||||
ticket.TicketId, ticket.CallerNumber)
|
ticket.TicketId, ticket.CallerNumber)
|
||||||
go email.SendEmailWithGomail(emailCopy) // 异步发送
|
go email.SendEmailWithGomail(emailCopy) // 异步发送
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
log.Warn("No available agents found for callback ticket")
|
log.Warn("No available agents found for callback ticket")
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// MF网元类型特殊处理, 处理座席回拨的工单流转
|
func handleMFCDRCallBack(cdrEvent CDREvent) error {
|
||||||
if neTypeLower == "mf" && cdrEvent.CDR["recordType"] == "MTC" {
|
|
||||||
// 获取座席号码(主叫)和被叫号码
|
// 获取座席号码(主叫)和被叫号码
|
||||||
agentNumber, ok1 := cdrEvent.CDR["callerParty"].(string)
|
agentNumber, ok1 := cdrEvent.CDR["callerParty"].(string)
|
||||||
callerNumber, ok2 := cdrEvent.CDR["calledParty"].(string)
|
callerNumber, ok2 := cdrEvent.CDR["calledParty"].(string)
|
||||||
|
|
||||||
if !ok1 || !ok2 {
|
if !ok1 || !ok2 {
|
||||||
log.Error("Invalid CDR format: missing callerParty or calledParty")
|
return fmt.Errorf("invalid CDR format: missing callerParty or calledParty")
|
||||||
services.ResponseInternalServerError500ProcessError(w, fmt.Errorf("invalid CDR format"))
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取通话时长
|
// 获取通话时长
|
||||||
@@ -188,9 +200,7 @@ func PostCDREventFrom(w http.ResponseWriter, r *http.Request) {
|
|||||||
if durationInt, ok := cdrEvent.CDR["callDuration"].(int); ok {
|
if durationInt, ok := cdrEvent.CDR["callDuration"].(int); ok {
|
||||||
callDuration = float64(durationInt)
|
callDuration = float64(durationInt)
|
||||||
} else {
|
} else {
|
||||||
log.Error("Invalid CDR format: callDuration is not a number")
|
return fmt.Errorf("invalid CDR format: callDuration is not a number")
|
||||||
services.ResponseInternalServerError500ProcessError(w, fmt.Errorf("invalid CDR format"))
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -198,16 +208,12 @@ func PostCDREventFrom(w http.ResponseWriter, r *http.Request) {
|
|||||||
mfService := ueCallBackTicket.NewCallbackTicketService()
|
mfService := ueCallBackTicket.NewCallbackTicketService()
|
||||||
ticket, err := mfService.FindCallbackTicketByAgentAndCaller(agentNumber, callerNumber)
|
ticket, err := mfService.FindCallbackTicketByAgentAndCaller(agentNumber, callerNumber)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("Failed to find callback ticket", err)
|
return fmt.Errorf("failed to find callback ticket: %w", err)
|
||||||
services.ResponseInternalServerError500ProcessError(w, err)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ticket == nil {
|
if ticket == nil {
|
||||||
// 没有找到对应的工单,可能是手动呼叫,不处理
|
// 没有找到对应的工单,可能是手动呼叫,不处理
|
||||||
log.Warn(fmt.Sprintf("No callback ticket found for agent %s and caller %s", agentNumber, callerNumber))
|
return fmt.Errorf("no callback ticket found for agent %s and caller %s", agentNumber, callerNumber)
|
||||||
services.ResponseStatusOK204NoContent(w)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取通话信息
|
// 获取通话信息
|
||||||
@@ -217,13 +223,9 @@ func PostCDREventFrom(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
// 处理回拨结果并更新工单
|
// 处理回拨结果并更新工单
|
||||||
if err := mfService.ProcessCallbackResult(ticket, callDuration, seizureTime, releaseTime, cause); err != nil {
|
if err := mfService.ProcessCallbackResult(ticket, callDuration, seizureTime, releaseTime, cause); err != nil {
|
||||||
log.Error("Failed to process callback result", err)
|
return fmt.Errorf("failed to process callback result: %w", err)
|
||||||
services.ResponseInternalServerError500ProcessError(w, err)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Info(fmt.Sprintf("Successfully processed callback for ticket %d", ticket.TicketId))
|
log.Info(fmt.Sprintf("Successfully processed callback for ticket %d", ticket.TicketId))
|
||||||
}
|
return nil
|
||||||
|
|
||||||
services.ResponseStatusOK204NoContent(w)
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user