feat: support mf ticket management

This commit is contained in:
zhangsz
2025-07-01 16:48:51 +08:00
parent 4c2200b39b
commit fe7e4d9c88
5 changed files with 258 additions and 108 deletions

View File

@@ -78,11 +78,11 @@ func PostCDREventFrom(w http.ResponseWriter, r *http.Request) {
}
// MF网元类型特殊处理, 未接电话的回拨工单流转处理
if neTypeLower == "mf" && cdrEvent.CDR["agentName"] == "" {
if neTypeLower == "mf" && cdrEvent.CDR["recordType"] == "MOC" && cdrEvent.CDR["agentName"] == "" {
// 发送到MF网元
// 构造网元MF的API地址
url := fmt.Sprintf("http://%s:%d/ne/config/data?neType=%s&neId=%s&paramName=agents",
neInfo.IP, neInfo.Port, neInfo.NeType, neInfo.NeId)
url := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/agents",
neInfo.IP, neInfo.Port, strings.ToLower(neInfo.NeType))
// 发送HTTP请求获取座席列表
resp, err := http.Get(url)
if err != nil {
@@ -107,48 +107,44 @@ func PostCDREventFrom(w http.ResponseWriter, r *http.Request) {
// 调用服务获取最新一个被分配工单的座席和下一个要分配的座席
mfService := ueCallBackTicket.NewCallbackTicketService()
lastAgent, err := mfService.GetLastAssignedAgent()
lastAgentName, err := mfService.GetLastAssignedAgent()
if err != nil {
log.Error("Failed to get last assigned agent", err)
// 可以继续执行,不返回错误
}
// 选择下一个要分配的座席
selectedAgent := mfService.SelectNextAgent(agentResp.Data, lastAgent)
selectedAgent := mfService.SelectNextAgent(agentResp.Data, lastAgentName)
// 获取分配座席的邮箱
agentEmail := ""
for _, agent := range agentResp.Data {
if agent.Name == selectedAgent {
agentEmail = agent.Email
break
if selectedAgent != nil {
// 创建回调工单
var updatedAt *int64 = nil
ticket := ueCallBackTicket.CallbackTicket{
CallerNumber: cdrEvent.CDR["callerParty"].(string),
CalleeNumber: cdrEvent.CDR["calledParty"].(string),
Status: ueCallBackTicket.TicketStatusNew.Enum(),
AgentName: selectedAgent.Name,
AgentEmail: selectedAgent.Email,
AgentMobile: selectedAgent.Mobile,
Comment: "",
MsdData: cdrEvent.CDR["msdData"].(string),
RmUid: cdrEvent.RmUID,
CreatedAt: time.Now().UnixMicro(),
UpdatedAt: updatedAt,
}
if err := mfService.InsertCallbackTicket(ticket); err != nil {
log.Error("Failed to insert MF callback ticket", err)
// services.ResponseInternalServerError500ProcessError(w, err)
// return
}
// 新工单分配后发送邮件通知
if selectedAgent.Email != "" {
subject := "新工单分配通知"
body := fmt.Sprintf("您被分配了一个新的回拨工单,主叫号码:%s", ticket.CallerNumber)
go email.SendEmail(selectedAgent.Email, subject, body) // 异步发送
}
}
// 创建回调工单
var updatedAt *int64 = nil
ticket := ueCallBackTicket.CallbackTicket{
CallerNumber: cdrEvent.CDR["callerParty"].(string),
CalleeNumber: cdrEvent.CDR["calledParty"].(string),
Status: ueCallBackTicket.TicketStatusNew.Enum(),
AgentName: selectedAgent,
Comment: "",
MsdData: cdrEvent.CDR["msdData"].(string),
RmUid: cdrEvent.RmUID,
CreatedAt: time.Now().UnixMicro(),
UpdatedAt: updatedAt,
}
if err := mfService.InsertCallbackTicket(ticket); err != nil {
log.Error("Failed to insert MF callback ticket", err)
// services.ResponseInternalServerError500ProcessError(w, err)
// return
}
// 新工单分配后发送邮件通知
if agentEmail != "" {
subject := "新工单分配通知"
body := fmt.Sprintf("您被分配了一个新的回拨工单,主叫号码:%s", ticket.CallerNumber)
go email.SendEmail(agentEmail, subject, body) // 异步发送
}
log.Warn("No available agents found for callback ticket")
}
// MF网元类型特殊处理, 处理座席回拨的工单流转
@@ -193,12 +189,12 @@ func PostCDREventFrom(w http.ResponseWriter, r *http.Request) {
}
// 获取通话信息
answerTime, _ := cdrEvent.CDR["answerTime"].(string)
seizureTime, _ := cdrEvent.CDR["seizureTime"].(string)
releaseTime, _ := cdrEvent.CDR["releaseTime"].(string)
cause, _ := cdrEvent.CDR["cause"].(string)
// 处理回拨结果并更新工单
if err := mfService.ProcessCallbackResult(ticket, callDuration, answerTime, releaseTime, cause); err != nil {
if err := mfService.ProcessCallbackResult(ticket, callDuration, seizureTime, releaseTime, cause); err != nil {
log.Error("Failed to process callback result", err)
services.ResponseInternalServerError500ProcessError(w, err)
return