dujunchen 1 mês atrás
pai
commit
d1928fb7ae

+ 38 - 25
internal/app/ami/action/call.go

@@ -106,11 +106,16 @@ func HangupTask(TaskName string) {
 			lfshook.NewLogger().Infof("QueueStatus err:%+v", err)
 			return
 		}
+
+		//lfshook.NewLogger().Infof("============QueueStatus ret :%+v", resCaller)
 		if resCaller != nil {
-			for _, caller := range resCaller.Entrys {
-				//lfshook.NewLogger().Infof("===QueueStatus=entry=%+v", caller)
-				time.Sleep(time.Millisecond * 50)
-				RedirectInQueue(caller.CallerIDNum, "0300", "queues-icp-redirect", caller.CallerIDNum) // redirect All PAD redirect to ICP queue
+			//lfshook.NewLogger().Infof("===QueueStatus=entry=%+v", resCaller.Entrys)
+			if resCaller.Entrys != nil {
+				for _, caller := range resCaller.Entrys {
+					//lfshook.NewLogger().Infof("===QueueStatus=entry=%+v", caller)
+					time.Sleep(time.Millisecond * 50)
+					RedirectInQueue(caller.CallerIDNum, "0300", "queues-icp-redirect", caller.CallerIDNum) // redirect All PAD redirect to ICP queue
+				}
 			}
 		}
 	}
@@ -169,13 +174,14 @@ func InterruptRunningTask(toRunTask string) {
 	switch task.RunType {
 	case "CPA":
 		//kick CPA members
-
-		CPAConfbridgeKick(task.ConfbridgeID)
+		if toRunTask != "C2C" {
+			CPAConfbridgeKick(task.ConfbridgeID)
+		}
 	case "EMG":
 		//kick EMG members
-
-		EMGConfbridgeKick(task.ConfbridgeID)
-
+		if toRunTask != "C2C" {
+			EMGConfbridgeKick(task.ConfbridgeID)
+		}
 	case "C2C": // Interrupt C2C task running,
 		if toRunTask == "PA" || toRunTask == "PAD-ICP" || toRunTask == "PAD-TMS" {
 			HangupICP()
@@ -258,10 +264,12 @@ func InterruptRunningTask(toRunTask string) {
 				return
 			}
 
-			for _, caller := range resCaller.Entrys {
-				//lfshook.NewLogger().Infof("===QueueStatus=entry=%+v", caller)
-				time.Sleep(time.Millisecond * 50)
-				RedirectInQueue(caller.CallerIDNum, "0300", "queues-icp-redirect", caller.CallerIDNum) // redirect All PAD redirect to ICP queue
+			if resCaller.Entrys != nil {
+				for _, caller := range resCaller.Entrys {
+					//lfshook.NewLogger().Infof("===QueueStatus=entry=%+v", caller)
+					time.Sleep(time.Millisecond * 50)
+					RedirectInQueue(caller.CallerIDNum, "0300", "queues-icp-redirect", caller.CallerIDNum) // redirect All PAD redirect to ICP queue
+				}
 			}
 
 			priority.RegistryTask.StopAndUnregister("PAD-OCC")
@@ -287,8 +295,10 @@ func InterruptRunningTask(toRunTask string) {
 		//if !strings.Contains(priority.RunningPATaskChan, "0502@default") {
 		//	Hangup(priority.RunningPATaskChan)
 		//}
-		Hangup(task.RunChannel)
-		ConfbridgeKick(task.ConfbridgeID, "all")
+		if toRunTask != "C2C" && task.RunType != "PA" {
+			Hangup(task.RunChannel)
+			ConfbridgeKick(task.ConfbridgeID, "all")
+		}
 	}
 
 }
@@ -547,17 +557,20 @@ func SetPadTimer() {
 					lfshook.NewLogger().Infof("ICP QueueStatus err:%+v", err)
 					return
 				}
-				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("====SetPadTimer==QueueTimer==2=")
-					//lfshook.NewLogger().Infof("==SetPadTimer==Redirect to 0301 entry:%s=Pos:%s==", caller.CallerIDNum, caller.Position)
-					//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
+				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("====SetPadTimer==QueueTimer==2=")
+						//lfshook.NewLogger().Infof("==SetPadTimer==Redirect to 0301 entry:%s=Pos:%s==", caller.CallerIDNum, caller.Position)
+						//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
+					}
 				}
 			}
 		})

