3 Komitmen bddaf0e47c ... b6ab6ef897

Pembuat SHA1 Pesan Tanggal
  root b6ab6ef897 修正cabcab在打断emg和CPA之后再挂断,ICP回到EMG和CPA任务中;增加AGI服务器,在拨号规则中访问AGI服务器实现CPA,CABCAB,PA的任务延时 2 minggu lalu
  root c784628129 fix pad timer 2 minggu lalu
  root 7de9bb40c9 PAD-OCC 挂断的时候,挂断指定的编码板 2 minggu lalu
6 mengubah file dengan 92 tambahan dan 53 penghapusan
  1. 52 0
      api/agi-handler.go
  2. 2 0
      cmd/main.go
  3. 3 0
      go.mod
  4. 4 0
      go.sum
  5. 17 20
      internal/app/ami/action/call.go
  6. 14 33
      internal/app/ami/action/index.go

+ 52 - 0
api/agi-handler.go

@@ -0,0 +1,52 @@
+package agiServer
+
+import (
+	"fmt"
+	"os"
+	"pbx-api-gin/internal/app/stc/priority"
+	"pbx-api-gin/pkg/utils"
+	"time"
+
+	"github.com/CyCoreSystems/agi"
+)
+
+func StartAGI(serviceAddress, serviceAGIPort string) {
+
+	server := fmt.Sprintf("%s:%s", serviceAddress, serviceAGIPort)
+	err := agi.Listen(server, agiHandler)
+	if err != nil {
+		utils.LoggerDebug.Printf("AGI: bind addr error !")
+		os.Exit(1)
+	}
+}
+
+func agiHandler(a *agi.AGI) {
+	defer a.Close()
+
+	taskName, ok := a.Variables["agi_arg_1"]
+	if !ok {
+		utils.LoggerDebug.Printf("AGI: Get arg1 error !")
+		return
+	}
+
+	time.Sleep(100 * time.Millisecond) //等待userEvent中设置priority.TaskCreating
+	//检测当前创建中的任务是否时本任务,如果是则直接退出,如果不是则等待其他任务创建完成
+	utils.LoggerDebug.Printf("AGI: task:%s TaskCreating:%s checking start !", taskName, priority.TaskCreating)
+	if priority.TaskCreating != taskName {
+		utils.LoggerDebug.Printf("AGI: %s check task creating ..... ,TaskCreating = %s", taskName, priority.TaskCreating)
+		//action.WaitTaskCreate(taskName)
+		for i := 0; i < 20; i++ {
+			if priority.TaskCreating == "" || priority.TaskCreating == taskName {
+				utils.LoggerDebug.Printf("AGI: %s check task creating ..... ,TaskCreating = %s  Done !", taskName, priority.TaskCreating)
+				time.Sleep(300 * time.Millisecond) //等待userEvent中的后续操作完成之后再执行dial
+				return
+			} else {
+				utils.LoggerDebug.Printf("AGI: %s check task creating ..... ,TaskCreating = %s  waiting !", taskName, priority.TaskCreating)
+				time.Sleep(time.Millisecond * 100)
+			}
+		}
+
+		utils.LoggerDebug.Printf("AGI: %s check task creating ..... ,TaskCreating = %s  Done !", taskName, priority.TaskCreating)
+	}
+	time.Sleep(300 * time.Millisecond) //等待userEvent中的后续操作完成之后再执行dial
+}

+ 2 - 0
cmd/main.go

