1
0

10 Ревизии 4760ead404 ... a0504d696a

Автор SHA1 Съобщение Дата
  dujunchen a0504d696a update priority преди 1 седмица
  dujunchen 5f6a6085d0 update pad преди 1 седмица
  dujunchen 731f0cd70e update priority преди 1 седмица
  dujunchen 146e1060cb update reset all преди 1 седмица
  dujunchen 63de6009ce update commit преди 1 седмица
  dujunchen 999aca7350 fix PAD alarm преди 2 седмици
  dujunchen b2e6a525e3 update PAD alarm преди 2 седмици
  dujunchen 5bdd0b0e02 fix ICP answer PAD преди 2 седмици
  dujunchen 3b08db82e9 fix TMS-ICP answer PAD преди 2 седмици
  dujunchen c256fabbdc update преди 2 седмици

+ 33 - 2
internal/app/ami/action/call.go

@@ -25,10 +25,23 @@ func Hangup(channel string) {
 	}
 }
 
+// Hangup 挂断所有分机
+func HangupAll() {
+	var Pacus = []string{"2111", "2121", "2131", "2141", "2151", "2161", "2171", "2181"}
+	//all PACU
+	for _, ret := range Pacus {
+		Hangup(ret)
+	}
+
+	Hangup("1411") //IO1
+	Hangup("1481") //IO8
+	Hangup("2311") //ICP1
+	Hangup("2381") //ICP8
+}
+
 // Dial 拨打号码
 func Dial(src, dst, dialrule, callerID, callerName string, callType string) {
-	chanel := fmt.Sprintf("%s/%s@ani-rule", "Local", src)
-	//chanel := fmt.Sprintf("Local/%s@pacu-ani-rule", src)
+	chanel := fmt.Sprintf("%s/%s@default", "Local", src)
 	action := map[string]string{
 		"Action":   "Originate",
 		"Channel":  chanel,
@@ -47,6 +60,24 @@ func Dial(src, dst, dialrule, callerID, callerName string, callType string) {
 	lfshook.NewLogger().Info(res)
 }
 
+// 获取分机状态
+func ExtenStatus(exten string) (Status string) {
+	action := map[string]string{
+		"Action":  "ExtensionState",
+		"Exten":   exten,
+		"Context": "default",
+	}
+
+	res, _, err := AminInstance.Send(action)
+	if err != nil {
+		lfshook.NewLogger().Errorf("%+v", err)
+		return ""
+	}
+
+	lfshook.NewLogger().Infof("================ExtensionState:res %+v", res)
+	return res["StatusText"]
+}
+
 // PACU ChanSpy
 func ChanSpy(src, dst string, whisper, bargein bool) {
 	lfshook.NewLogger().Infof("chan spy src:%s dst:%s", src, dst)

+ 185 - 70
internal/app/ami/action/index.go

@@ -1,13 +1,14 @@
 package action
 
 import (
-	"pbx-api-gin/internal/app/ami/model"
-	"pbx-api-gin/internal/app/mysql"
 	"pbx-api-gin/internal/app/stc/active"
+	"pbx-api-gin/internal/app/stc/priority"
 	alstatus "pbx-api-gin/internal/app/stc/sendstatus"
 	"pbx-api-gin/internal/pkg/configs"
 	"pbx-api-gin/pkg/lfshook"
 	"pbx-api-gin/pkg/utils"
+	"strconv"
+	"time"
 
 	"github.com/sirupsen/logrus"
 	"github.com/tqcenglish/amigo-go"
@@ -19,29 +20,32 @@ var AminInstance *amigo.Amigo
 //type Operation func(src, dst string, whisper, bargein bool)
 
 func HandleAMI(event map[string]string) {
-
+	//lfshook.NewLogger().Infof("===start======%s", event["Event"])
 	//return if not actived
 	if !active.Actived {
 		return
 	}
 
 	switch event["Event"] {
-	/*case "DialBegin":
-	lfshook.NewLogger().Infof("=========%s", event["Event"])
-	if utils.IsPAIU(event["CallerIDNum"]) && utils.IsICP(event["DestCallerIDNum"]) {
-		alstatus.AlarmStatus(event["CallerIDNum"], "dial") // Alarm dial ICP start
-	}
-	*/
 
 	case "UserEvent":
 		lfshook.NewLogger().Infof("========event:%s   File:%s", event["Event"], event["FILENAME"])
 		if event["UserEvent"] == "SetRecordFile" { //get  record file name
 			alstatus.SendRecordFile(event["FILENAME"], event["RecordType"])
+		} else if event["UserEvent"] == "CallType" && event["Type"] == "PA" { //check manual PA priority
+			if priority.CheckPriority("ManuPa") {
+				HangupAll()
+			}
+		} else if event["UserEvent"] == "CallType" && event["Type"] == "C2C" { //check cab cab priority
+			if priority.CheckPriority("CabCab") {
+				HangupAll()
+			}
 		}
 
 	case "Newchannel":
 		lfshook.NewLogger().Infof("=========%s", event["Event"])
 		if utils.IsPAIU(event["CallerIDNum"]) && event["Exten"] == "0300" { // Alarm dial queue start; PAD dialing
+			priority.RunningType, _ = strconv.Atoi(priority.Priority.PADICP)
 			alstatus.PaStatus(event["CallerIDNum"], "PAD", "start")
 			alstatus.AlarmStatus(event["CallerIDNum"], "dial")
 		}
@@ -49,56 +53,127 @@ 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.RunningType = 0
 			alstatus.PaStatus(event["CallerIDName"], "EMG", "end")
 
 		} else if event["CallerIDName"] == "STN" && event["Exten"] == "0503" {
+			priority.RunningType = 0
+			priority.SpecialVoice = 0
 			alstatus.PaStatus(event["CallerIDName"], "STN", "end")
 
 		} else if event["CallerIDName"] == "DCS" && event["Exten"] == "0504" {
+			priority.RunningType = 0
 			alstatus.PaStatus(event["CallerIDName"], "DCS", "end")
 
 		} else if event["CallerIDName"] == "SPC" && event["Exten"] == "0505" {
+			priority.RunningType = 0
 			alstatus.PaStatus(event["CallerIDName"], "SPC", "end")
 
 		} else if event["CallerIDName"] == "CHK" && event["Exten"] == "0510" {
+			priority.RunningType = 0
 			alstatus.PaStatus(event["CallerIDName"], "CHK", "end")
 		}
 
 	case "Hangup":
-		lfshook.NewLogger().Infof("=========%s", event["Event"])
-		if utils.IsPAIU(event["CallerIDNum"]) && utils.IsICP(event["Exten"]) { // PAD status , hangup
-			alstatus.PaStatus(event["CallerIDNum"], "PAD", "end")
-		}
 
-	case "QueueCallerJoin":
 		lfshook.NewLogger().Infof("=========%s", event["Event"])
-		if utils.IsPAIU(event["CallerIDNum"]) && event["Queue"] == "0300" { // Alarm join the queue, PAD in the queue
-			alstatus.AlarmStatus(event["CallerIDNum"], "queue")
+		if utils.IsPACU(event["CallerIDNum"]) && utils.IsICP(event["ConnectedLineNum"]) { // TMS-ICP answer PAD, hangup
+			res, _ := QueueStatus("0300", "") // check ICP queue ,if empty PAD end
+			if res.Calls == "0" {
+				priority.ICPAnswer = 0
+				priority.RunningType = 0
+				alstatus.PaStatus(event["CallerIDNum"], "PAD", "end")
+				break
+			}
 		}
 
-	case "QueueCallerLeave": // Alarm timeout , redirect to OCC
-
-		if utils.IsPAIU(event["CallerIDNum"]) { // caller is PAD
-			var infoExt model.Extension
-			PacuNum := utils.GetPacuByPad(event["CallerIDNum"])
+		if utils.IsPAIU(event["CallerIDNum"]) && utils.IsICP(event["ConnectedLineNum"]) { // TMS-ICP answer PAD(PACU not availabe), hangup
+			res, _ := QueueStatus("0300", "") // check ICP queue ,if empty PAD end
+			if res.Calls == "0" {
+				priority.ICPAnswer = 0
+				priority.RunningType = 0
+				alstatus.PaStatus(event["CallerIDNum"], "PAD", "end")
+				break
+			}
+		}
 
-			_, er := mysql.DBOrmInstance.Where("exten = ?", PacuNum).Get(&infoExt)
-			if er != nil {
-				lfshook.NewLogger().Logger.Infof("update special voice to exten err : %+v", er.Error())
+		if (event["CallerIDNum"] == "ani1" || event["CallerIDNum"] == "ani8") && utils.IsICP(event["ConnectedLineNum"]) { // ICP answer PAD, hangup
+			res, _ := QueueStatus("0300", "") // check ICP queue ,if empty PAD end
+			if res.Calls == "0" {
+				priority.ICPAnswer = 0
+				priority.RunningType = 0
+				alstatus.PaStatus(event["CallerIDNum"], "PAD", "end")
+				break
 			}
+		}
 
-			if infoExt.Status == "Idle" { //check PACU status
-				if active.CabNum == "1" && active.Actived {
-					Dial("0401", PacuNum, "default", PacuNum, event["CallerIDNum"], "1") // PACU dial OCC1
-				} else if active.CabNum == "8" && active.Actived {
-					Dial("0401", PacuNum, "default", PacuNum, event["CallerIDNum"], "8") // PACU dial OCC8
+		//OCC answer PAD, hangup, redirect the next PAD to OCC
+		if (event["CallerIDNum"] == "ano1" || event["CallerIDNum"] == "ano8") && utils.IsIO(event["ConnectedLineNum"]) {
+			res, _ := QueueStatus("0301", "") // check OCC queue ,if empty PAD end
+			if res.Calls == "0" {             //OCC queue is empty
+				priority.OCCAnswer = 0
+				priority.RunningType = 0
+				alstatus.OccPad("end")
+				break
+			} else { //OCC queue is not empty
+
+				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 && ExtenStatus("1481") == "Idle" {
+					Dial("0401", "0512", "pad-rule-pacus-occ", "ano8", event["CallerIDNum"], "8") // PACUs dial OCC8
+					//goto ConfbridgeJoin, OCC8 answer PAD
 				}
-			} else {
-				if active.CabNum == "1" && active.Actived {
-					RedirectInQueue(event["CallerIDNum"], "0401", "default", "1") // PAD dial OCC1
-				} else if active.CabNum == "8" && active.Actived {
-					RedirectInQueue(event["CallerIDNum"], "0401", "default", "8") // PAD dial OCC8
+			}
+		}
+
+	case "QueueCallerJoin":
+		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
+			go RedirectInQueue(event["CallerIDNum"], "0301", "queues-occ", "")
+			break
+		}
+
+		if utils.IsPAIU(event["CallerIDNum"]) && event["Queue"] == "0300" { // Alarm join the queue, PAD in the queue
+			alstatus.AlarmStatus(event["CallerIDNum"], "queue") //send status to STC
+
+			time.AfterFunc(30*time.Second, func() { // check the PAD 30s timeout
+				if priority.ICPAnswer == 0 { //ICP did not answer any
+
+					res, err := QueueStatus("0301", "") // check OCC queue , if empty OCC-PAD start
+					if err != nil {
+						lfshook.NewLogger().Infof("===OCC-QueueStatus==%+v", err)
+					}
+					if res.Calls == "0" { // OCC queue empty
+
+						resCaller, err := QueueStatus("0300", "") // check ICP queue, get entries
+						if err != nil {
+							lfshook.NewLogger().Infof("===QueueStatus==%+v", err)
+						}
+
+						for _, caller := range resCaller.Entrys {
+							go RedirectInQueue(caller.CallerIDNum, "0301", "queues-occ", "") // redirect All ICP-PAD redirect to OCC queue
+						}
+					}
 				}
+			})
+			break
+		}
+
+		//first PAD caller goto OCC
+		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 && ExtenStatus("1411") == "Idle" { //check active and OCC status
+				priority.OCCAnswer = 1
+				alstatus.OccPad("start")
+				priority.RunningType, _ = 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 && ExtenStatus("1481") == "Idle" {
+				priority.OCCAnswer = 1
+				priority.RunningType, _ = 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
 			}
 		}
 
@@ -106,21 +181,73 @@ func HandleAMI(event map[string]string) {
 		lfshook.NewLogger().Infof("=========%s", event["Event"])
 		if utils.IsICP(event["CallerIDNum"]) && event["Exten"] == "0500" { // PA start
 			lfshook.NewLogger().Infof("====PA status:%s=====", "start")
+			priority.RunningType, _ = strconv.Atoi(priority.Priority.ManuPa)
 			alstatus.PaStatus(event["CallerIDNum"], "PA", "start")
+			break
 		}
-		if utils.IsIO(event["CallerIDNum"]) && event["Exten"] == "0500" { //CPA start
+
+		if utils.IsIO(event["CallerIDNum"]) && event["Exten"] == "0501" { //CPA start
 			lfshook.NewLogger().Infof("====CPA status:%s=====", "start")
+			priority.RunningType, _ = strconv.Atoi(priority.Priority.CPA)
 			alstatus.PaStatus(event["CallerIDNum"], "CPA", "start")
+			break
+		}
+
+		//ICP answer PAD;
+		if event["ConnectedLineNum"] == "ani1" && event["Exten"] == "0511" { //PAD answered by ICP; PACUs connected ICP1
+			lfshook.NewLogger().Infof("====PAD answered by ICP1:%s=====", event["ConnectedLineName"])
+			alstatus.AlarmStatus(event["ConnectedLineName"], "connect")
+
+			go RedirectInQueue(event["ConnectedLineName"], "2311", "chanspy-rule-whisper", event["ConnectedLineName"])               //PAD chanspy(EqW) ICP1
+			go Dial("0402", event["ConnectedLineName"], "chanspy-rule", event["ConnectedLineName"], event["ConnectedLineName"], "8") //ICP8 chanspy PAD
+			//goto event=ChanSpyStart; PAD whisper ICP8
+			break
+		}
+		if event["ConnectedLineNum"] == "ani8" && event["Exten"] == "0511" { //PAD ansered by ICP8; PACUs connected ICP8
+			lfshook.NewLogger().Infof("====PAD answered by ICP8:%s=====", event["ConnectedLineName"])
+			alstatus.AlarmStatus(event["ConnectedLineName"], "connect")
+
+			go RedirectInQueue(event["ConnectedLineName"], "2381", "chanspy-rule-whisper", event["ConnectedLineName"])               //PAD chanspy(EqW) ICP8
+			go Dial("0402", event["ConnectedLineName"], "chanspy-rule", event["ConnectedLineName"], event["ConnectedLineName"], "1") //ICP1 chanspy PAD
+			//goto event=ChanSpyStart; PAD whisper ICP1
+			break
+		}
+
+		//OCC answer PAD;
+		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")
+
+			go RedirectInQueue(event["ConnectedLineName"], "1411", "chanspy-rule-whisper", event["ConnectedLineName"]) //PAD chanspy(EqW) IO1
+			//goto event=ChanSpyStart; ICPs spy PAD
+			break
+		}
+		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")
+
+			go RedirectInQueue(event["ConnectedLineName"], "1481", "chanspy-rule-whisper", event["ConnectedLineName"]) //PAD chanspy(EqW) IO8
+			//goto event=ChanSpyStart; ICPs spy PAD
+			break
+		}
+
+	case "ChanSpyStart":
+		lfshook.NewLogger().Infof("=========event:%s   callerid:%s   SpyeeConnectedLineName:%s  SpyerExten:%s", event["Event"], event["CallerIDNum"], event["SpyeeConnectedLineName"], event["SpyerExten"])
+		//PAD answered by OCC; ICPs chanspy PAD
+		if utils.IsPAIU(event["SpyeeConnectedLineName"]) && utils.IsIO(event["SpyerExten"]) { // check if it is PAD whisper IO
+			go Dial("0404", event["SpyeeConnectedLineName"], "chanspy-rule", "ano", "ano", "") //ICPs chanspy PAD
 		}
 
 	case "ConfbridgeLeave":
 		lfshook.NewLogger().Infof("=========%s", event["Event"])
 		if utils.IsICP(event["CallerIDNum"]) && event["Exten"] == "0500" { // PA end
 			lfshook.NewLogger().Infof("====PA  status =====%s", "end")
+			priority.RunningType = 0
 			alstatus.PaStatus(event["CallerIDNum"], "PA", "end")
 		}
-		if utils.IsIO(event["CallerIDNum"]) && event["Exten"] == "0500" { //CPA end
+		if utils.IsIO(event["CallerIDNum"]) && event["Exten"] == "0501" { //CPA end
 			lfshook.NewLogger().Infof("====CPA  status =====%s", "end")
+			priority.RunningType = 0
 			alstatus.PaStatus(event["CallerIDNum"], "CPA", "end")
 		}
 
@@ -128,59 +255,47 @@ func HandleAMI(event map[string]string) {
 		lfshook.NewLogger().Infof("=========%s", event["Event"])
 		//Cab Cab start
 		if utils.IsICP(event["CallerIDNum"]) && utils.IsICP(event["ConnectedLineNum"]) && event["DialStatus"] == "ANSWER" {
+			priority.RunningType, _ = strconv.Atoi(priority.Priority.CabCab)
 			alstatus.PaStatus(event["CallerIDNum"], "C2C", "start")
 		}
 
 	case "BridgeLeave":
+		lfshook.NewLogger().Infof("=========%s", event["Event"])
 		//Cab Cab end
 		if utils.IsICP(event["CallerIDNum"]) && utils.IsICP(event["ConnectedLineNum"]) && event["Exten"] == "0400" {
+			priority.RunningType = 0
 			alstatus.PaStatus(event["CallerIDNum"], "C2C", "end")
 		}
 
 	case "ExtensionStatus":
-		lfshook.NewLogger().Infof("=========event:%s   status:%s", event["Event"], event["StatusText"])
+		lfshook.NewLogger().Infof("=========event:%s  Ext:%s status:%s ", event["Event"], event["extension"], event["StatusText"])
 
-		status := &model.Extension{
-			Extension: event["Exten"],
-			Status:    event["StatusText"],
-		}
-		_, err := mysql.DBOrmInstance.Where("exten = ?", status.Extension).Cols("status").Update(status)
-		if err != nil {
-			lfshook.NewLogger().Infof("update extension status err : %+v", err.Error())
-		}
+		//update extension status
 		if event["StatusText"] == "Idle" || event["StatusText"] == "Unavailable" {
-			if len(event["Exten"]) > 3 {
+			if len(event["Exten"]) > 3 && utils.IsPAIU(event["Exten"]) {
 				alstatus.AlarmStatus(event["Exten"], event["StatusText"]) // PAD idle + unavailable
 			}
 		}
 
-	case "BridgeEnter":
-		//ICP and PACU connected
-		if utils.IsPACU(event["CallerIDNum"]) {
-			if utils.IsPAIU(event["CallerIDName"]) && event["Exten"] == "0402" { //relate to PACU Dial ICP caller name in AlarmHandle
-				lfshook.NewLogger().Infof("====BridgeEnter==IN action===%s===ID:%s   Name:%s", event["Event"], event["CallerIDNum"], event["CallerIDName"])
-				alstatus.AlarmStatus(event["CallerIDName"], "connect") // Alarm connected
-				if active.CabNum == "1" && active.Actived {
-					go RedirectInQueue(event["CallerIDName"], "2311", "chanspy-rule", "") // 1车ICP接听PAIU
-				} else if active.CabNum == "8" && active.Actived {
-					go RedirectInQueue(event["CallerIDName"], "2381", "chanspy-rule", "") // 1车ICP接听PAIU
-				}
-			} else if utils.IsPAIU(event["CallerIDName"]) && event["Exten"] == "0401" { // PAD connect to OCC
-				lfshook.NewLogger().Infof("====BridgeEnter==IN action===%s===ID:%s   Name:%s", event["Event"], event["CallerIDNum"], event["CallerIDName"])
-				alstatus.AlarmStatus(event["CallerIDName"], "connect") // Alarm connected
-
-				if active.CabNum == "1" && active.Actived {
-					go RedirectInQueue(event["CallerIDName"], "1411", "chanspy-rule", "") // 1车OCC接听PAIU
-				} else if active.CabNum == "8" && active.Actived {
-					go RedirectInQueue(event["CallerIDName"], "1481", "chanspy-rule", "") // 8车OCC接听PAIU
-				}
-			}
-		} else if utils.IsPAIU(event["CallerIDNum"]) { //No PACU available in the cab
+	case "BridgeEnter": // TMS-ICP answer PAD; PACU connect ICP
+		lfshook.NewLogger().Infof("=========event:%s   callerid:%s", event["Event"], event["CallerIDNum"])
+
+		if utils.IsPACU(event["CallerIDNum"]) && utils.IsPAIU(event["CallerIDName"]) { //ICP and PACU connected
 			lfshook.NewLogger().Infof("====BridgeEnter==IN action===%s===ID:%s   Name:%s", event["Event"], event["CallerIDNum"], event["CallerIDName"])
 			alstatus.AlarmStatus(event["CallerIDName"], "connect") // Alarm connected
+
+			if active.CabNum == "1" && active.Actived {
+				go RedirectInQueue(event["CallerIDName"], "2311", "chanspy-rule-whisper", "") //PAD chanspy(EqW) ICP1
+				go Dial("0403", event["CallerIDName"], "chanspy-rule", "2381", "2381", "8")   //ICP8---chanspy----PAD
+			} else if active.CabNum == "8" && active.Actived {
+				go RedirectInQueue(event["CallerIDName"], "2381", "chanspy-rule-whisper", "") //PAD chanspy(EqW) ICP8
+				go Dial("0403", event["CallerIDName"], "chanspy-rule", "2311", "2311", "1")   //ICP1---chanspy----PAD
+			}
+		} else if utils.IsPAIU(event["CallerIDNum"]) { // PAD connect ICP-TMS;PACU not available
+			lfshook.NewLogger().Infof("====send pad status=====")
+			alstatus.AlarmStatus(event["CallerIDNum"], "connect") // PAD connect ICP-TMS
 		}
 	}
-
 }
 
 func StartAMI(connectOKCallBack func(), handleEvents []func(event map[string]string)) {
@@ -197,7 +312,7 @@ func StartAMI(connectOKCallBack func(), handleEvents []func(event map[string]str
 		// lfshook.NewLogger().Infof("ami event on %+v", payload[0])
 		event := payload[0].(map[string]string)
 
-		HandleAMI(event)
+		go HandleAMI(event)
 
 		for _, handle := range handleEvents {
 			go handle(event)

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

@@ -3,6 +3,7 @@ package action
 import (
 	"errors"
 	"pbx-api-gin/internal/app/ami/model"
+	"pbx-api-gin/pkg/lfshook"
 
 	"github.com/mitchellh/mapstructure"
 )
@@ -36,6 +37,7 @@ func QueueStatus(queue, member string) (queueParams *model.QueueParams, err erro
 			queueParams.Entrys = append(queueParams.Entrys, entry)
 		}
 	}
+	lfshook.NewLogger().Infof("================QueueStatus calls:%v===========", queueParams.Calls)
 	return queueParams, nil
 }
 

+ 4 - 0
internal/app/index.go

@@ -7,6 +7,7 @@ import (
 	"pbx-api-gin/internal/app/mysql"
 	"pbx-api-gin/internal/app/stc"
 	"pbx-api-gin/internal/app/stc/active"
+	"pbx-api-gin/internal/app/stc/priority"
 	"pbx-api-gin/internal/app/stc/socket"
 	"pbx-api-gin/pkg/lfshook"
 	"pbx-api-gin/pkg/utils"
@@ -32,6 +33,9 @@ func StartApp() {
 
 	//init the active status
 	active.Actived = true
+	//get priority
+	priority.GetPriority()
+
 	// 启动带有重连机制的连接管理协程MC1
 	go stc.StartStcConnection(socket.Conn, "1")
 

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

@@ -1,7 +1,7 @@
 package active
 
-var ActiveCab string
+// var ActiveCab string
 var CabNum string
 var Actived bool
 
-var ActivedMC int
+//var ActivedMC int

+ 202 - 153
internal/app/stc/broadcast/stc-broadcast.go

@@ -7,14 +7,15 @@ import (
 	"io"
 	"net"
 	"net/http"
-	"pbx-api-gin/api/panel/asterisk"
 	"pbx-api-gin/internal/app/ami/action"
 	"pbx-api-gin/internal/app/ami/model"
 	"pbx-api-gin/internal/app/mysql"
 	"pbx-api-gin/internal/app/stc/active"
 	msgdata "pbx-api-gin/internal/app/stc/data"
+	"pbx-api-gin/internal/app/stc/priority"
 	alstatus "pbx-api-gin/internal/app/stc/sendstatus"
 	"pbx-api-gin/pkg/lfshook"
+	"strconv"
 	"sync"
 	"time"
 )
@@ -26,34 +27,29 @@ func HandleStcCmd(ctx context.Context, conn net.Conn) {
 	for {
 		select {
 		case <-ctx.Done():
-			lfshook.NewLogger().Logger.Infof("HandleStcCmd===ctx==ret======")
 			return
 
 		default:
-			var buf bytes.Buffer // 用于累积未处理完的数据流
+			var buf bytes.Buffer
 			tmp := make([]byte, 1024)
 
 			if conn != nil {
 				n, err := conn.Read(tmp)
 				if err != nil {
 					if err != io.EOF {
-						fmt.Println("Error reading from server:", err)
 						conn.Close()
 					}
 					return
 				}
-
-				// 将新读取的数据追加到缓冲区
 				buf.Write(tmp[:n])
 			}
-			// 尝试从缓冲区中提取完整数据包
+
 			for {
 				packet, err := msgdata.ExtractPacket(&buf)
 				if err != nil {
-					break // 没有完整包或出错,等待更多数据
+					break
 				}
-				// 成功提取一个包,进行处理
-				go processPacket(packet) // 使用 goroutine 避免阻塞接收
+				go processPacket(packet)
 			}
 		}
 	}
@@ -66,7 +62,7 @@ func processPacket(packet []byte) {
 		return
 	}
 
-	//for test
+	//for recv data log debug
 	if packet[5] != 0x03 && packet[5] != 0x0c && packet[5] != 0x01 {
 		lfshook.NewLogger().Logger.Infof("Get data from STC ===============:%x", packet)
 	}
@@ -84,32 +80,64 @@ func processPacket(packet []byte) {
 	}
 
 	switch packet[5] {
-	case 0x01: // heartbeat
-		// handle heartbeat
+	case 0x01:
+		break
+
 	case 0x02: // STN
-		lfshook.NewLogger().Infof("=====STN=========")
-		StationAnn(packet)
-	//case 0x03: // ACTIVE
-	//	Active([1]byte{packet[8]})
+		if priority.CheckPriority("STN") {
+			action.HangupAll()
+			StationAnn(packet)
+		}
+
 	case 0x05: // SPC
-		lfshook.NewLogger().Infof("=====SPC=========")
-		SpecialAnn(packet)
+		if priority.CheckPriority("SPC-TMS") {
+			action.HangupAll()
+			SpecialAnn(packet)
+		}
+
 	case 0x06: // EMG
-		lfshook.NewLogger().Infof("=====EMG=========")
 		EmgMsg(packet)
+
 	case 0x07: // STOP
 		AnnStop([4]byte{packet[8], packet[9], packet[10], packet[11]})
+
 	case 0x08: // DCS
-		lfshook.NewLogger().Infof("=====DCS=========")
-		DcsAnn(packet)
+		if priority.CheckPriority("DCS") {
+			action.HangupAll()
+			DcsAnn(packet)
+		}
+
 	case 0x09: // SELF CHECK
-		SelfCheck(packet)
+		if priority.CheckPriority("CHK") {
+			action.HangupAll()
+			SelfCheck(packet)
+		}
+
+	case 0x10: // SELF CHECK
+		if priority.CheckPriority("CHK") {
+			action.HangupAll()
+			VolumeAdjust(packet)
+		}
+
 	case 0x0a:
-		AlarmHandle(packet)
+		if priority.CheckPriority("PAD-TMS") {
+			action.HangupAll()
+			//AlarmHandleTMS(packet)
+			AlarmHandleICP(packet) //for test
+		}
+
 	case 0x0b:
-		AlarmResetAll()
+		AlarmHoldResetAll(packet[8])
+
 	case 0x0c:
 		RecordStorageConf(packet[8:])
+
+	case 0x0d:
+		if priority.CheckPriority("PAD-ICP") {
+			action.HangupAll()
+			AlarmHandleICP(packet)
+		}
+
 	default:
 		fmt.Printf("Unknown command: %x\n", packet[5])
 	}
@@ -124,16 +152,12 @@ func StationAnn(data []byte) (err error) {
 	datalen := int(data[11])
 
 	filename := msgdata.SubstrByRune(string(data[12:]), 0, datalen-4)
-	lfshook.NewLogger().Logger.Infof("=============Get filename  : %v", filename)
 
-	//update stn voice
-	_, er := mysql.DBOrmInstance.In("exten", Pacus).Update(&model.Extension{Special: specialVoice, PaType: "STN"})
-	if er != nil {
-		lfshook.NewLogger().Logger.Infof("update special voice to exten err : %+v", er.Error())
-		return er
-	}
+	//set spc voice tag
+	priority.SpecialVoice = specialVoice
 
 	//Pa status report
+	priority.RunningType, _ = strconv.Atoi(priority.Priority.STN)
 	alstatus.PaStatus("", "STN", "start")
 
 	action.PlaybackPacu(filename, int(cycleCount), int(delay), "STN")
@@ -211,16 +235,10 @@ func SpecialAnn(data []byte) {
 
 	filename := msgdata.SubstrByRune(string(data[11:]), 0, datalen-4)
 
-	//update pa type
-	_, er := mysql.DBOrmInstance.In("exten", Pacus).Update(&model.Extension{PaType: "SPC"})
-	if er != nil {
-		lfshook.NewLogger().Logger.Infof("update special voice to exten err : %+v", er.Error())
-	}
-
 	//Pa status report
+	priority.RunningType, _ = strconv.Atoi(priority.Priority.SPCTMS)
 	alstatus.PaStatus("", "SPC", "start")
 
-	lfshook.NewLogger().Infof("======count:%x", cycleCount)
 	if int(cycleCount) == 255 {
 		action.PlaybackPacu(filename, 9999999, int(delay), "SPC")
 	} else {
@@ -236,16 +254,10 @@ func EmgMsg(data []byte) {
 
 	filename := msgdata.SubstrByRune(string(data[11:]), 0, datalen-4)
 
-	//update pa type
-	_, er := mysql.DBOrmInstance.In("exten", Pacus).Update(&model.Extension{PaType: "EMG"})
-	if er != nil {
-		lfshook.NewLogger().Logger.Infof("update special voice to exten err : %+v", er.Error())
-	}
-
 	//Pa status report
+	priority.RunningType, _ = strconv.Atoi(priority.Priority.EMGTMS)
 	alstatus.PaStatus("", "EMG", "start")
 
-	lfshook.NewLogger().Infof("======count:%x", cycleCount)
 	if int(cycleCount) == 255 {
 		action.PlaybackPacu(filename, 9999999, int(delay), "EMG")
 	} else {
@@ -256,32 +268,24 @@ func EmgMsg(data []byte) {
 // 停止指定类型广播
 func AnnStop(data [4]byte) {
 
-	RunningType := ""
+	PaType := ""
 
 	switch data[0] {
 	case 0x03:
-		RunningType = "DCS"
+		PaType = "DCS"
 	case 0x04:
-		RunningType = "EMG"
+		PaType = "EMG"
 	case 0x07:
-		RunningType = "SPC"
+		PaType = "SPC"
 	case 0x08:
-		RunningType = "STN"
+		PaType = "STN"
 	case 0x09:
-		RunningType = "CHK"
+		PaType = "CHK"
 	}
 
-	alstatus.PaStatus("", RunningType, "end")
-
-	for _, ext := range Pacus {
-		action.Hangup(ext)
-	}
-
-	//update pa type
-	_, er := mysql.DBOrmInstance.Cols("patype").Where("pa_type = ?", RunningType).Update(&model.Extension{PaType: ""})
-	if er != nil {
-		lfshook.NewLogger().Logger.Infof("update special voice to exten err : %+v", er.Error())
-	}
+	priority.RunningType = 0
+	alstatus.PaStatus("", PaType, "end")
+	action.HangupAll()
 
 }
 
@@ -293,14 +297,8 @@ func DcsAnn(data []byte) {
 
 	filename := msgdata.SubstrByRune(string(data[11:]), 0, datalen-4)
 
-	//update pa type
-	_, er := mysql.DBOrmInstance.In("exten", Pacus).Update(&model.Extension{PaType: "DCS"})
-	if er != nil {
-		lfshook.NewLogger().Logger.Infof("update special voice to exten err : %+v", er.Error())
-	}
-
-	//lfshook.NewLogger().Infof("======count:%x", cycleCount)
 	//Pa status report
+	priority.RunningType, _ = strconv.Atoi(priority.Priority.DCS)
 	alstatus.PaStatus("", "DCS", "start")
 
 	if int(cycleCount) == 255 {
@@ -310,8 +308,8 @@ func DcsAnn(data []byte) {
 	}
 }
 
-// 自检广播
-func SelfCheck(data []byte) {
+// 调音广播
+func VolumeAdjust(data []byte) {
 
 	check := data[8]
 	delay := data[9]
@@ -320,28 +318,43 @@ func SelfCheck(data []byte) {
 
 	filename := msgdata.SubstrByRune(string(data[12:]), 0, datalen-4)
 
-	//update pa type
-	_, er := mysql.DBOrmInstance.In("exten", Pacus).Update(&model.Extension{PaType: "CHK"})
-	if er != nil {
-		lfshook.NewLogger().Logger.Infof("update special voice to exten err : %+v", er.Error())
+	switch check {
+	case 0x01: //start
+
+		//Pa status report
+		priority.RunningType, _ = strconv.Atoi(priority.Priority.CHK)
+		alstatus.PaStatus("", "VOL", "start")
+		action.PlaybackPacu(filename, int(cycleCount), int(delay), "VOL")
+	case 0x02: //stop
+
+		alstatus.PaStatus("", "VOL", "end")
+		action.HangupAll()
 	}
+}
+
+// 自检广播
+func SelfCheck(data []byte) {
+
+	check := data[8]
+	delay := data[9]
+	cycleCount := data[10]
+	datalen := int(data[11])
+
+	filename := msgdata.SubstrByRune(string(data[12:]), 0, datalen-4)
 
 	switch check {
 	case 0x01: //start
 
 		//Pa status report
+		priority.RunningType, _ = strconv.Atoi(priority.Priority.CHK)
 		alstatus.PaStatus("", "CHK", "start")
 		action.PlaybackPacu(filename, int(cycleCount), int(delay), "CHK")
 	case 0x02: //stop
 
 		//Pa status report
+		priority.RunningType = 0
 		alstatus.PaStatus("", "CHK", "end")
-
-		for _, ext := range Pacus {
-			asterisk.Hangup(ext)
-		}
-		asterisk.Hangup("2311")
-		asterisk.Hangup("2381")
+		action.HangupAll()
 	}
 }
 
@@ -357,25 +370,24 @@ func suppressKey(exten string, handler byte) string {
 }
 
 // ICP操作乘客报警(根据激活信息判断转到1车还是8车================)
-func AlarmHandle(data []byte) {
+func AlarmHandleICP(data []byte) {
 	handler := data[8]
-	//extlen := data[9]
 	carr := data[12]
 	pos := data[13]
 	exten := fmt.Sprintf("24%c%c", carr, pos)
-	PacuNum := fmt.Sprintf("21%c%c", carr, pos)
 
 	key := suppressKey(exten, handler)
 
 	//Drop other handler in 2 sec
-	// 只对 handler == 0x01 做 2 秒去重
+	//PACUs---call---->ICP1
+	//PAD---->Chanspy(WEq)-->ICP1
+	//ICP2--->Chanspy(Eq)---->PAD
 	if handler == 0x01 {
 		if _, loaded := suppressedExts.LoadOrStore(key, struct{}{}); loaded {
 			lfshook.NewLogger().Logger.Infof("Suppressed duplicate ICP Alarm (handler=0x01) for exten: %s within 4 seconds", exten)
-			return // 已存在,说明在2秒窗口期内,直接丢弃
+			return
 		}
 
-		// 设置4秒后删除该 key,允许下次通过
 		time.AfterFunc(4*time.Second, func() {
 			suppressedExts.Delete(key)
 			lfshook.NewLogger().Logger.Debugf("Suppression released for key: %s", key)
@@ -385,27 +397,14 @@ func AlarmHandle(data []byte) {
 	switch handler {
 	case 0x01: //answer(ICP+Alarm+PACU)
 		//NotifyPaiu(exten, "answer")
-
-		//get pacu status
-		var infoExt model.Extension
-		_, er := mysql.DBOrmInstance.Where("exten = ?", PacuNum).Get(&infoExt)
-		if er != nil {
-			lfshook.NewLogger().Logger.Infof("update special voice to exten err : %+v", er.Error())
-		}
-
+		priority.ICPAnswer = 1
 		lfshook.NewLogger().Logger.Infof("================ICP Answer PAD================:%s ", exten)
-		if infoExt.Status == "Idle" {
-			if active.CabNum == "1" && active.Actived {
-				action.Dial("0402", PacuNum, "default", PacuNum, exten, "1") // PACU dial ICP MC1
-			} else if active.CabNum == "8" && active.Actived {
-				action.Dial("0402", PacuNum, "default", PacuNum, exten, "8") // PACU dial ICP MC8
-			}
-		} else {
-			if active.CabNum == "1" && active.Actived {
-				action.RedirectInQueue(exten, "0402", "default", "1") // PAD dial ICP MC1
-			} else if active.CabNum == "8" && active.Actived {
-				action.RedirectInQueue(exten, "0402", "default", "8") // PAD dial ICP MC8
-			}
+		if active.CabNum == "1" && active.Actived {
+			action.Dial("0402", "0511", "pad-rule-pacus", "ani1", exten, "1") // PACUs dial ICP1
+			//goto ami event ConfbridgeJoin, ICP answer PAD
+		} else if active.CabNum == "8" && active.Actived {
+			action.Dial("0402", "0511", "pad-rule-pacus", "ani8", exten, "8") // PACUs dial ICP8
+			//goto ami event ConfbridgeJoin, ICP answer PAD
 		}
 
 	case 0x02: //hold  重新放回队列里面
@@ -414,50 +413,82 @@ func AlarmHandle(data []byte) {
 		if err != nil {
 			lfshook.NewLogger().Info(err)
 		}
-		if active.CabNum == "1" && active.Actived {
-			action.Hangup("2311") //1 车接听
-		} else if active.CabNum == "8" && active.Actived {
-			action.Hangup("2381") //8 车接听
-		}
+		action.Hangup("2311") //1 车接听
+		action.Hangup("2381") //8 车接听
+
 	case 0x03: //hangup
 		//NotifyPaiu(exten, "hangup")
-		action.Hangup(exten)
-		if active.CabNum == "1" && active.Actived {
-			action.Hangup("2311") //1 车接听
-		} else if active.CabNum == "8" && active.Actived {
-			action.Hangup("2381") //8 车接听
-		}
+		/*		action.Hangup(exten)  //Pad
+				action.Hangup("2311") //1 车接听
+				action.Hangup("2381") //8 车接听
+		*/
+		action.HangupAll()
+	}
+}
 
-	case 0x04: //take back from OCC
-		//OCC - ICP <<< PAD-spy OCC
-		//break hangup occ first , keep pad spy-channel ,reconnect Pacu and icp , redirect pad channel to spy-icp
-		if active.CabNum == "1" && active.Actived { //hangup OCC MC1
-			action.Hangup("1411")
-		} else if active.CabNum == "8" && active.Actived { //hangup OCC MC8
-			action.Hangup("1481")
-		}
+// TMS操作乘客报警(根据激活信息判断转到1车还是8车================)
+func AlarmHandleTMS(data []byte) {
+	handler := data[8]
+	//extlen := data[9]
+	carr := data[12]
+	pos := data[13]
+	exten := fmt.Sprintf("24%c%c", carr, pos)
+	PacuNum := fmt.Sprintf("21%c%c", carr, pos)
+
+	key := suppressKey(exten, handler)
 
-		//get pacu status
-		var infoExt model.Extension
-		_, er := mysql.DBOrmInstance.Where("exten = ?", PacuNum).Get(&infoExt)
-		if er != nil {
-			lfshook.NewLogger().Logger.Infof("update special voice to exten err : %+v", er.Error())
+	//Drop other handler in 2 sec
+	// 只对 handler == 0x01 做 2 秒去重
+	if handler == 0x01 {
+		if _, loaded := suppressedExts.LoadOrStore(key, struct{}{}); loaded {
+			lfshook.NewLogger().Logger.Infof("Suppressed duplicate ICP Alarm (handler=0x01) for exten: %s within 4 seconds", exten)
+			return // 已存在,说明在2秒窗口期内,直接丢弃
 		}
 
-		lfshook.NewLogger().Logger.Infof("================IPC take over PAD from OCC================:%s ", exten)
-		if infoExt.Status == "Idle" {
+		// 设置4秒后删除该 key,允许下次通过
+		time.AfterFunc(4*time.Second, func() {
+			suppressedExts.Delete(key)
+			lfshook.NewLogger().Logger.Debugf("Suppression released for key: %s", key)
+		})
+	}
+
+	switch handler {
+	case 0x01: //answer(ICP+Alarm+PACU)
+		//PACU---call---->ICP1
+		//PAD---->Chanspy(WEq)-->ICP1
+		//ICP2--->spy(Eq)---->PAD
+
+		priority.ICPAnswer = 1
+		lfshook.NewLogger().Logger.Infof("================TMS Answer PAD:%s===PACU:%s==========", exten, PacuNum)
+		if action.ExtenStatus(PacuNum) == "Idle" {
 			if active.CabNum == "1" && active.Actived {
-				action.Dial("0402", PacuNum, "default", PacuNum, exten, "1") // PACU dial ICP MC1
+				action.Dial("0403", PacuNum, "default", PacuNum, exten, "1") // PACU dial ICP1
+				//goto ami event BridgeEnter, ICP8 whisper ICP1
 			} else if active.CabNum == "8" && active.Actived {
-				action.Dial("0402", PacuNum, "default", PacuNum, exten, "8") // PACU dial ICP MC8
+				action.Dial("0403", PacuNum, "default", PacuNum, exten, "8") // PACU dial ICP8
+				//goto ami event BridgeEnter, ICP1 whisper ICP8
 			}
 		} else {
-			if active.CabNum == "1" && active.Actived {
-				action.RedirectInQueue(exten, "0402", "default", "1") // PAD dial ICP MC1
-			} else if active.CabNum == "8" && active.Actived {
-				action.RedirectInQueue(exten, "0402", "default", "8") // PAD dial ICP MC8
-			}
+			action.RedirectInQueue(exten, "0405", "default", exten) // PAD dial ICPs
 		}
+
+	case 0x02: //hold  重新放回队列里面
+		NotifyPaiu(exten, "hold")
+		err := action.RedirectInQueue(exten, "0300", "default", "1")
+		if err != nil {
+			lfshook.NewLogger().Info(err)
+		}
+
+		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.HangupAll()
 	}
 }
 
@@ -495,7 +526,7 @@ func NotifyPaiu(Exten, Action string) {
 }
 
 // 挂断所有报警器
-func AlarmResetAll() {
+func AlarmHoldResetAll(data byte) {
 
 	var AlarmExts []model.Extension
 
@@ -504,16 +535,34 @@ func AlarmResetAll() {
 		lfshook.NewLogger().Logger.Infof("update special voice to exten err : %+v", er.Error())
 	}
 
-	for _, ext := range AlarmExts {
-		action.Hangup(ext.Extension)
-	}
+	//all hold
+	if data == 1 {
+		for _, ext := range AlarmExts {
+			err := action.RedirectInQueue(ext.Extension, "0300", "default", "1")
+			if err != nil {
+				lfshook.NewLogger().Info(err)
+			}
+		}
 
-	if active.CabNum == "1" && active.Actived {
-		action.Hangup("2311")                    //1 车接听
-		alstatus.AlarmStatus("0000", "allreset") //send all reset status
-	} else if active.CabNum == "8" && active.Actived {
-		action.Hangup("2381")                    //8 车接听
-		alstatus.AlarmStatus("0000", "allreset") // send all reset status
+		if active.CabNum == "1" && active.Actived {
+			action.Hangup("2311")                   //1 车接听
+			alstatus.AlarmStatus("0000", "allhold") //send all hold status
+		} else if active.CabNum == "8" && active.Actived {
+			action.Hangup("2381")                   //8 车接听
+			alstatus.AlarmStatus("0000", "allhold") // send all hold status
+		}
+	} else if data == 2 { //all reset
+		for _, ext := range AlarmExts {
+			action.Hangup(ext.Extension)
+		}
+
+		if active.CabNum == "1" && active.Actived {
+			action.Hangup("2311")                    //1 车接听
+			alstatus.AlarmStatus("0000", "allreset") //send all reset status
+		} else if active.CabNum == "8" && active.Actived {
+			action.Hangup("2381")                    //8 车接听
+			alstatus.AlarmStatus("0000", "allreset") // send all reset status
+		}
 	}
 }
 
@@ -529,8 +578,8 @@ func RecordStorageConf(data []byte) {
 	info.PadRcdDelDays = int(data[4])
 	info.PaRcdDelDays = int(data[5])
 	info.CpaRcdDelDays = int(data[6])
-	info.OpaRcdStorageDays = int(data[7])
-	info.OpaRcdDelDays = int(data[8])
+	//info.OpaRcdStorageDays = int(data[7])
+	//info.OpaRcdDelDays = int(data[8])
 
 	//lfshook.NewLogger().Infof("=============Set record Conf : %+v", info)
 

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

@@ -0,0 +1,98 @@
+package priority
+
+import (
+	"os"
+	"strconv"
+
+	"github.com/sirupsen/logrus"
+	"gopkg.in/ini.v1"
+)
+
+var ICPAnswer = 0
+var OCCAnswer = 0
+var RunningType = 0
+var SpecialVoice = 0
+
+type PriorityAll struct {
+	ManuPa string `json:"manualPa"`
+	CabCab string `json:"cabCab"`
+	PADICP string `json:"padIcp"`
+	PADTMS string `json:"padTms"`
+	PADOCC string `json:"padOcc"`
+	CPA    string `json:"cpa"`
+	EMGTMS string `json:"emgTms"`
+	SPCTMS string `json:"spcTms"`
+	DCS    string `json:"dcs"`
+	STN    string `json:"stn"`
+	CHK    string `json:"chk"`
+}
+
+var Priority PriorityAll
+
+func GetPriority() {
+	filePath := "/etc/asterisk/priority.conf"
+	_, err := os.Stat(filePath)
+	if err != nil {
+		logrus.Error(err)
+		return
+	}
+	iniFile, err := ini.Load(filePath)
+	if err != nil {
+		logrus.Error(err)
+		return
+	}
+
+	Priority.CHK = iniFile.Section("general").Key("ManuPa").Value()
+	Priority.STN = iniFile.Section("general").Key("CabCab").Value()
+	Priority.DCS = iniFile.Section("general").Key("PAD-ICP").Value()
+	Priority.SPCTMS = iniFile.Section("general").Key("PAD-TMS").Value()
+	Priority.EMGTMS = iniFile.Section("general").Key("PAD-OCC").Value()
+	Priority.CPA = iniFile.Section("general").Key("CPA").Value()
+	Priority.PADOCC = iniFile.Section("general").Key("EMG-TMS").Value()
+	Priority.PADTMS = iniFile.Section("general").Key("SPC-TMS").Value()
+	Priority.PADICP = iniFile.Section("general").Key("DCS").Value()
+	Priority.CabCab = iniFile.Section("general").Key("STN").Value()
+	Priority.ManuPa = iniFile.Section("general").Key("CHK").Value()
+}
+
+func GetPriorityByKey(key string) string {
+	filePath := "/etc/asterisk/priority.conf"
+	_, err := os.Stat(filePath)
+	if err != nil {
+		logrus.Error(err)
+		return ""
+	}
+	iniFile, err := ini.Load(filePath)
+	if err != nil {
+		logrus.Error(err)
+		return ""
+	}
+
+	return iniFile.Section("general").Key(key).Value()
+}
+
+// check priority , if the running priority is lowwer than the to run priority
+func CheckPriority(runType string) bool {
+	//check special voice
+	if SpecialVoice == 1 {
+		return false
+	}
+
+	//no any runing task
+	if RunningType == 0 {
+		return true
+	}
+
+	//get the priority to run in the config file
+	ret, err := strconv.Atoi(GetPriorityByKey(runType))
+	if err != nil {
+		logrus.Error(err)
+		return false
+	}
+
+	//if the running task priority is lowwer
+	if ret < RunningType && ret != 0 {
+		return true
+	}
+	return false
+}

+ 33 - 1
internal/app/stc/sendstatus/status.go

@@ -10,6 +10,8 @@ import (
 	"pbx-api-gin/pkg/utils"
 )
 
+var ExtenStatMap map[string]string
+
 func SendToStc(conn net.Conn, data []byte) {
 
 	_, err := conn.Write(data)
@@ -87,7 +89,7 @@ func AlarmStatus(exten string, status string) {
 
 // report broadcast status to STC
 func PaStatus(src string, patype string, operation string) {
-
+	lfshook.NewLogger().Logger.Infof("===PAStatus=Startext:%s=== type:%s=========action:%s", src, patype, operation)
 	protocol := msgdata.NewProtocol()
 	protocol.MessageID = 0x22
 	protocol.DataLength = 0x04
@@ -151,6 +153,36 @@ func PaStatus(src string, patype string, operation string) {
 	}
 }
 
+// report broadcast status to STC
+func OccPad(operation string) {
+	lfshook.NewLogger().Logger.Infof("===OCC-PAD========action:%s", operation)
+	protocol := msgdata.NewProtocol()
+	protocol.MessageID = 0x2A
+	protocol.DataLength = 0x04
+	protocol.Data = make([]byte, 4)
+
+	//广播发起方
+	switch operation {
+	case "start": //mc1
+		protocol.Data[0] = 0x01
+	case "end": //mc8
+		protocol.Data[0] = 0x02
+	case "": //
+		protocol.Data[0] = 0x00
+	}
+
+	encoded, errEn := protocol.Encode()
+	if errEn != nil {
+		fmt.Println("Encode error:", errEn)
+		return
+	}
+
+	if active.Actived {
+		SendToStc(socket.Conn, encoded)
+		SendToStc(socket.Conn8, encoded)
+	}
+}
+
 // report broadcast status to STC
 func SendRecordFile(filename, rcdtype string) {
 

+ 0 - 1
pkg/utils/utils.go

@@ -118,7 +118,6 @@ func IsPAIU(input string) bool {
 
 // 判断是否是广播分机
 func IsPACU(input string) bool {
-
 	if len(input) == 4 {
 		return input[:2] == "21"
 	}