+ 47 - 37
internal/app/ami/action/index.go

@@ -197,6 +197,7 @@ func HandleAMI(event map[string]string) {
 						} else {
 							utils.Logger.Printf("Train Information: %s, MessageType: PAD , RecordFileName:%s . Can not get caller and callee  !", trainInfo, DstFile)
 						}
+
 					} else if strings.Contains(event["FILENAME"], "PA") {
 						_, caller, _ := utils.GetPadInfo(event["FILENAME"])
 						utils.Logger.Printf("Train Information:%s , MessageType: PA, Caller: %s, RecordFileName: %s", trainInfo, caller, DstFile)
@@ -283,45 +284,51 @@ func HandleAMI(event map[string]string) {
 				if active.ActivedCab == "1" && ExtenStatus("1411") == "Idle" { //check active and OCC status
 					time.Sleep(time.Second)
 					PADChan := ""
-					for _, chanEntry := range res.Entrys {
-						lfshook.NewLogger().Infof("PAD answered by OCC1 pos:%s chan:%s", chanEntry.Position, chanEntry.Channel)
-						if chanEntry.Position == "1" {
-							PADChan = chanEntry.Channel
-							break
+
+					if res.Entrys != nil {
+						for _, chanEntry := range res.Entrys {
+							lfshook.NewLogger().Infof("PAD answered by OCC1 pos:%s chan:%s", chanEntry.Position, chanEntry.Channel)
+							if chanEntry.Position == "1" {
+								PADChan = chanEntry.Channel
+								break
+							}
 						}
-					}
 
-					if PADChan != "" {
-						Ext := strings.Split(strings.Split(res.Entrys[0].Channel, "/")[1], "-")[0]
+						if PADChan != "" {
+							Ext := strings.Split(strings.Split(res.Entrys[0].Channel, "/")[1], "-")[0]
 
-						alstatus.AlarmStatus(Ext, "connect")
-						go RedirectInQueue(PADChan, "1411", "pad-page-occ-icp", Ext) //PAD Page(OCC+ICPs)
+							alstatus.AlarmStatus(Ext, "connect")
+							go RedirectInQueue(PADChan, "1411", "pad-page-occ-icp", Ext) //PAD Page(OCC+ICPs)
 
-						go Dial("0401", "0512", "pad-rule-pacus-occ", "ano1", "ano1", "1") // PACUs dial OCC1
-					} else {
-						lfshook.NewLogger().Infof("OCC-QueueStatus PADCchan NULL")
+							go Dial("0401", "0512", "pad-rule-pacus-occ", "ano1", "ano1", "1") // PACUs dial OCC1
+						} else {
+							lfshook.NewLogger().Infof("OCC-QueueStatus PADCchan NULL")
+						}
 					}
 					break
 				} else if active.ActivedCab == "8" && ExtenStatus("1481") == "Idle" {
 					time.Sleep(time.Second)
 					PADChan := ""
-					for _, chanEntry := range res.Entrys {
-						lfshook.NewLogger().Infof("PAD answered by OCC1 pos:%s chan:%s", chanEntry.Position, chanEntry.Channel)
-						if chanEntry.Position == "1" {
-							PADChan = chanEntry.Channel
-							break
+
+					if res.Entrys != nil {
+						for _, chanEntry := range res.Entrys {
+							lfshook.NewLogger().Infof("PAD answered by OCC1 pos:%s chan:%s", chanEntry.Position, chanEntry.Channel)
+							if chanEntry.Position == "1" {
+								PADChan = chanEntry.Channel
+								break
+							}
 						}
-					}
 
-					if PADChan != "" {
-						Ext := strings.Split(strings.Split(res.Entrys[0].Channel, "/")[1], "-")[0]
+						if PADChan != "" {
+							Ext := strings.Split(strings.Split(res.Entrys[0].Channel, "/")[1], "-")[0]
 
-						alstatus.AlarmStatus(Ext, "connect")
-						go RedirectInQueue(PADChan, "1481", "pad-page-occ-icp", Ext) //PAD Page(OCC+ICPs)
+							alstatus.AlarmStatus(Ext, "connect")
+							go RedirectInQueue(PADChan, "1481", "pad-page-occ-icp", Ext) //PAD Page(OCC+ICPs)
 
-						go Dial("0401", "0512", "pad-rule-pacus-occ", "ano8", "ano8", "8") // PACUs dial OCC1
-					} else {
-						lfshook.NewLogger().Infof("OCC QueueStatus PADCchan NULL")
+							go Dial("0401", "0512", "pad-rule-pacus-occ", "ano8", "ano8", "8") // PACUs dial OCC1
+						} else {
+							lfshook.NewLogger().Infof("OCC QueueStatus PADCchan NULL")
+						}
 					}
 					break
 				}
@@ -480,17 +487,20 @@ func HandleAMI(event map[string]string) {
 							lfshook.NewLogger().Infof("ICP QueueStatus err:%+v", err)
 							return
 						}
-						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
-							RedirectInQueue(caller.CallerIDNum, "0301", "queues-occ", caller.CallerIDNum) // redirect All ICP-PAD redirect to OCC queue
-							time.Sleep(time.Millisecond * 100)                                            //200 ms delay
+
+						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
+								RedirectInQueue(caller.CallerIDNum, "0301", "queues-occ", caller.CallerIDNum) // redirect All ICP-PAD redirect to OCC queue
+								time.Sleep(time.Millisecond * 100)                                            //200 ms delay
+							}
 						}
 					}
 				})

+ 16 - 15
internal/app/index.go

@@ -12,7 +12,18 @@ import (
 )
 
 func StartApp() {
+
 	time.Sleep(2 * time.Second)
+	//init asterisk
+	if !utils.CheckAsterisk() {
+		lfshook.NewLogger().Infof("Check asterisk , if not running , run cmd /usr/sbin/asterisk !")
+		utils.ExecCmdAsync("/usr/sbin/asterisk")
+		time.Sleep(3 * time.Second)
+	}
+	if utils.CheckAsterisk() {
+		lfshook.NewLogger().Infof("===== asterisk Running=======")
+	}
+
 	//Get cab number acording to IP
 	socket.SetMasterCabNum()
 
@@ -34,22 +45,12 @@ func StartApp() {
 	go stc.StartStcConnection(socket.Conn8, "8")
 
 	//启动连接到Master服务器,检查Master是否在线
-	if active.CabNum == "1" {
-		go stc.StartConnectionToSipServer(socket.ConnToSlave)
-	} else {
-		go stc.RecvFromSipServer()
-	}
-
-	lfshook.NewLogger().Infof("=====Check asterisk=======")
-
-	//init asterisk
-	if !utils.CheckAsterisk() {
-		lfshook.NewLogger().Infof("Check asterisk , if not running , run cmd /usr/sbin/asterisk !")
-		utils.ExecCmdAsync("/usr/sbin/asterisk")
-		time.Sleep(3 * time.Second)
-	}
+	//if active.CabNum == "1" {
+	//	go stc.StartConnectionToSipServer(socket.ConnToSlave)
+	//} else {
+	//	go stc.RecvFromSipServer()
+	//}
 
-	lfshook.NewLogger().Infof("=====Connect asterisk=======")
 	// 启动其他服务...
 	// 启动 AMI
 	go func() {

+ 58 - 25
internal/app/stc/broadcast/stc-broadcast.go

@@ -314,42 +314,75 @@ func StationAnn(data []byte) (err error) {
 // 激活信号
 func Active(data [3]byte) {
 
+	//lfshook.NewLogger().Logger.Infof("===cab%s======Active Type  %+v", active.CabNum, data)
+
 	//check asterisk available
-	if active.Master { // master true
-		if !utils.CheckAsterisk() { //check asterisk not available and set master false
-			if active.MasterTag > 2 {
-				active.Master = false
-				active.MasterTag = 0
+	/*	if active.Master { // master true
+			if !utils.CheckAsterisk() { //check asterisk not available and set master false
+				if active.MasterTag > 2 {
+					active.Master = false
+					active.MasterTag = 0
+				} else {
+					active.MasterTag++
+				}
+				//utils.ExecCmd("/etc/init.d/asterisk", "stop", "PBX")
 			} else {
-				active.MasterTag++
+				active.MasterTag = 0
 			}
-			//utils.ExecCmd("/etc/init.d/asterisk", "stop", "PBX")
-		} else {
-			active.MasterTag = 0
-		}
 
-	} else { // master false, check and start asterisk
+		} else { // master false, check and start asterisk
 
-		//Master == false
-		if !utils.CheckAsterisk() {
-			if active.CabNum == "8" {
-				//utils.ExecCmd("/etc/init.d/asterisk", "start", "PBX")
-				utils.ExecCmd("/usr/sbin/asterisk")
+			//Master == false
+			if !utils.CheckAsterisk() {
+				if active.CabNum == "8" {
+					//utils.ExecCmd("/etc/init.d/asterisk", "start", "PBX")
+					utils.ExecCmd("/usr/sbin/asterisk")
+				}
 			}
-		}
 
-		//Master == false  cab == 1
-		//if active.CabNum == "1" {
-		//	if utils.CheckAsterisk() {
-		//		utils.ExecCmd("/etc/init.d/asterisk", "stop", "PBX")
-		//	}
-		//}
-	}
+			//Master == false  cab == 1
+			//if active.CabNum == "1" {
+			//	if utils.CheckAsterisk() {
+			//		utils.ExecCmd("/etc/init.d/asterisk", "stop", "PBX")
+			//	}
+			//}
+		}
+	*/
 
 	//var info model.Sysinfo
 	Signal := int(data[0])
+	master := int(data[1])
 	TrainInfo := int(data[2])
 
+	lfshook.NewLogger().Logger.Infof("===========cab=%s Master=%d===========", active.CabNum, master)
+
+	//Set Master
+	if master == 1 && active.CabNum == "1" {
+
+		active.Master = true
+		lfshook.NewLogger().Logger.Infof("=====cab1 Master")
+		if !utils.CheckAsterisk() {
+			lfshook.NewLogger().Infof("Check asterisk , if not running , run cmd /usr/sbin/asterisk !")
+			utils.ExecCmdAsync("/usr/sbin/asterisk")
+			time.Sleep(3 * time.Second)
+		}
+	} else if master == 8 && active.CabNum == "8" {
+
+		active.Master = true
+		lfshook.NewLogger().Logger.Infof("=====cab8 Master")
+		if !utils.CheckAsterisk() {
+			lfshook.NewLogger().Infof("Check asterisk , if not running , run cmd /usr/sbin/asterisk !")
+			utils.ExecCmdAsync("/usr/sbin/asterisk")
+			time.Sleep(3 * time.Second)
+		}
+	} else if master == 8 && active.CabNum == "1" {
+
+		lfshook.NewLogger().Logger.Infof("=====cab1 slave check stop asterisk")
+		if utils.CheckAsterisk() {
+			utils.ExecCmd("/etc/init.d/asterisk", "stop", "PBX")
+		}
+	}
+
 	if TrainInfo != 0 {
 		//Get train devide info
 		DevideInfo := TrainInfo & 0x10
@@ -602,7 +635,7 @@ func AlarmHandleTMS(data []byte) {
 	carr := data[12]
 	pos := data[13]
 	exten := fmt.Sprintf("24%c%c", carr, pos)
-	PacuNum := fmt.Sprintf("21%c%c", carr, pos)
+	PacuNum := fmt.Sprintf("21%c1", carr)
 
 	key := suppressKey(exten, handler)
 

+ 39 - 32
internal/app/stc/index.go

@@ -2,9 +2,7 @@ package stc
 
 import (
 	"context"
-	"errors"
 	"fmt"
-	"io"
 	"net"
 	"pbx-api-gin/internal/app/stc/active"
 	"pbx-api-gin/internal/app/stc/broadcast"
@@ -12,7 +10,6 @@ import (
 	"pbx-api-gin/internal/app/stc/socket"
 	"pbx-api-gin/pkg/lfshook"
 	"pbx-api-gin/pkg/utils"
-	"strings"
 	"sync"
 	"syscall"
 
@@ -169,6 +166,7 @@ func CreateConnection(RemoteCab string) (net.Conn, error) {
 	}
 }
 
+/*
 func StartConnectionToSipServer(conn net.Conn) {
 
 	lfshook.NewLogger().Infof("Connect to Slave Sip Server ... ")
@@ -220,7 +218,8 @@ func StartConnectionToSipServer(conn net.Conn) {
 		time.Sleep(time.Second) // 重连前等待
 	}
 }
-
+*/
+/*
 // 连接Master sipserver
 func CreateConnectionSipServer() (net.Conn, error) {
 	dialer := &net.Dialer{
@@ -237,7 +236,7 @@ func CreateConnectionSipServer() (net.Conn, error) {
 	}
 	lfshook.NewLogger().Logger.Infof("Connect SIP Server success :%s:%d", socket.RemoteAddr, socket.LocalPort)
 	return conn, nil
-}
+}*/
 
 func controlTCPConn(network, address string, c syscall.RawConn) error {
 	return c.Control(func(fd uintptr) {
@@ -286,6 +285,7 @@ func Sendheartbeat(ctx context.Context, conn net.Conn) {
 	}
 }
 
+/*
 // cab == 8
 func RecvFromSipServer() {
 
@@ -313,27 +313,27 @@ func RecvFromSipServer() {
 			n, err := conn.Read(buf)
 			if n > 0 {
 				//安全截取实际读到的字节
-				data := buf[:n]
+				//data := buf[:n]
 
 				//Set master = true
-				if data[8] == 0x01 && data[5] == 0xf1 {
-					active.Master = true
-					//return // set to master , stop recv
-				} // else if data[8] == 0x00 && data[5] == 0xf1 {
+				//if data[8] == 0x01 && data[5] == 0xf1 {
+				//	active.Master = true
+				//return // set to master , stop recv
+				//} // else if data[8] == 0x00 && data[5] == 0xf1 {
 				//active.Master = false
 				//}
 				//lfshook.NewLogger().Logger.Infof("Client  received %d bytes: hex=%x", n, data)
 
 				//Respond to remote
-				if active.Master == true {
-					if _, werr := conn.Write([]byte("1")); werr != nil {
-						lfshook.NewLogger().Logger.Infof("Failed to write 'ok' to client: %+v", werr)
-					}
-				} else {
-					if _, werr := conn.Write([]byte("0")); werr != nil {
-						lfshook.NewLogger().Logger.Infof("Failed to write 'ok' to client: %+v", werr)
-					}
+				//if active.Master == true {
+				if _, werr := conn.Write([]byte("1")); werr != nil {
+					lfshook.NewLogger().Logger.Infof("Failed to write 'ok' to client: %+v", werr)
 				}
+				//} else {
+				//	if _, werr := conn.Write([]byte("0")); werr != nil {
+				//lfshook.NewLogger().Logger.Infof("Failed to write 'ok' to client: %+v", werr)
+				//	}
+				//}
 
 			}
 
@@ -355,7 +355,8 @@ func RecvFromSipServer() {
 		//return
 	}
 }
-
+*/
+/*
 func SendToRemoteMaster(ctx context.Context, conn net.Conn) {
 
 	protocol := msgdata.NewProtocol()
@@ -375,16 +376,16 @@ func SendToRemoteMaster(ctx context.Context, conn net.Conn) {
 		case <-ticker.C:
 
 			//set master data
-			if active.Master {
-				protocol.Data[0] = 0 //set remote master false
-			} else {
-				protocol.Data[0] = 1 //set remote master true
-			}
+			//if active.Master {
+			//protocol.Data[0] = 0 //set remote master false
+			//} else {
+			protocol.Data[0] = 1 //set remote master true
+			//}
 
 			// 编码并发送数据...
 			encoded, err := protocol.Encode()
 			if err != nil {
-				active.Master = true
+
 				return
 			}
 
@@ -393,6 +394,8 @@ func SendToRemoteMaster(ctx context.Context, conn net.Conn) {
 				_, err = conn.Write(encoded)
 				if err != nil {
 					conn.Close()
+
+					active.Master = true
 					return // 触发重连
 				}
 			}
@@ -410,21 +413,25 @@ func SendToRemoteMaster(ctx context.Context, conn net.Conn) {
 				} else {
 					lfshook.NewLogger().Logger.Infof("Read from remote failed unexpectedly: %+v", err)
 				}
+				active.Master = true
 				continue // 不中断循环,继续下一轮
 			}
 
+			//respond ok
 			if n > 0 {
-				response := strings.TrimSpace(string(buf[:n]))
+				continue
+				//response := strings.TrimSpace(string(buf[:n]))
 				//lfshook.NewLogger().Logger.Infof("Remote responded: [%s]", response)
 				//可选:校验响应,例如
-				if response == "1" {
-					active.Master = false
+				//if response == "1" {
+				//	active.Master = false
 
-					if utils.CheckAsterisk() { //check asterisk available then stop asterisk
-						utils.ExecCmd("/etc/init.d/asterisk", "stop", "PBX")
-					}
-				}
+				//	if utils.CheckAsterisk() { //check asterisk available then stop asterisk
+				//		utils.ExecCmd("/etc/init.d/asterisk", "stop", "PBX")
+				//	}
+				//}
 			}
 		}
 	}
 }
+*/