@@ -1,6 +1,7 @@
 package main
 
 import (
+	agiServer "pbx-api-gin/api"
 	"pbx-api-gin/internal/app"
 	"pbx-api-gin/internal/pkg/configs"
 	"pbx-api-gin/pkg/lfshook"
@@ -19,6 +20,7 @@ var (
 func main() {
 	initVersion()
 
+	go agiServer.StartAGI("127.0.0.1", "8090")
 	// 解析配置文件
 	configs.DecodeConfig()
 

+ 3 - 0
go.mod

@@ -18,8 +18,11 @@ require (
 	xorm.io/xorm v1.0.7
 )
 
+require github.com/pkg/errors v0.8.1 // indirect
+
 require (
 	github.com/BurntSushi/toml v1.3.2 // indirect
+	github.com/CyCoreSystems/agi v0.6.4
 	github.com/KyleBanks/depth v1.2.1 // indirect
 	github.com/StackExchange/wmi v1.2.1 // indirect
 	github.com/gin-contrib/sse v0.1.0 // indirect

+ 4 - 0
go.sum

@@ -2,6 +2,8 @@ gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGq
 gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU=
 github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8=
 github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/CyCoreSystems/agi v0.6.4 h1:v2xOd8LW1vJtkuSNFWGulcc0LKN7yiDklcrQmhF8AF0=
+github.com/CyCoreSystems/agi v0.6.4/go.mod h1:ByOfRdjo7zlcROEaiO+IUTqbdX/tnIPbkXj+ydvgRPA=
 github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
 github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
 github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
@@ -119,6 +121,8 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J
 github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
 github.com/onsi/gomega v1.10.5 h1:7n6FEkpFmfCoo2t+YYqXH0evK+a9ICQz0xcAy9dYcaQ=
 github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48=
+github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=

+ 17 - 20
internal/app/ami/action/call.go

@@ -118,6 +118,7 @@ func HangupTask(TaskName string) {
 				}
 			}
 		}
+		priority.OCCAnswer = 0
 	}
 
 	taskInfo, ok := priority.RegistryTask.Get(TaskName)
@@ -160,7 +161,21 @@ func InterruptRunningTask(toRunTask string) string {
 			if toRunTask == "PAD-OCC" {
 				Hangup(task.RunChannel) //pad
 				ConfbridgeKick(task.ConfbridgeID, "all")
-				HangupIO() //io
+				//HangupIO() //io
+				//interrupt OCC-PAD Hangup OI
+				if active.ActivedCab == "1" {
+					Hangup("1411")
+				} else if active.ActivedCab == "8" {
+					Hangup("1481")
+				} else {
+					if active.ActivedCabDelay == "1" {
+						Hangup("1411")
+					} else if active.ActivedCabDelay == "8" {
+						Hangup("1481")
+					} else {
+						Hangup("1411")
+					}
+				}
 				//lfshook.NewLogger().Infof("===InterruptRunningTask=ret==== ")
 			}
 			return taskName
@@ -608,27 +623,9 @@ func SetPadTimer() {
 			}
 
 			if res.Calls == "0" { // OCC queue empty
-				/*resCaller, err := QueueStatus("0300", "") // check ICP queue, get entries
-				if err != nil {
-					lfshook.NewLogger().Infof("ICP QueueStatus err:%+v", err)
-					return
-				}
-
-				if resCaller.Entrys != nil {
-					sort.Slice(resCaller.Entrys, func(i, j int) bool {
-						return resCaller.Entrys[i].Position < resCaller.Entrys[j].Position
-					})
-
-					for _, caller := range resCaller.Entrys {
-						priority.ICPAnswer = 0
-						//order by pos
-						RedirectInQueue(caller.CallerIDNum, "0301", "queues-occ", caller.CallerIDNum) // redirect All ICP-PAD redirect to OCC queue
-						time.Sleep(time.Millisecond * 100)                                            //200 ms delay
-					}
-				}*/
+				priority.ICPAnswer = 0
 				for _, ret := range alstatus.PadQueues {
 					//utils.LoggerDebug.Printf("PAD to OCC exten:%s", ret.Exten)
-					priority.ICPAnswer = 0
 					//order by pos
 					RedirectInQueue(ret.Exten, "0301", "queues-occ", ret.Exten) // redirect All ICP-PAD redirect to OCC queue
 					time.Sleep(time.Millisecond * 100)

+ 14 - 33
internal/app/ami/action/index.go

@@ -519,9 +519,9 @@ func HandleAMI(event map[string]string) {
 					alstatus.PaStatus("", "PAD", "end")
 					utils.LoggerDebug.Printf("Check PAD-ICP queue chanspy-rule-whisper !")
 
-					res, _ := QueueStatus("0301", "") // check ICP queue ,if empty PAD end
+					res, _ := QueueStatus("0300", "") // check ICP queue ,if empty PAD end
 					if res == nil {
-						utils.LoggerDebug.Printf("Check PAD-OCC queue , return nill . exit !")
+						utils.LoggerDebug.Printf("Check PAD-ICP queue , return nill . exit !")
 						return
 					}
 
@@ -586,6 +586,7 @@ func HandleAMI(event map[string]string) {
 			break
 		}
 
+		utils.LoggerDebug.Printf("Before callernum=%s,callername:%s,qu:%s", event["CallerIDNum"], event["CallerIDName"], event["Queue"])
 		if utils.IsPAIU(event["CallerIDNum"]) && utils.IsPAIU(event["CallerIDName"]) && event["Queue"] == "0300" { // Alarm join the queue, PAD in the queue
 			alstatus.AlarmStatus(event["CallerIDNum"], "queue") //send status to STC
 
@@ -597,6 +598,8 @@ func HandleAMI(event map[string]string) {
 			if ICPQueue == nil {
 				return
 			}
+
+			utils.LoggerDebug.Printf("Before Set PAD timer ICPANSWER=%d  ICPQUE-Calls=%s", priority.ICPAnswer, ICPQueue.Calls)
 			if priority.ICPAnswer == 0 && ICPQueue.Calls == "1" { //ICP did not answer any first call to the ICP queue ; Ready to Set Occ Queue Timer
 				toRunpriority := priority.GetPriorityByKey("PAD-ICP")
 
@@ -637,30 +640,8 @@ func HandleAMI(event map[string]string) {
 					}
 
 					if res.Calls == "0" { // OCC queue empty
-						/*resCaller, err := QueueStatus("0300", "") // check ICP queue, get entries
-						if err != nil {
-							lfshook.NewLogger().Infof("ICP QueueStatus err:%+v", err)
-							return
-						}
-
-						if resCaller.Entrys != nil {
-							sort.Slice(resCaller.Entrys, func(i, j int) bool {
-								return resCaller.Entrys[i].Position < resCaller.Entrys[j].Position
-							})
-
-							for _, caller := range resCaller.Entrys {
-								priority.ICPAnswer = 0
-								//lfshook.NewLogger().Infof("====QueueCallerJoin==QueueTimer===%s", event["Event"])
-								//lfshook.NewLogger().Infof("Redirect to 0301 extension:%s Pos:%s", caller.CallerIDNum, caller.Position)
-								//order by pos
-								utils.LoggerDebug.Printf("Redirect %s to OCC queue Pos:%s", caller.CallerIDNum, caller.Position)
-								RedirectInQueue(caller.CallerIDNum, "0301", "queues-occ", caller.CallerIDNum) // redirect All ICP-PAD redirect to OCC queue
-								time.Sleep(time.Millisecond * 100)                                            //200 ms delay
-							}
-						}*/
-
+						priority.ICPAnswer = 0
 						for _, ret := range alstatus.PadQueues {
-							priority.ICPAnswer = 0
 							//order by pos
 							RedirectInQueue(ret.Exten, "0301", "queues-occ", ret.Exten) // redirect All ICP-PAD redirect to OCC queue
 							time.Sleep(time.Millisecond * 100)
@@ -684,7 +665,7 @@ func HandleAMI(event map[string]string) {
 
 				runningTaskName := InterruptRunningTask("PAD-OCC") //PAD-OCC interrupt other
 				if runningTaskName != "" {
-					time.Sleep(time.Millisecond * 100) //wait endpoint release
+					//time.Sleep(time.Millisecond * 100) //wait endpoint release
 				}
 
 				priority.OCCAnswer = 1
@@ -1370,13 +1351,13 @@ func HandleAMI(event map[string]string) {
 			//check resume
 			taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
 			if ok {
-				if taskName == "EMG" {
-					EMGConfbridgeReinvite(task)
-				} else if taskName == "CPA" {
-					CPAConfbridgeReinvite(task)
-				} else {
-					ICPConfbridgeReinvite(task.ConfbridgeID, taskName)
-				}
+				//if taskName == "EMG" {
+				//	EMGConfbridgeReinvite(task)
+				//} else if taskName == "CPA" {
+				//	CPAConfbridgeReinvite(task)
+				//} else {
+				ICPConfbridgeReinvite(task.ConfbridgeID, taskName)
+				//}
 			}
 		}