Browse Source

update priority

dujunchen 3 ngày trước cách đây
mục cha
commit
7219c2ff11

+ 50 - 165
internal/app/ami/action/call.go

@@ -6,7 +6,6 @@ import (
 	"pbx-api-gin/pkg/lfshook"
 	"pbx-api-gin/pkg/utils"
 	"strings"
-	"time"
 )
 
 var Pads = []string{"2413", "2414", "2415", "2421", "2422", "2423", "2424", "2425", "2431", "2432", "2433", "2434", "2435", "2441", "2442", "2443", "2444",
@@ -70,11 +69,13 @@ func HangupAllExcept(caller string) {
 }
 
 // Hangup all ICP
-func HangupRunningTask() {
-
+func HangupRunningTask(toRunTask string) {
+	lfshook.NewLogger().Infof("===HangupRunningTask=task=%+v", toRunTask)
 	if priority.RunningPATaskChan != "" {
+
 		switch priority.RunningType {
 		case "PAD-ICP", "PAD-TMS": // PAD task running
+		/*
 			chans, err := CoreShowChannels()
 			if err != nil {
 				lfshook.NewLogger().Errorf("CoreShowChannels %+v", err)
@@ -83,17 +84,18 @@ func HangupRunningTask() {
 			//1. Redirect the connected PAD to 0300
 			for _, ret := range chans {
 				if utils.IsPAIU(ret.CallerIDNum) && ret.ChannelStateDesc == "Up" {
-					err := Redirect(ret.Channel, "0300", "default")
+					err := RedirectInQueue(ret.Channel, "0300", "default", ret.Channel)
 					if err != nil {
 						lfshook.NewLogger().Errorf("Redirect %+v", err)
 					}
 				}
 			}
+
 			//2. hangup task channel (ICP + PACU)
 			Hangup(priority.RunningPATaskChan)
 
 			//3. hangup other channel
-			HangupICP()
+			//HangupICP()
 
 			//4. Hangup Local channel
 			for _, ret := range chans {
@@ -101,20 +103,43 @@ func HangupRunningTask() {
 					Hangup(ret.Channel)
 				}
 			}
+		*/
 		case "PAD-OCC":
-			//Hangup connected PAD
 
-			Hangup(priority.RunningPATaskChan)
-			//Redirect all the other pads in 0301 to 0300
+			if toRunTask == "C2C" {
+				break
 
-			priority.OCCAnswer = 0
-			HangupIO()
+			} else {
+				//1. Hangup connected PAD
+				//Hangup(priority.RunningPATaskChan)
+
+				//2. Redirect all the other pads in 0301 to 0300
+				resCaller, err := QueueStatus("0301", "") // check OCC queue, get entries
+				if err != nil {
+					lfshook.NewLogger().Infof("===QueueStatus==%+v", err)
+				}
+				for _, caller := range resCaller.Entrys {
+					go RedirectInQueue(caller.CallerIDNum, "0300", "default", caller.CallerIDNum) // redirect All PAD redirect to ICP queue
+				}
 
+				//3. Hangup OI & ICP
+				//HangupIO()
+				//HangupICP()
+
+				//4. Hangup Local channel
+				HangupAllLocalChan()
+				priority.CleanPriorityTag()
+			}
+		case "C2C":
+			if toRunTask == "PA" || toRunTask == "PAD-ICP" || toRunTask == "PAD-TMS" {
+				break
+			}
+			Hangup(priority.RunningPATaskChan)
+			priority.CleanPriorityTag()
 		default:
 			Hangup(priority.RunningPATaskChan)
+			priority.CleanPriorityTag()
 		}
-		priority.RunningPATaskChan = ""
-
 	}
 }
 
@@ -138,6 +163,18 @@ func HangupAllPACU() {
 	}
 }
 
+func HangupAllLocalChan() {
+	chans, err := CoreShowChannels()
+	if err != nil {
+		lfshook.NewLogger().Errorf("CoreShowChannels %+v", err)
+	}
+	for _, ret := range chans {
+		if strings.Contains(ret.Channel, "Local") {
+			Hangup(ret.Channel)
+		}
+	}
+}
+
 // Hangup all PACU
 func HangupAllPAD() {
 	//all PAD
@@ -186,7 +223,7 @@ func ExtenStatus(exten string) (Status string) {
 		return ""
 	}
 
-	lfshook.NewLogger().Infof("================ExtensionState:res %+v", res)
+	//lfshook.NewLogger().Infof("================ExtensionState:res %+v", res)
 	return res["StatusText"]
 }
 
@@ -221,109 +258,6 @@ func ChanSpy(src, dst string, whisper, bargein bool) {
 	}
 }
 
