dujunchen 2 週間 前
コミット
c256fabbdc

+ 27 - 44
internal/app/ami/action/index.go

@@ -19,7 +19,7 @@ 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
@@ -79,26 +79,11 @@ func HandleAMI(event map[string]string) {
 	case "QueueCallerLeave": // Alarm timeout , redirect to OCC
 
 		if utils.IsPAIU(event["CallerIDNum"]) { // caller is PAD
-			var infoExt model.Extension
-			PacuNum := utils.GetPacuByPad(event["CallerIDNum"])
-
-			_, 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 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
-				}
-			} 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
-				}
+			if active.CabNum == "1" && active.Actived {
+				Dial("0401", "0511", "pad-rule-cab1", "ano-1", event["CallerIDNum"], "1") // PACUs dial OCC1
+			} else if active.CabNum == "8" && active.Actived {
+				Dial("0401", "0512", "pad-rule-cab8", "ano-8", event["CallerIDNum"], "8") // PACUs dial OCC8
 			}
 		}
 
@@ -108,18 +93,30 @@ func HandleAMI(event map[string]string) {
 			lfshook.NewLogger().Infof("====PA status:%s=====", "start")
 			alstatus.PaStatus(event["CallerIDNum"], "PA", "start")
 		}
-		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")
 			alstatus.PaStatus(event["CallerIDNum"], "CPA", "start")
 		}
 
+		if utils.IsIO(event["CallerIDNum"]) && event["Exten"] == "0511" { //PAD answered by ICP; PACUs connected ICP1
+			lfshook.NewLogger().Infof("====PAD answered by ICP1:%s=====", event["CallerIDNum"])
+			alstatus.AlarmStatus(event["CallerIDNum"], "connect")
+			go RedirectInQueue(event["CallerIDName"], "2311", "chanspy-rule", "") //PAD whisper ICP1
+		}
+
+		if utils.IsIO(event["CallerIDNum"]) && event["Exten"] == "0512" { //PAD ansered by ICP8; PACUs connected ICP8
+			lfshook.NewLogger().Infof("====PAD answered by ICP8:%s=====", event["CallerIDNum"])
+			alstatus.AlarmStatus(event["CallerIDNum"], "connect")
+			go RedirectInQueue(event["CallerIDName"], "2381", "chanspy-rule", "") //PAD whisper ICP8
+		}
+
 	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")
 			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")
 			alstatus.PaStatus(event["CallerIDNum"], "CPA", "end")
 		}
@@ -155,32 +152,18 @@ func HandleAMI(event map[string]string) {
 		}
 
 	case "BridgeEnter":
+		lfshook.NewLogger().Infof("=========event:%s   callerid:%s", event["Event"], event["CallerIDNum"])
 		//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
+		if utils.IsPACU(event["CallerIDNum"]) { //TMS-ICP connected PACU
 			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车TMS-ICP接听PAIU, PAD whisper ICP
+			} else if active.CabNum == "8" && active.Actived {
+				go RedirectInQueue(event["CallerIDName"], "2381", "chanspy-rule", "") // 8车TMS-ICP接听PAIU, PAD whisper ICP
+			}
 		}
 	}
-
 }
 
 func StartAMI(connectOKCallBack func(), handleEvents []func(event map[string]string)) {
@@ -197,7 +180,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)

+ 61 - 29
internal/app/stc/broadcast/stc-broadcast.go

@@ -66,7 +66,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)
 	}
@@ -87,29 +87,25 @@ func processPacket(packet []byte) {
 	case 0x01: // heartbeat
 		// handle heartbeat
 	case 0x02: // STN
-		lfshook.NewLogger().Infof("=====STN=========")
 		StationAnn(packet)
-	//case 0x03: // ACTIVE
-	//	Active([1]byte{packet[8]})
 	case 0x05: // SPC
-		lfshook.NewLogger().Infof("=====SPC=========")
 		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)
 	case 0x09: // SELF CHECK
 		SelfCheck(packet)
 	case 0x0a:
-		AlarmHandle(packet)
+		AlarmHandleTMS(packet)
 	case 0x0b:
 		AlarmResetAll()
 	case 0x0c:
 		RecordStorageConf(packet[8:])
+	case 0x0d:
+		AlarmHandleICP(packet)
 	default:
 		fmt.Printf("Unknown command: %x\n", packet[5])
 	}
@@ -357,7 +353,7 @@ 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]
@@ -394,18 +390,11 @@ func AlarmHandle(data []byte) {
 		}
 
 		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-cab1", "ani-1", exten, "1") // PACU dial ICP MC1
+		} else if active.CabNum == "8" && active.Actived {
+			action.Dial("0402", "0512", "pad-rule-cab8", "ani-8", exten, "8") // PACU dial ICP MC8
 		}
 
 	case 0x02: //hold  重新放回队列里面
@@ -427,16 +416,39 @@ func AlarmHandle(data []byte) {
 		} else if active.CabNum == "8" && active.Actived {
 			action.Hangup("2381") //8 车接听
 		}
+	}
+}
+
+// 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)
 
-	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")
+	key := suppressKey(exten, handler)
+
+	//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秒窗口期内,直接丢弃
 		}
 
+		// 设置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)
+		//NotifyPaiu(exten, "answer")
+
 		//get pacu status
 		var infoExt model.Extension
 		_, er := mysql.DBOrmInstance.Where("exten = ?", PacuNum).Get(&infoExt)
@@ -444,7 +456,7 @@ func AlarmHandle(data []byte) {
 			lfshook.NewLogger().Logger.Infof("update special voice to exten err : %+v", er.Error())
 		}
 
-		lfshook.NewLogger().Logger.Infof("================IPC take over PAD from OCC================:%s ", exten)
+		lfshook.NewLogger().Logger.Infof("================TMS 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
@@ -458,6 +470,26 @@ func AlarmHandle(data []byte) {
 				action.RedirectInQueue(exten, "0402", "default", "8") // PAD dial ICP MC8
 			}
 		}
+
+	case 0x02: //hold  重新放回队列里面
+		NotifyPaiu(exten, "hold")
+		err := action.RedirectInQueue(exten, "0300", "default", "1")
+		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 车接听
+		}
+	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 车接听
+		}
 	}
 }
 

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

@@ -0,0 +1,3 @@
+package priority
+
+//path = "/etc/asterisk/priority.conf"

+ 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"
 	}