|
@@ -8,6 +8,8 @@ import (
|
|
|
"pbx-api-gin/internal/app/mysql"
|
|
|
msgdata "pbx-api-gin/internal/app/stc/data"
|
|
|
"pbx-api-gin/pkg/lfshook"
|
|
|
+ "sync"
|
|
|
+ "time"
|
|
|
)
|
|
|
|
|
|
var Pacus = []string{"2111", "2121", "2131", "2141", "2151", "2161", "2171", "2181"}
|
|
@@ -21,7 +23,9 @@ func HandleStcCmd(conn net.Conn) {
|
|
|
fmt.Println("Error reading from server:", err)
|
|
|
return
|
|
|
}
|
|
|
- lfshook.NewLogger().Logger.Infof("Get data from STC :%+v", buffer[:n])
|
|
|
+ if buffer[5] != 0x01 {
|
|
|
+ lfshook.NewLogger().Logger.Infof("Get data from STC ===============:%x", buffer[:n])
|
|
|
+ }
|
|
|
|
|
|
switch buffer[5] {
|
|
|
case 0x01: //heartbeat
|
|
@@ -48,7 +52,7 @@ func HandleStcCmd(conn net.Conn) {
|
|
|
SelfCheck(buffer)
|
|
|
|
|
|
case 0x0a: //
|
|
|
- AlarmHandle(buffer[10:])
|
|
|
+ AlarmHandle(buffer)
|
|
|
|
|
|
case 0x0b: //
|
|
|
AlarmResetAll()
|
|
@@ -205,25 +209,72 @@ func SelfCheck(data []byte) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// 全局变量:记录正在抑制的 exten
|
|
|
+var (
|
|
|
+ suppressedExts = sync.Map{} // map[string]struct{},值存在即表示被抑制
|
|
|
+ suppressionMu sync.Mutex // 保护初始化和清理操作(可选)
|
|
|
+)
|
|
|
+
|
|
|
+// suppressKey 生成用于抑制的 key(可以根据需求扩展)
|
|
|
+func suppressKey(exten string, handler byte) string {
|
|
|
+ return fmt.Sprintf("%s_h%x", exten, handler)
|
|
|
+}
|
|
|
+
|
|
|
// ICP操作乘客报警(根据激活信息判断转到1车还是8车================)
|
|
|
func AlarmHandle(data []byte) {
|
|
|
handler := data[8]
|
|
|
- extlen := data[9]
|
|
|
- exten := msgdata.SubstrByRune(string(data[10:]), 0, int(extlen))
|
|
|
+ //extlen := data[9]
|
|
|
+ carr := data[12]
|
|
|
+ pos := data[13]
|
|
|
+ exten := fmt.Sprintf("24%c%c", carr, pos)
|
|
|
+
|
|
|
+ lfshook.NewLogger().Logger.Infof("================ICP Answer PAD================:%s ", exten)
|
|
|
+ key := suppressKey(exten, handler)
|
|
|
+
|
|
|
+ // 只对 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 2 seconds", exten)
|
|
|
+ return // 已存在,说明在2秒窗口期内,直接丢弃
|
|
|
+ }
|
|
|
+
|
|
|
+ // 设置2秒后删除该 key,允许下次通过
|
|
|
+ time.AfterFunc(4*time.Second, func() {
|
|
|
+ suppressedExts.Delete(key)
|
|
|
+ lfshook.NewLogger().Logger.Debugf("Suppression released for key: %s", key)
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ // 设置2秒后删除该 key,允许下次通过
|
|
|
+ time.AfterFunc(1*time.Second, func() {
|
|
|
+ suppressedExts.Delete(key)
|
|
|
+ lfshook.NewLogger().Logger.Debugf("Suppression released for key: %s", key)
|
|
|
+ })
|
|
|
|
|
|
switch handler {
|
|
|
- case 0x01: //answer(ICP+Alarm+PACU==============================)
|
|
|
+ case 0x01: //answer(ICP+Alarm+PACU)
|
|
|
|
|
|
- err := action.Redirect(exten, "2311", "default") // 1车接听
|
|
|
+ err := action.RedirectInQueue(exten, "0402", "ani-rule", "1") // 1车ICP接听
|
|
|
if err != nil {
|
|
|
- lfshook.NewLogger().Info(err)
|
|
|
+ lfshook.NewLogger().Logger.Infof("================ICP Answer PAD====ERR============ : %+v", err.Error())
|
|
|
}
|
|
|
//invite PACU join in
|
|
|
//action.Hangup("PACU")
|
|
|
//action.ChanSpy("PACU", exten, false, true)
|
|
|
|
|
|
+ case 0x04: //answer(ICP+Alarm+PACU)
|
|
|
+
|
|
|
+ err := action.RedirectInQueue(exten, "0401", "ano-rule", "1") // 1车OCC接听
|
|
|
+ if err != nil {
|
|
|
+ //lfshook.NewLogger().Info(err)
|
|
|
+ lfshook.NewLogger().Logger.Infof("================ICP Answer PAD====ERR============ : %+v", err.Error())
|
|
|
+ }
|
|
|
+ //invite PACU join in
|
|
|
+ //action.Hangup("PACU")
|
|
|
+ //action.ChanSpy("PACU", exten, false, true)
|
|
|
+ lfshook.NewLogger().Logger.Infof("================ICP Answer PAD================:%s ", exten)
|
|
|
case 0x02: //hold 重新放回队列里面
|
|
|
- err := action.Redirect(exten, "0300", "default")
|
|
|
+ err := action.RedirectInQueue(exten, "0300", "default", "1")
|
|
|
if err != nil {
|
|
|
lfshook.NewLogger().Info(err)
|
|
|
}
|