-// Page
-func Page(src string, extensions []string, duplex bool) {
-	channel := fmt.Sprintf("%s/%s", utils.DialPrefix, src)
-	data := make([]string, 0)
-	for _, exten := range extensions {
-		data = append(data, fmt.Sprintf("%s/%s", utils.DialPrefix, exten))
-	}
-	appData := strings.Join(data, "&")
-	if duplex {
-		appData = fmt.Sprintf("%s,db(header-handler^addheader^1)", appData)
-	} else {
-		appData = fmt.Sprintf("%s,b(header-handler^addheader^1)", appData)
-	}
-	//timeout
-	appData = fmt.Sprintf("%s,30", appData)
-	action := map[string]string{
-		"Action":      "Originate",
-		"Channel":     channel,
-		"Application": "page",
-		"Data":        appData,
-		"CallerID":    src,
-		"CallerSrc":   src,
-		"Variable":    "PJSIP_HEADER(add,answer-after)=0",
-		"async":       "true",
-	}
-	lfshook.NewLogger().Infof("page action %+v", action)
-	res, _, err := AminInstance.Send(action)
-	if err != nil {
-		lfshook.NewLogger().Errorf("%+v", err)
-	}
-	lfshook.NewLogger().Infof("%+v", res)
-}
-
-// Play 转 AGI 播放
-func Play(name, UUID string, extensions []string, hangupAll bool, autoanswer string) {
-	if hangupAll {
-		lfshook.NewLogger().Infof("hangup all before play to %+v", extensions)
-		for _, extension := range extensions {
-			Hangup(extension)
-		}
-		time.Sleep(3 * time.Second)
-	}
-
-	channel := "Local/broadcast@broadcast"
-	data := make([]string, 0)
-	for _, exten := range extensions {
-		data = append(data, fmt.Sprintf("%s/%s", utils.DialPrefix, exten))
-	}
-	appData := strings.Join(data, "&")
-	//timeout
-	/*if autoanswer == "yes" {
-		appData = fmt.Sprintf("%s,%s,%d", appData, "b(header-handler^addheader^1)", configs.ConfigGlobal.AsteriskBroadcastTimeout)
-	} else {
-		appData = fmt.Sprintf("%s,,%d", appData, configs.ConfigGlobal.AsteriskBroadcastTimeout)
-	}*/
-	variable := fmt.Sprintf("task_UUID=%s", UUID)
-	action := map[string]string{
-		"Action":      "Originate",
-		"Channel":     channel,
-		"Application": "page",
-		"Data":        appData,
-		"Variable":    variable,
-		//"CallerID":    fmt.Sprintf("%s<%s>", configs.ConfigGlobal.AsteriskBroadcastName, configs.ConfigGlobal.AsteriskBroadcastID),
-		"CallerID": fmt.Sprintf("%s<%s>", name, name),
-		"CallSrc":  name,
-		"async":    "true",
-	}
-	lfshook.NewLogger().Infof("play action %+v", action)
-	_, _, err := AminInstance.Send(action)
-	if err != nil {
-		lfshook.NewLogger().Errorf("%+v", err)
-	}
-}
-
-// Redirect 转接
-func Redirect(channel, dst, dialrule string) (err error) {
-	callerID := "redirect"
-	lfshook.NewLogger().Infof("redirect src %s to dst %s", channel, dst)
-	if !utils.IsChannel(channel) {
-		callerID = channel
-		if channel, err = GetChannelByExten(channel); err != nil {
-			return err
-		}
-	}
-
-	action := map[string]string{
-		"Action":   "Redirect",
-		"Channel":  channel,
-		"Exten":    dst,
-		"Context":  dialrule,
-		"CallerID": callerID,
-		"Priority": "1",
-		"async":    "true",
-	}
-	lfshook.NewLogger().Infof("redirect %+v", action)
-	res, _, err := AminInstance.Send(action)
-	if err != nil {
-		lfshook.NewLogger().Error(err)
-	}
-	lfshook.NewLogger().Info(res)
-	return err
-}
-
 // Redirect 转接
 func RedirectInQueue(channel, dst, dialrule, callerID string) (err error) {
 	//callerID := "redirect"
@@ -352,52 +286,3 @@ func RedirectInQueue(channel, dst, dialrule, callerID string) (err error) {
 	lfshook.NewLogger().Info(res)
 	return err
 }
-
-// Redirect 转接
-func BlindTransfer(channel, dst, dialrule string) (err error) {
-
-	lfshook.NewLogger().Infof("BlindTransfer src %s to dst %s", channel, dst)
-	if !utils.IsChannel(channel) {
-		if channel, err = GetExtenChan(channel); err != nil {
-			return err
-		}
-	}
-	action := map[string]string{
-		"Action":  "BlindTransfer",
-		"Channel": channel,
-		"Exten":   dst,
-		"Context": dialrule,
-	}
-	lfshook.NewLogger().Infof("BlindTransfer %+v", action)
-	res, _, err := AminInstance.Send(action)
-	if err != nil {
-		lfshook.NewLogger().Error(err)
-	}
-	lfshook.NewLogger().Info(res)
-	return err
-}
-
-// Atxfer
-func Atxfer(channel, dst, dialrule string) (err error) {
-	// 获取通道
-	if !utils.IsChannel(channel) {
-		if channel, err = GetChannelByExten(channel); err != nil {
-			return err
-		}
-	}
-
-	action := map[string]string{
-		"Action":  "Atxfer",
-		"Channel": channel,
-		"Exten":   dst,
-		"Context": dialrule,
-	}
-	lfshook.NewLogger().Infof("atxfer action %+v", action)
-	res, _, err := AminInstance.Send(action)
-	if err != nil {
-		lfshook.NewLogger().Errorf("%+v", err)
-		return err
-	}
-	lfshook.NewLogger().Debugf("atxfer res %+v", res)
-	return err
-}

+ 63 - 54
internal/app/ami/action/index.go

@@ -31,7 +31,7 @@ func HandleAMI(event map[string]string) {
 		if event["UserEvent"] == "SetRecordFile" { //get  record file name
 			alstatus.SendRecordFile(event["FILENAME"], event["RecordType"])
 
-		} else if event["UserEvent"] == "CallType" && (event["Type"] == "PA" || event["Type"] == "CPA") { //PA; check manual PA priority
+		} else if event["UserEvent"] == "CallType" && (event["Type"] == "PA" || event["Type"] == "CPA") { //PA start; check manual PA priority
 			//check active signal  before PA
 			if active.CabNum == "1" && !active.Actived && event["CallerIDNum"] == "2311" {
 				Hangup(event["CallerIDNum"])
@@ -43,22 +43,40 @@ func HandleAMI(event map[string]string) {
 			if utils.IsICP(event["CallerIDNum"]) {
 				if priority.CheckPriority("ManuPa") {
 					//hangup others if priority is higher
-					HangupRunningTask()
+					HangupRunningTask("PA") //PA interrupt other
 				} else {
 					Hangup(event["CallerIDNum"]) //lowwer priority ,hangup caller
 				}
+
 			} else if utils.IsIO(event["CallerIDNum"]) { // CPA
 				if priority.CheckPriority("CPA") {
 					//hangup others if priority is higher
-					HangupRunningTask()
+					if priority.RunningType != "C2C" {
+						HangupRunningTask("CPA") //CPA interrupt other
+					} else {
+						//call to ICP , can not stop
+						lfshook.NewLogger().Info("==Running CabCab , CPA start call ICP(ICP is on the phone)=====")
+					}
 				} else {
 					Hangup(event["CallerIDNum"]) //lowwer priority ,hangup caller
 				}
 			}
-		} else if event["UserEvent"] == "CallType" && event["Type"] == "C2C" { //CabCab; check cab cab priority
+		} else if event["UserEvent"] == "CallType" && event["Type"] == "C2C" { //CabCab start; check cab cab priority
 
 			if priority.CheckPriority("CabCab") {
-				HangupRunningTask()
+
+				if priority.RunningType == "PA" || priority.RunningType == "PAD-ICP" {
+					HangupRunningTask("C2C") //C2C interrupt other
+				} else {
+					//Hangup the other ICP
+					if event["CallerIDNum"] == "2311" {
+						Hangup("2381")
+					} else {
+						Hangup("2311")
+					}
+				}
+			} else { // hangup caller; C2C start failed
+				Hangup(event["CallerIDNum"])
 			}
 		}
 
@@ -72,34 +90,27 @@ func HandleAMI(event map[string]string) {
 	case "SoftHangupRequest": //pre-recored broadcast end
 		//lfshook.NewLogger().Infof("=========%s", event["Event"])
 		if event["CallerIDName"] == "EMG" && event["Exten"] == "0502" { // EMG broadcast hangup
-			priority.RunningTypePriority = 0
-			priority.RunningType = ""
-
+			priority.CleanPriorityTag()
 			alstatus.PaStatus(event["CallerIDName"], "EMG", "end")
 
 		} else if event["CallerIDName"] == "STN" && event["Exten"] == "0503" {
-			priority.RunningTypePriority = 0
-			priority.RunningType = ""
-			priority.SpecialVoice = 0
+			priority.CleanPriorityTag()
 			alstatus.PaStatus(event["CallerIDName"], "STN", "end")
 
 		} else if event["CallerIDName"] == "DCS" && event["Exten"] == "0504" {
-			priority.RunningTypePriority = 0
-			priority.RunningType = ""
+			priority.CleanPriorityTag()
 			alstatus.PaStatus(event["CallerIDName"], "DCS", "end")
 
 		} else if event["CallerIDName"] == "SPC" && event["Exten"] == "0505" {
-			priority.RunningTypePriority = 0
-			priority.RunningType = ""
+			priority.CleanPriorityTag()
 			alstatus.PaStatus(event["CallerIDName"], "SPC", "end")
 
 		} else if event["CallerIDName"] == "CHK" && event["Exten"] == "0510" {
-			priority.RunningTypePriority = 0
-			priority.RunningType = ""
+			priority.CleanPriorityTag()
 			alstatus.PaStatus(event["CallerIDName"], "CHK", "end")
+
 		} else if event["CallerIDName"] == "VOL" && event["Exten"] == "0510" {
-			priority.RunningTypePriority = 0
-			priority.RunningType = ""
+			priority.CleanPriorityTag()
 			alstatus.PaStatus(event["CallerIDName"], "VOL", "end")
 		}
 
@@ -107,49 +118,53 @@ func HandleAMI(event map[string]string) {
 
 		//lfshook.NewLogger().Infof("=========%s", event["Event"])
 		if utils.IsPACU(event["CallerIDNum"]) && utils.IsICP(event["ConnectedLineNum"]) { // TMS-ICP answer PAD, hangup
+			HangupAllLocalChan()
 			res, _ := QueueStatus("0300", "") // check ICP queue ,if empty PAD end
 			if res.Calls == "0" {
-				priority.ICPAnswer = 0
-				priority.RunningTypePriority = 0
+				priority.CleanPriorityTag()
 				alstatus.PaStatus(event["CallerIDNum"], "PAD", "end")
+				//priority.ICPAnswer = 0
 				break
 			}
 		}
 
 		if utils.IsPAIU(event["CallerIDNum"]) && utils.IsICP(event["ConnectedLineNum"]) { // TMS-ICP answer PAD(PACU not availabe), hangup
+			HangupAllLocalChan()
 			res, _ := QueueStatus("0300", "") // check ICP queue ,if empty PAD end
 			if res.Calls == "0" {
-				priority.ICPAnswer = 0
-				priority.RunningTypePriority = 0
+				priority.CleanPriorityTag()
 				alstatus.PaStatus(event["CallerIDNum"], "PAD", "end")
+				//priority.ICPAnswer = 0
 				break
 			}
 		}
 
 		if (event["CallerIDNum"] == "ani1" || event["CallerIDNum"] == "ani8") && utils.IsICP(event["ConnectedLineNum"]) { // ICP answer PAD, hangup
+			HangupAllLocalChan()
 			res, _ := QueueStatus("0300", "") // check ICP queue ,if empty PAD end
 			if res.Calls == "0" {
-				priority.ICPAnswer = 0
-				priority.RunningTypePriority = 0
+				priority.CleanPriorityTag()
 				alstatus.PaStatus(event["CallerIDNum"], "PAD", "end")
+				//priority.ICPAnswer = 0
 				break
 			}
 		}
 
 		//OCC answer PAD, hangup, redirect the next PAD to OCC
 		if (event["CallerIDNum"] == "ano1" || event["CallerIDNum"] == "ano8") && utils.IsIO(event["ConnectedLineNum"]) {
+			HangupAllLocalChan()
 			res, _ := QueueStatus("0301", "") // check OCC queue ,if empty PAD end
 			if res.Calls == "0" {             //OCC queue is empty
-				priority.OCCAnswer = 0
-				priority.RunningTypePriority = 0
+				priority.CleanPriorityTag()
 				alstatus.OccPad("end")
+				//priority.OCCAnswer = 0
 				break
 			} else { //OCC queue is not empty
-
-				if active.CabNum == "1" && active.Actived && alstatus.GetExtenStat("1411") == "Idle" { //check active and OCC status
+				HangupAllLocalChan()
+				if active.CabNum == "1" && active.Actived && ExtenStatus("1411") == "Idle" { //check active and OCC status
 					Dial("0401", "0512", "pad-rule-pacus-occ", "ano1", event["CallerIDNum"], "1") // PACUs dial OCC1
 					//goto ConfbridgeJoin, OCC1 answer PAD
-				} else if active.CabNum == "8" && active.Actived && alstatus.GetExtenStat("1481") == "Idle" {
+				} else if active.CabNum == "8" && active.Actived && ExtenStatus("1481") == "Idle" {
 					Dial("0401", "0512", "pad-rule-pacus-occ", "ano8", event["CallerIDNum"], "8") // PACUs dial OCC8
 					//goto ConfbridgeJoin, OCC8 answer PAD
 				}
@@ -160,7 +175,7 @@ func HandleAMI(event map[string]string) {
 		lfshook.NewLogger().Infof("=========%s", event["Event"])
 		if priority.OCCAnswer == 1 && event["Queue"] == "0300" { //New PAD Goto the OCC queue in the first time, if OCC answered
 			alstatus.AlarmStatus(event["CallerIDNum"], "queue") //send status to STC
-			go RedirectInQueue(event["CallerIDNum"], "0301", "queues-occ", "")
+			go RedirectInQueue(event["CallerIDNum"], "0301", "queues-occ", event["CallerIDNum"])
 			break
 		}
 
@@ -182,7 +197,7 @@ func HandleAMI(event map[string]string) {
 						}
 
 						for _, caller := range resCaller.Entrys {
-							go RedirectInQueue(caller.CallerIDNum, "0301", "queues-occ", "") // redirect All ICP-PAD redirect to OCC queue
+							go RedirectInQueue(caller.CallerIDNum, "0301", "queues-occ", caller.CallerIDNum) // redirect All ICP-PAD redirect to OCC queue
 						}
 					}
 				}
@@ -195,18 +210,19 @@ func HandleAMI(event map[string]string) {
 		//PAD chanspy(WqE) OCC;
 		//ICPs chanspy(qE) PAD;
 		if utils.IsPAIU(event["CallerIDNum"]) && event["Queue"] == "0301" && priority.OCCAnswer == 0 { // The first PAD to OCC ,caller is PAD
-			if active.CabNum == "1" && active.Actived && alstatus.GetExtenStat("1411") == "Idle" { //check active and OCC status
-				priority.OCCAnswer = 1
-				alstatus.OccPad("start")
-				priority.RunningTypePriority, _ = strconv.Atoi(priority.Priority.PADOCC)      //Set running priority
-				Dial("0401", "0512", "pad-rule-pacus-occ", "ano1", event["CallerIDNum"], "1") // PACUs dial OCC1
-				//Goto event=ConfbridgeJoin;OCC answer PAD
-			} else if active.CabNum == "8" && active.Actived && alstatus.GetExtenStat("1481") == "Idle" {
+			if priority.CheckPriority("PAD-OCC") {
+				HangupRunningTask("PAD-OCC") //PAD-OCC interrupt other
 				priority.OCCAnswer = 1
-				priority.RunningTypePriority, _ = strconv.Atoi(priority.Priority.PADOCC) //Set running priority
-				alstatus.OccPad("start")
-				Dial("0401", "0512", "pad-rule-pacus-occ", "ano8", event["CallerIDNum"], "8") // PACUs dial OCC8
-				//Goto event=ConfbridgeJoin;OCC answer PAD
+
+				if active.CabNum == "1" && active.Actived && ExtenStatus("1411") == "Idle" { //check active and OCC status
+					alstatus.OccPad("start")
+					Dial("0401", "0512", "pad-rule-pacus-occ", "ano1", event["CallerIDNum"], "1") // PACUs dial OCC1
+					//Goto event=ConfbridgeJoin;OCC answer PAD
+				} else if active.CabNum == "8" && active.Actived && ExtenStatus("1481") == "Idle" {
+					alstatus.OccPad("start")
+					Dial("0401", "0512", "pad-rule-pacus-occ", "ano8", event["CallerIDNum"], "8") // PACUs dial OCC8
+					//Goto event=ConfbridgeJoin;OCC answer PAD
+				}
 			}
 		}
 
@@ -310,7 +326,7 @@ func HandleAMI(event map[string]string) {
 		if event["ConnectedLineNum"] == "ano1" && event["Exten"] == "0512" { //PAD answered by OCC; PACUs connected IO1
 			lfshook.NewLogger().Infof("====PAD answered by OCC1:%s=====", event["ConnectedLineName"])
 			alstatus.AlarmStatus(event["ConnectedLineName"], "connect")
-
+			priority.OCCAnswer = 1
 			priority.RunningPATaskChan = event["Channel"]
 			priority.RunningType = "PAD-OCC"
 			priority.RunningTypePriority, _ = strconv.Atoi(priority.Priority.PADOCC)
@@ -321,7 +337,7 @@ func HandleAMI(event map[string]string) {
 		if event["ConnectedLineNum"] == "ano8" && event["Exten"] == "0512" { //PAD ansered by OCC8; PACUs connected IO8
 			lfshook.NewLogger().Infof("====PAD answered by OCC8:%s=====", event["ConnectedLineName"])
 			alstatus.AlarmStatus(event["ConnectedLineName"], "connect")
-
+			priority.OCCAnswer = 1
 			priority.RunningPATaskChan = event["Channel"]
 			priority.RunningType = "PAD-OCC"
 			priority.RunningTypePriority, _ = strconv.Atoi(priority.Priority.PADOCC)
@@ -341,16 +357,12 @@ func HandleAMI(event map[string]string) {
 		lfshook.NewLogger().Infof("=========%s", event["Event"])
 		if utils.IsICP(event["CallerIDNum"]) && event["Exten"] == "0500" { // PA end
 			lfshook.NewLogger().Infof("====PA  status =====%s", "end")
-			priority.RunningTypePriority = 0
-			priority.RunningType = ""
-			priority.RunningPATaskChan = ""
+			priority.CleanPriorityTag()
 			alstatus.PaStatus(event["CallerIDNum"], "PA", "end")
 		}
 		if utils.IsIO(event["CallerIDNum"]) && event["Exten"] == "0501" { //CPA end
 			lfshook.NewLogger().Infof("====CPA  status =====%s", "end")
-			priority.RunningTypePriority = 0
-			priority.RunningType = ""
-			priority.RunningPATaskChan = ""
+			priority.CleanPriorityTag()
 			alstatus.PaStatus(event["CallerIDNum"], "CPA", "end")
 		}
 
@@ -378,9 +390,6 @@ func HandleAMI(event map[string]string) {
 		//update extension status
 		if event["StatusText"] == "Idle" || event["StatusText"] == "Unavailable" {
 			if len(event["Exten"]) > 3 && utils.IsPAIU(event["Exten"]) {
-				//alstatus.ExtenStatMap[event["Exten"]] = event["StatusText"]
-				alstatus.SetExtenStat(event["Exten"], event["StatusText"])
-				//lfshook.NewLogger().Infof("======Extension Map : %+v==============", alstatus.ExtenStatMap)
 				alstatus.AlarmStatus(event["Exten"], event["StatusText"]) // PAD idle + unavailable
 			}
 		}

+ 2 - 0
internal/app/ami/action/playback.go

@@ -3,6 +3,7 @@ package action
 import (
 	"errors"
 	"fmt"
+	alstatus "pbx-api-gin/internal/app/stc/sendstatus"
 	"pbx-api-gin/pkg/lfshook"
 	"strings"
 )
@@ -42,6 +43,7 @@ func PlaybackPacu(filename string, count int, delay int, PaType string) (err err
 		return err
 	}
 	if res["Response"] != "Success" {
+		alstatus.PaStatus("", PaType, "fail")
 		return errors.New(res["Message"])
 	}
 	return nil

+ 1 - 96
internal/app/ami/action/queue.go

@@ -1,9 +1,7 @@
 package action
 
 import (
-	"errors"
 	"pbx-api-gin/internal/app/ami/model"
-	"pbx-api-gin/pkg/lfshook"
 
 	"github.com/mitchellh/mapstructure"
 )
@@ -37,99 +35,6 @@ func QueueStatus(queue, member string) (queueParams *model.QueueParams, err erro
 			queueParams.Entrys = append(queueParams.Entrys, entry)
 		}
 	}
-	lfshook.NewLogger().Infof("================QueueStatus calls:%v===========", queueParams.Calls)
+	//lfshook.NewLogger().Infof("================QueueStatus calls:%v===========", queueParams.Calls)
 	return queueParams, nil
 }
-
-// QueueAllStatus 队列信息
-func QueueAllStatus(queue, member string) (queuesMap map[string]*model.QueueParams, err error) {
-	queuesMap = make(map[string]*model.QueueParams)
-	action := map[string]string{
-		"Action": "QueueStatus",
-	}
-	if queue != "" {
-		action["Queue"] = queue
-	}
-	if member != "" {
-		action["Member"] = member
-	}
-	_, events, _ := AminInstance.Send(action)
-	for _, event := range events {
-		if event.Data["Event"] == "QueueParams" {
-			queueParams := &model.QueueParams{Members: make([]*model.QueueMember, 0), Entrys: make([]*model.QueueEntry, 0)}
-			// data, _ := json.Marshal(event.Data)
-			// json.Unmarshal(data, queueParams)
-			mapstructure.Decode(event.Data, queueParams)
-			queuesMap[queueParams.Queue] = queueParams
-		}
-		if event.Data["Event"] == "QueueMember" {
-			member := &model.QueueMember{}
-			mapstructure.Decode(event.Data, member)
-			if queue, ok := queuesMap[member.Queue]; ok {
-				queue.Members = append(queue.Members, member)
-			}
-		}
-
-		if event.Data["Event"] == "QueueEntry" {
-			entry := &model.QueueEntry{}
-			mapstructure.Decode(event.Data, entry)
-			if queue, ok := queuesMap[entry.Queue]; ok {
-				queue.Entrys = append(queue.Entrys, entry)
-			}
-		}
-	}
-	return queuesMap, nil
-}
-
-// QueueAdd 添加到队列
-func QueueAdd(queue, interface_value, pause string) error {
-	action := map[string]string{
-		"Action":    "QueueAdd",
-		"Queue":     queue,
-		"Interface": interface_value,
-		"Paused":    pause,
-	}
-	res, _, err := AminInstance.Send(action)
-	if err != nil {
-		return err
-	}
-	if res["Response"] != "Success" {
-		return errors.New(res["Message"])
-	}
-	return nil
-}
-
-// QueueRemove 从队列移除
-func QueueRemove(queue, interface_value string) error {
-	action := map[string]string{
-		"Action":    "QueueRemove",
-		"Queue":     queue,
-		"Interface": interface_value,
-	}
-	res, _, err := AminInstance.Send(action)
-	if err != nil {
-		return err
-	}
-	if res["Response"] != "Success" {
-		return errors.New(res["Message"])
-	}
-	return nil
-}
-
-// QueuePasue 暂停控制
-func QueuePasue(queue, interface_value, pause string) error {
-	action := map[string]string{
-		"Action":    "QueuePause",
-		"Queue":     queue,
-		"Interface": interface_value,
-		"Paused":    pause,
-	}
-	res, _, err := AminInstance.Send(action)
-	if err != nil {
-		return err
-	}
-	if res["Response"] != "Success" {
-		return errors.New(res["Message"])
-	}
-	return nil
-}

+ 90 - 92
internal/app/stc/broadcast/stc-broadcast.go

@@ -87,22 +87,28 @@ func processPacket(packet []byte) {
 	case 0x02: // STN
 		if priority.CheckPriority("STN") {
 			//action.HangupICP()
-			action.HangupRunningTask()
+			action.HangupRunningTask("STN") //STN interrupt other
 			StationAnn(packet)
+		} else {
+			alstatus.PaStatus("", "STN", "refuse")
 		}
 
 	case 0x05: // SPC
 		if priority.CheckPriority("SPC") {
 			//action.HangupICP()
-			action.HangupRunningTask()
+			action.HangupRunningTask("SPC") //SPC interrupt other
 			SpecialAnn(packet)
+		} else {
+			alstatus.PaStatus("", "SPC", "refuse")
 		}
 
 	case 0x06: // EMG
 		if priority.CheckPriority("EMG") {
 			//action.HangupICP()
-			action.HangupRunningTask()
+			action.HangupRunningTask("EMG") //EMG interrupt other
 			EmgMsg(packet)
+		} else {
+			alstatus.PaStatus("", "EMG", "refuse")
 		}
 	case 0x07: // STOP
 		AnnStop([4]byte{packet[8], packet[9], packet[10], packet[11]})
@@ -110,30 +116,39 @@ func processPacket(packet []byte) {
 	case 0x08: // DCS
 		if priority.CheckPriority("DCS") {
 			//action.HangupICP()
-			action.HangupRunningTask()
+			action.HangupRunningTask("DCS") //DCS interrupt other
 			DcsAnn(packet)
+		} else {
+			alstatus.PaStatus("", "DCS", "refuse")
 		}
 
 	case 0x09: // SELF CHECK
 		if priority.CheckPriority("CHK") {
 			//action.HangupICP()
-			action.HangupRunningTask()
+			action.HangupRunningTask("CHK") //CHK interrupt other
 			SelfCheck(packet)
+		} else {
+			alstatus.PaStatus("", "CHK", "refuse")
 		}
 
 	case 0x10: // VOLUME Adjust
 		if priority.CheckPriority("VOL") {
 			//action.HangupICP()
-			action.HangupRunningTask()
+			action.HangupRunningTask("VOL") //VOL interrupt other
 			VolumeAdjust(packet)
+		} else {
+			alstatus.PaStatus("", "VOL", "refuse")
 		}
 
 	case 0x0a: //TMS answer PAD
 		if priority.CheckPriority("PAD-TMS") {
-			//AlarmHandleTMS(packet)
+
 			//action.HangupICP()
-			action.HangupRunningTask()
-			AlarmHandleICP(packet) //for test
+			action.HangupRunningTask("PAD-TMS") //PAD-TMS interrupt other
+			AlarmHandleICP(packet)              //for test
+			//AlarmHandleTMS(packet)
+		} else {
+			alstatus.PaStatus("", "PAD-TMS", "refuse")
 		}
 
 	case 0x0b: // reset all PAD
@@ -145,7 +160,10 @@ func processPacket(packet []byte) {
 	case 0x0d: // ICP answer PAD
 		if priority.CheckPriority("PAD-ICP") {
 			//action.HangupICP()
-			action.HangupRunningTask()
+			action.HangupRunningTask("PAD-ICP") //PAD-ICP interrupt other
+			AlarmHandleICP(packet)              //
+		} else {
+			alstatus.PaStatus("", "PAD-ICP", "refuse")
 		}
 
 	default:
@@ -174,62 +192,34 @@ func StationAnn(data []byte) (err error) {
 func Active(data [1]byte) {
 
 	//var info model.Sysinfo
-	active.Actived = true
-	//Num := int(data[0])
-	//lfshook.NewLogger().Logger.Infof("Active data : %x", Num)
-	/*
-		   switch Num { // 设置全局的激活信号,并通过协议(待定)通知终端注册到对应的激活主机上
-		   case 0:
+	//active.Actived = true
+	Signal := int(data[0])
+	//lfshook.NewLogger().Logger.Infof("Active data : %x", Signal)
+
+	switch Signal {
+	case 0:
+
+		//lfshook.NewLogger().Logger.Infof("=================Inactive==================")
+		active.Actived = false
+
+	case 1:
 
-		   	lfshook.NewLogger().Logger.Infof("=================Inactive==================")
-		   	info.Name = "cab_active"
-		   	info.Value = "0"
+		//lfshook.NewLogger().Logger.Infof("=================active===MC1===============")
+		if active.CabNum == "1" { // local cab is MC1
+			active.Actived = true
+		} else {
 			active.Actived = false
+		}
 
-		   	_, er := mysql.DBOrmInstance.Where("name = ?", "cab_active").Update(&info)
-		   	if er != nil {
-		   		lfshook.NewLogger().Logger.Infof("update sysinfo err : %+v", er.Error())
-		   		return
-		   	}
-
-		   case 1:
-
-		   	lfshook.NewLogger().Logger.Infof("=================active===MC1===============")
-		   	if active.CabNum == "1" { // local cab is MC1
-		   		info.Name = "cab_active"
-		   		info.Value = "1"
-		   		active.Actived = true
-		   	} else {
-		   		info.Name = "cab_active"
-		   		info.Value = "0"
-		   		active.Actived = false
-		   	}
-		   	_, er := mysql.DBOrmInstance.Where("name = ?", "cab_active").Update(&info)
-		   	if er != nil {
-		   		lfshook.NewLogger().Logger.Infof("update sysinfo err : %+v", er.Error())
-		   		return
-		   	}
-
-		   case 8:
-
-		   		lfshook.NewLogger().Logger.Infof("=================active===MC8===============")
-		   		if active.CabNum == "8" { //Local cab is MC8
-		   			info.Name = "cab_active"
-		   			info.Value = "1"
-		   			active.Actived = true
-		   		} else {
-		   			info.Name = "cab_active"
-		   			info.Value = "0"
-		   			active.Actived = false
-		   		}
-
-		   		_, er := mysql.DBOrmInstance.Where("name = ?", "cab_active").Update(&info)
-		   		if er != nil {
-		   			lfshook.NewLogger().Logger.Infof("update sysinfo err : %+v", er.Error())
-		   			return
-		   		}
-		   	}
-	*/
+	case 8:
+
+		//lfshook.NewLogger().Logger.Infof("=================active===MC8===============")
+		if active.CabNum == "8" { //Local cab is MC8
+			active.Actived = true
+		} else {
+			active.Actived = false
+		}
+	}
 }
 
 // SPC ,特殊服务消息广播
@@ -271,27 +261,27 @@ func AnnStop(data [4]byte) {
 	switch data[0] {
 	case 0x03:
 		if priority.RunningType == "DCS" {
-			action.HangupRunningTask()
+			action.HangupRunningTask("") //STOP DCS
 		}
 	case 0x04:
 		if priority.RunningType == "EMG" {
-			action.HangupRunningTask()
+			action.HangupRunningTask("") //STOP EMG
 		}
 	case 0x07:
 		if priority.RunningType == "SPC" {
-			action.HangupRunningTask()
+			action.HangupRunningTask("") //STOP SPC
 		}
 	case 0x08:
 		if priority.RunningType == "STN" {
-			action.HangupRunningTask()
+			action.HangupRunningTask("") //STOP STN
 		}
 	case 0x09:
 		if priority.RunningType == "CHK" {
-			action.HangupRunningTask()
+			action.HangupRunningTask("") //STOP CHK
 		}
 	case 0x10:
 		if priority.RunningType == "VOL" {
-			action.HangupRunningTask()
+			action.HangupRunningTask("") //STOP VOL
 		}
 	}
 }
@@ -349,7 +339,7 @@ func SelfCheck(data []byte) {
 	case 0x02: //stop
 
 		//Pa status report
-		//priority.RunningTypePriority = 0
+		priority.CleanPriorityTag()
 		alstatus.PaStatus("", "CHK", "end")
 		action.HangupAllExcept("")
 	}
@@ -410,12 +400,20 @@ func AlarmHandleICP(data []byte) {
 		if err != nil {
 			lfshook.NewLogger().Info(err)
 		}
-		action.HangupICP()
+		//action.HangupICP()
+		if priority.RunningType == "PAD-ICP" {
+			action.HangupRunningTask("") //STOP PAD-ICP
+			//priority.CleanPriorityTag()
+		}
 
 	case 0x03: //hangup
 		//NotifyPaiu(exten, "hangup")
-		action.Hangup(exten) //Pad
-		action.HangupICP()
+		//action.Hangup(exten) //Pad
+		if priority.RunningType == "PAD-ICP" {
+			action.HangupRunningTask("") //STOP PAD-ICP
+			//priority.CleanPriorityTag()
+		}
+		//action.HangupICP()
 
 	}
 }
@@ -454,7 +452,7 @@ func AlarmHandleTMS(data []byte) {
 
 		priority.ICPAnswer = 1
 		lfshook.NewLogger().Logger.Infof("================TMS Answer PAD:%s===PACU:%s==========", exten, PacuNum)
-		if alstatus.GetExtenStat(PacuNum) == "Idle" {
+		if action.ExtenStatus(PacuNum) == "Idle" {
 			if active.CabNum == "1" && active.Actived {
 				action.Dial("0403", PacuNum, "default", PacuNum, exten, "1") // PACU dial ICP1
 				//goto ami event BridgeEnter, ICP8 whisper ICP1
@@ -472,15 +470,22 @@ func AlarmHandleTMS(data []byte) {
 		if err != nil {
 			lfshook.NewLogger().Info(err)
 		}
-
-		action.Hangup("2311") //1 车接听
-		action.Hangup("2381") //8 车接听
+		if priority.RunningType == "PAD-TMS" {
+			action.HangupRunningTask("") //STOP PAD-TMS
+			//priority.CleanPriorityTag()
+		}
+		//action.Hangup("2311") //1 车接听
+		//action.Hangup("2381") //8 车接听
 
 	case 0x03: //hangup
 		//NotifyPaiu(exten, "hangup")
-		action.Hangup(exten)  //PAD
-		action.Hangup("2311") //1 车接听
-		action.Hangup("2381") //8 车接听
+		//action.Hangup(exten) //PAD
+		//action.Hangup("2311") //1 车接听
+		//action.Hangup("2381") //8 车接听
+		if priority.RunningType == "PAD-TMS" {
+			action.HangupRunningTask("") //STOP PAD-TMS
+			//priority.CleanPriorityTag()
+		}
 	}
 }
 
@@ -523,20 +528,13 @@ func AlarmHoldResetAll(handler byte) {
 	//all hold
 
 	//hangup all actived PAD
-	for _, ext := range action.Pads {
-		action.Hangup(ext)
-	}
+	action.HangupAllPAD()
 
-	if active.CabNum == "1" && active.Actived {
-		action.Hangup("2311") //1 车接听
-		action.Hangup("1411")
-		alstatus.AlarmStatus("0000", "allreset") //send all reset status
-	} else if active.CabNum == "8" && active.Actived {
-		action.Hangup("2381") //8 车接听
-		action.Hangup("1481")
-		alstatus.AlarmStatus("0000", "allreset") // send all reset status
+	//hangup running task
+	if priority.RunningType == "PAD-ICP" || priority.RunningType == "PAD-OCC" || priority.RunningType == "PAD-TMS" {
+		action.HangupRunningTask("") //Reset PAD ALL
+		priority.CleanPriorityTag()
 	}
-
 }
 
 func RecordStorageConf(data []byte) {

+ 10 - 0
internal/app/stc/priority/index.go

@@ -102,3 +102,13 @@ func CheckPriority(runType string) bool {
 	}
 	return false
 }
+
+// Clean all priority tag
+func CleanPriorityTag() {
+	ICPAnswer = 0
+	OCCAnswer = 0
+	RunningTypePriority = 0
+	RunningType = ""
+	SpecialVoice = 0
+	RunningPATaskChan = ""
+}

+ 2 - 30
internal/app/stc/sendstatus/status.go

@@ -8,36 +8,8 @@ import (
 	"pbx-api-gin/internal/app/stc/socket"
 	"pbx-api-gin/pkg/lfshook"
 	"pbx-api-gin/pkg/utils"
-	"sync"
 )
 
-var (
-	ExtenStatMap map[string]string
-	extenLock    sync.Mutex
-)
-
-func init() {
-	ExtenStatMap = make(map[string]string)
-}
-
-// 安全写入
-func SetExtenStat(key, value string) {
-	extenLock.Lock()
-	defer extenLock.Unlock()
-	ExtenStatMap[key] = value
-}
-
-// 安全读取
-func GetExtenStat(key string) string {
-	extenLock.Lock()
-	defer extenLock.Unlock()
-	val, exists := ExtenStatMap[key]
-	if exists {
-		return val
-	}
-	return ""
-}
-
 func SendToStc(conn net.Conn, data []byte) {
 
 	_, err := conn.Write(data)
@@ -155,8 +127,8 @@ func PaStatus(src string, patype string, operation string) {
 		protocol.Data[1] = 0x08
 	case "CHK": //自检
 		protocol.Data[1] = 0x09
-	case "VOL": //自检
-		protocol.Data[1] = 0x10
+	case "VOL": //音量调节
+		protocol.Data[1] = 0x0a
 	}
 
 	//操作类型

+ 2 - 2
internal/app/stc/socket/index.go

@@ -9,8 +9,8 @@ const RemotePort = 10100
 const LocalPort = 10201
 const LocalPort8 = 10202
 
-const RemoteAddr8 = "192.168.17.14"
+//const RemoteAddr8 = "192.168.17.14"
 
 const RemoteAddr = "10.0.11.11"
 
-//const RemoteAddr8 = "10.0.11.81"
+const RemoteAddr8 = "10.0.11.81"