dujunchen il y a 3 mois
Parent
commit
2cee0b4c90

+ 27 - 14
internal/app/ami/action/call.go

@@ -98,9 +98,20 @@ func HangupTask(TaskName string) {
 // interrupt the running task
 func InterruptRunningTask(toRunTask string) {
 
-	taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask()
-	if !ok {
-		return
+	var task priority.TaskInfo
+	var taskName string
+	var ok bool
+
+	if toRunTask != "PA" && toRunTask != "PAD-ICP" && toRunTask != "PAD-TMS" { // ignore C2C
+		taskName, task, ok = priority.RegistryTask.HighestPriorityRunningTask1()
+		if !ok {
+			return
+		}
+	} else { // have to check C2C
+		taskName, task, ok = priority.RegistryTask.HighestPriorityRunningTask()
+		if !ok {
+			return
+		}
 	}
 
 	lfshook.NewLogger().Infof("===InterruptRunningTask=toRuntask=%s==RunningTask:%s===chan:%s", toRunTask, taskName, task.RunChannel)
@@ -122,17 +133,17 @@ func InterruptRunningTask(toRunTask string) {
 	switch task.RunType {
 	case "CPA":
 		//kick CPA members
-		taskTmp, ok := priority.RegistryTask.Get("CPA")
-		if ok {
-			CPAConfbridgeKick(taskTmp.ConfbridgeID)
-		}
+		//taskTmp, ok := priority.RegistryTask.Get("CPA")
+		//if ok {
+		CPAConfbridgeKick(task.ConfbridgeID)
+		//}
 
 	case "EMG":
 		//kick EMG members
-		taskTmp, ok := priority.RegistryTask.Get("EMG")
-		if ok {
-			EMGConfbridgeKick(taskTmp.ConfbridgeID)
-		}
+		//taskTmp, ok := priority.RegistryTask.Get("EMG")
+		//if ok {
+		EMGConfbridgeKick(task.ConfbridgeID)
+		//}
 
 	case "C2C": // Interrupt C2C task running,
 		if toRunTask == "PA" || toRunTask == "PAD-ICP" || toRunTask == "PAD-TMS" {
@@ -442,6 +453,7 @@ func SetPadTimer() {
 	if res.Calls != "0" {
 
 		lfshook.NewLogger().Infof("==SetPadTimer==QueueTimer===1====")
+		active.SetTimer = true
 		active.QueueTimer = time.AfterFunc(30*time.Second, func() { // check the PAD 30s timeout
 
 			res, err := QueueStatus("0301", "") // check OCC queue , if empty OCC-PAD start
@@ -513,7 +525,7 @@ func CPAConfbridgeKick(confnum string) (res map[string]string, err error) {
 
 func CPAConfbridgeReinvite(confID string) {
 	lfshook.NewLogger().Infof("=====CPAConfbridgeReinvite==")
-
+	time.Sleep(time.Millisecond * 500)
 	for _, ext := range Speakers {
 		ConfbridgeReinvite(ext, "call-speakers-cpa", confID)
 	}
@@ -537,8 +549,9 @@ func EMGConfbridgeKick(confnum string) (res map[string]string, err error) {
 
 func EMGConfbridgeReinvite(confID string) {
 	lfshook.NewLogger().Infof("=======EMGConfbridgeReinvite==")
-	time.Sleep(time.Millisecond * 800)
+	time.Sleep(time.Millisecond * 500)
 	for _, ext := range Speakers {
+		lfshook.NewLogger().Infof("====1===EMGConfbridgeReinvite==")
 		ConfbridgeReinvite(ext, "call-speakers-emg", confID)
 	}
 
@@ -571,7 +584,7 @@ func ConfbridgeList(confnum string) (chans []string, err error) {
 }
 
 func ConfbridgeReinvite(src, context, confID string) {
-
+	lfshook.NewLogger().Infof("========ConfbridgeReinvite=======ext:%s==conf:%s===========", src, confID)
 	if ExtenStatus(src) != "Idle" {
 		//lfshook.NewLogger().Infof("===============ext:%s==!Idle===========", src)
 		return

+ 64 - 55
internal/app/ami/action/index.go

@@ -89,7 +89,7 @@ func HandleAMI(event map[string]string) {
 			if priority.CheckPriority("CabCab") { // interrupt OCC-PAD
 				//C2C start PAD interrupt
 
-				taskName, _, ok := priority.RegistryTask.HighestPriorityRunningTask()
+				taskName, _, ok := priority.RegistryTask.HighestPriorityRunningTask1()
 
 				lfshook.NewLogger().Infof("=======HighestPriorityRunningTask %+v", ok)
 				if ok {
@@ -235,7 +235,7 @@ func HandleAMI(event map[string]string) {
 
 				//check resume
 				priority.RegistryTask.StopAndUnregister("PAD-OCC")
-				taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask()
+				taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
 				if ok {
 					if taskName == "EMG" {
 						EMGConfbridgeReinvite(task.ConfbridgeID)
@@ -338,7 +338,7 @@ func HandleAMI(event map[string]string) {
 						priority.RegistryTask.StopAndUnregister("PAD-OCC")
 
 						//check resume
-						taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask()
+						taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
 						if ok {
 							if taskName == "EMG" {
 								EMGConfbridgeReinvite(task.ConfbridgeID)
@@ -387,7 +387,7 @@ func HandleAMI(event map[string]string) {
 				lfshook.NewLogger().Infof("==2=QueueCallerJoin===runing:%d=====toRun:=%d==Status:%s", taskTmp, toRunpriority, event["ChannelStateDesc"])
 
 				//if (priority.RunningTypePriority > toRunpriority || priority.RunningTypePriority == 0) && event["ChannelStateDesc"] != "Up" {
-
+				active.SetTimer = true
 				active.QueueTimer = time.AfterFunc(30*time.Second, func() { // check the PAD 30s timeout
 
 					res, err := QueueStatus("0301", "") // check OCC queue , if empty OCC-PAD start
@@ -485,7 +485,10 @@ func HandleAMI(event map[string]string) {
 				alstatus.PaStatus("", "EMG", "start")
 				//check PAD timer
 				if priority.AllTasks.PADOCC.Priority > priority.AllTasks.EMG.Priority {
-					active.QueueTimer.Stop()
+					if active.SetTimer {
+						active.QueueTimer.Stop()
+						active.SetTimer = false
+					}
 				}
 
 				return
@@ -506,7 +509,10 @@ func HandleAMI(event map[string]string) {
 
 				//check PAD timer
 				if priority.AllTasks.PADOCC.Priority > priority.AllTasks.SPC.Priority {
-					active.QueueTimer.Stop()
+					if active.SetTimer {
+						active.QueueTimer.Stop()
+						active.SetTimer = false
+					}
 				}
 
 				return
@@ -526,7 +532,10 @@ func HandleAMI(event map[string]string) {
 				alstatus.PaStatus("", "DCS", "start")
 				//check PAD timer
 				if priority.AllTasks.PADOCC.Priority > priority.AllTasks.DCS.Priority {
-					active.QueueTimer.Stop()
+					if active.SetTimer {
+						active.QueueTimer.Stop()
+						active.SetTimer = false
+					}
 				}
 
 				return
@@ -548,7 +557,10 @@ func HandleAMI(event map[string]string) {
 
 				//check PAD timer
 				if priority.AllTasks.PADOCC.Priority > priority.AllTasks.STN.Priority {
-					active.QueueTimer.Stop()
+					if active.SetTimer {
+						active.QueueTimer.Stop()
+						active.SetTimer = false
+					}
 				}
 
 				return
@@ -570,7 +582,10 @@ func HandleAMI(event map[string]string) {
 
 				//check PAD timer
 				if priority.AllTasks.PADOCC.Priority > priority.AllTasks.CHK.Priority {
-					active.QueueTimer.Stop()
+					if active.SetTimer {
+						active.QueueTimer.Stop()
+						active.SetTimer = false
+					}
 				}
 				return
 			}
@@ -590,7 +605,10 @@ func HandleAMI(event map[string]string) {
 
 				//check PAD timer
 				if priority.AllTasks.PADOCC.Priority > priority.AllTasks.VOL.Priority {
-					active.QueueTimer.Stop()
+					if active.SetTimer {
+						active.QueueTimer.Stop()
+						active.SetTimer = false
+					}
 				}
 
 				return
@@ -620,7 +638,10 @@ func HandleAMI(event map[string]string) {
 
 			//check PAD timer
 			if priority.AllTasks.PADOCC.Priority > priority.AllTasks.PA.Priority {
-				active.QueueTimer.Stop()
+				if active.SetTimer {
+					active.QueueTimer.Stop()
+					active.SetTimer = false
+				}
 			}
 
 			break
@@ -640,7 +661,10 @@ func HandleAMI(event map[string]string) {
 
 			//check PAD timer
 			if priority.AllTasks.PADOCC.Priority > priority.AllTasks.CPA.Priority {
-				active.QueueTimer.Stop()
+				if active.SetTimer {
+					active.QueueTimer.Stop()
+					active.SetTimer = false
+				}
 			}
 
 			return
@@ -715,13 +739,12 @@ func HandleAMI(event map[string]string) {
 		lfshook.NewLogger().Infof("=========%s", event["Event"])
 		if utils.IsICP(event["CallerIDNum"]) && event["Exten"] == "0500" { // PA end
 
-			SetPadTimer()
 			alstatus.PaStatus(event["CallerIDNum"], "PA", "end")
 
 			priority.RegistryTask.StopAndUnregister("PA")
-
+			SetPadTimer()
 			// check resume
-			taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask()
+			taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
 			if ok {
 				if taskName == "EMG" {
 					EMGConfbridgeReinvite(task.ConfbridgeID)
@@ -730,22 +753,8 @@ func HandleAMI(event map[string]string) {
 				}
 			}
 
-			//lfshook.NewLogger().Infof("====active.EMGCONFID:%s ====active.ICPCONBID:=%s", active.EMGCONFID, active.ICPCONBID)
-			/*
-				if priority.AllTasks.EMG.ConfbridgeID != "" {
-
-					time.Sleep(time.Millisecond * 300)
-					EMGConfbridgeReinvite(priority.AllTasks.EMG.ConfbridgeID)
-					return
-				}
-
-				if active.ICPCONBID != "" {
-					ConfbridgeKick(active.ICPCONBID, "all")
-					active.ICPCONBID = ""
-				}*/
 		} else if utils.IsIO(event["CallerIDNum"]) && event["Exten"] == "0501" { //CPA end
 
-			SetPadTimer()
 			alstatus.PaStatus(event["CallerIDNum"], "CPA", "end")
 
 			//CPA
@@ -754,9 +763,9 @@ func HandleAMI(event map[string]string) {
 				ConfbridgeKick(taskTmp.ConfbridgeID, "all")
 			}
 			priority.RegistryTask.StopAndUnregister("CPA")
-
+			SetPadTimer()
 			//check resume
-			taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask()
+			taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
 			if ok {
 				if taskName == "EMG" {
 					EMGConfbridgeReinvite(task.ConfbridgeID)
@@ -766,7 +775,6 @@ func HandleAMI(event map[string]string) {
 			//lfshook.NewLogger().Infof("=========%s", event["Event"])
 		} else if event["CallerIDName"] == "EMG" && event["Exten"] == "0502" { // EMG broadcast hangup
 
-			SetPadTimer()
 			alstatus.PaStatus(event["CallerIDName"], "EMG", "end")
 
 			//EMG
@@ -775,9 +783,9 @@ func HandleAMI(event map[string]string) {
 				ConfbridgeKick(taskTmp.ConfbridgeID, "all")
 			}
 			priority.RegistryTask.StopAndUnregister("EMG")
-
+			SetPadTimer()
 			//check resume
-			taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask()
+			taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
 			if ok {
 				if taskName == "CPA" {
 					CPAConfbridgeReinvite(task.ConfbridgeID)
@@ -786,7 +794,6 @@ func HandleAMI(event map[string]string) {
 
 		} else if event["CallerIDName"] == "STN" && event["Exten"] == "0503" {
 
-			SetPadTimer()
 			alstatus.PaStatus(event["CallerIDName"], "STN", "end")
 
 			//STN
@@ -795,9 +802,9 @@ func HandleAMI(event map[string]string) {
 				ConfbridgeKick(taskTmp.ConfbridgeID, "all")
 			}
 			priority.RegistryTask.StopAndUnregister("STN")
-
+			SetPadTimer()
 			//check resume
-			taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask()
+			taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
 			if ok {
 				if taskName == "CPA" {
 					CPAConfbridgeReinvite(task.ConfbridgeID)
@@ -808,7 +815,6 @@ func HandleAMI(event map[string]string) {
 
 		} else if event["CallerIDName"] == "DCS" && event["Exten"] == "0504" {
 
-			SetPadTimer()
 			alstatus.PaStatus(event["CallerIDName"], "DCS", "end")
 
 			//DSC
@@ -817,9 +823,9 @@ func HandleAMI(event map[string]string) {
 				ConfbridgeKick(taskTmp.ConfbridgeID, "all")
 			}
 			priority.RegistryTask.StopAndUnregister("DCS")
-
+			SetPadTimer()
 			//check resume
-			taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask()
+			taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
 			if ok {
 				if taskName == "CPA" {
 					CPAConfbridgeReinvite(task.ConfbridgeID)
@@ -830,7 +836,6 @@ func HandleAMI(event map[string]string) {
 
 		} else if event["CallerIDName"] == "SPC" && event["Exten"] == "0505" {
 
-			SetPadTimer()
 			alstatus.PaStatus(event["CallerIDName"], "SPC", "end")
 
 			//SPC
@@ -839,9 +844,9 @@ func HandleAMI(event map[string]string) {
 				ConfbridgeKick(taskTmp.ConfbridgeID, "all")
 			}
 			priority.RegistryTask.StopAndUnregister("SPC")
-
+			SetPadTimer()
 			//check resume
-			taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask()
+			taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
 			if ok {
 				if taskName == "CPA" {
 					CPAConfbridgeReinvite(task.ConfbridgeID)
@@ -851,7 +856,7 @@ func HandleAMI(event map[string]string) {
 			}
 
 		} else if event["CallerIDName"] == "CHK" && event["Exten"] == "0510" {
-			SetPadTimer()
+
 			alstatus.PaStatus(event["CallerIDName"], "CHK", "end")
 
 			//CHK
@@ -860,9 +865,9 @@ func HandleAMI(event map[string]string) {
 				ConfbridgeKick(taskTmp.ConfbridgeID, "all")
 			}
 			priority.RegistryTask.StopAndUnregister("CHK")
-
+			SetPadTimer()
 			//check resume
-			taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask()
+			taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
 			if ok {
 				if taskName == "CPA" {
 					CPAConfbridgeReinvite(task.ConfbridgeID)
@@ -872,7 +877,7 @@ func HandleAMI(event map[string]string) {
 			}
 
 		} else if event["CallerIDName"] == "VOL" && event["Exten"] == "0513" {
-			SetPadTimer()
+
 			alstatus.PaStatus(event["CallerIDName"], "VOL", "end")
 
 			//VOL
@@ -881,9 +886,9 @@ func HandleAMI(event map[string]string) {
 				ConfbridgeKick(taskTmp.ConfbridgeID, "all")
 			}
 			priority.RegistryTask.StopAndUnregister("VOL")
-
+			SetPadTimer()
 			//check resume
-			taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask()
+			taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
 			if ok {
 				if taskName == "CPA" {
 					CPAConfbridgeReinvite(task.ConfbridgeID)
@@ -913,7 +918,10 @@ func HandleAMI(event map[string]string) {
 
 			//check PAD timer
 			if priority.AllTasks.PADOCC.Priority > priority.AllTasks.C2C.Priority {
-				active.QueueTimer.Stop()
+				if active.SetTimer {
+					active.QueueTimer.Stop()
+					active.SetTimer = false
+				}
 			}
 
 		} else if utils.IsICP(event["CallerIDNum"]) && utils.IsICP(event["ConnectedLineNum"]) && event["DialStatus"] == "NOANSWER" {
@@ -923,7 +931,7 @@ func HandleAMI(event map[string]string) {
 			time.Sleep(time.Millisecond * 300)
 
 			//check resume
-			taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask()
+			taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
 			if ok {
 				ICPConfbridgeReinvite(task.ConfbridgeID, taskName)
 			}
@@ -933,13 +941,13 @@ func HandleAMI(event map[string]string) {
 		//lfshook.NewLogger().Infof("=========%s", event["Event"])
 		//Cab Cab end
 		if utils.IsICP(event["CallerIDNum"]) && utils.IsICP(event["ConnectedLineNum"]) && event["Exten"] == "0400" {
-			SetPadTimer()
+
 			alstatus.PaStatus(event["CallerIDNum"], "C2C", "end")
 			priority.RegistryTask.StopAndUnregister("C2C")
 			time.Sleep(time.Millisecond * 300)
-
+			SetPadTimer()
 			//check resume
-			taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask()
+			taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
 			if ok {
 				ICPConfbridgeReinvite(task.ConfbridgeID, taskName)
 			}
@@ -961,6 +969,7 @@ func HandleAMI(event map[string]string) {
 		if utils.IsIO(event["CallerIDNum"]) && utils.IsPAIU(event["ConnectedLineNum"]) {
 			if priority.PADOccStart == 0 {
 				alstatus.OccPad("start")
+
 				priority.PADOccStart = 1
 				if priority.PADStart == 0 {
 					alstatus.PaStatus(event["CallerIDNum"], "PAD", "start")
@@ -974,7 +983,7 @@ func HandleAMI(event map[string]string) {
 						ConfbridgeID: "",
 						Running:      true,
 					}
-					priority.RegistryTask.Register("PAD-TMS", task)
+					priority.RegistryTask.Register("PAD-OCC", task)
 				}
 			}
 		}

+ 1 - 0
internal/app/stc/active/index.go

@@ -13,6 +13,7 @@ var ActivedCab = "1"
 
 var Master = false
 
+var SetTimer = false
 var QueueTimer *time.Timer = nil
 
 // 挂断所有报警器

+ 8 - 2
internal/app/stc/broadcast/stc-broadcast.go

@@ -218,7 +218,10 @@ func processPacket(packet []byte) {
 
 			AlarmHandleTMS(packet)
 			if active.QueueTimer != nil {
-				active.QueueTimer.Stop()
+				if active.SetTimer {
+					active.QueueTimer.Stop()
+					active.SetTimer = false
+				}
 			}
 		} else {
 			alstatus.PaStatus("", "PAD-TMS", "refuse")
@@ -235,7 +238,10 @@ func processPacket(packet []byte) {
 
 			action.InterruptRunningTask("PAD-ICP") //PAD-ICP interrupt other
 			if active.QueueTimer != nil {
-				active.QueueTimer.Stop()
+				if active.SetTimer {
+					active.QueueTimer.Stop()
+					active.SetTimer = false
+				}
 			}
 
 			AlarmHandleICP(packet) //

+ 29 - 0
internal/app/stc/priority/task.go

@@ -1,6 +1,7 @@
 package priority
 
 import (
+	"pbx-api-gin/pkg/lfshook"
 	"sync"
 )
 
@@ -98,3 +99,31 @@ func (r *TaskRegistry) HighestPriorityRunningTask() (string, TaskInfo, bool) {
 	}
 	return bestKey, best, found
 }
+
+// HighestPriorityRunningTask1 returns the task with smallest Priority value except C2C,
+// which means highest scheduling priority (e.g., Priority=0 > 1 > 10).
+// Returns (key, task, found). If no task exists, found is false.
+func (r *TaskRegistry) HighestPriorityRunningTask1() (string, TaskInfo, bool) {
+
+	r.mu.RLock()
+	defer r.mu.RUnlock()
+
+	var bestKey string
+	var best TaskInfo
+	found := false
+
+	for key, task := range r.m {
+		if task.RunType == "C2C" {
+			continue
+		}
+
+		if !found || task.Priority < best.Priority {
+			bestKey = key
+			best = task
+			found = true
+		}
+	}
+
+	lfshook.NewLogger().Infof("====HighestPriorityRunningTask1 ret=====%s", best.RunType)
+	return bestKey, best, found
+}