index.go 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285
  1. package action
  2. import (
  3. "fmt"
  4. "os"
  5. "path/filepath"
  6. "pbx-api-gin/internal/app/stc/active"
  7. "pbx-api-gin/internal/app/stc/priority"
  8. alstatus "pbx-api-gin/internal/app/stc/sendstatus"
  9. "pbx-api-gin/internal/pkg/configs"
  10. "pbx-api-gin/pkg/lfshook"
  11. "pbx-api-gin/pkg/utils"
  12. "sort"
  13. "strings"
  14. "time"
  15. "github.com/sirupsen/logrus"
  16. "github.com/tqcenglish/amigo-go"
  17. "github.com/tqcenglish/amigo-go/pkg"
  18. )
  19. var AminInstance *amigo.Amigo
  20. var trainInfo = ""
  21. func HandleAMI(event map[string]string) {
  22. switch event["Event"] {
  23. case "DTMFBegin": //ICP interrupt PAD
  24. lfshook.NewLogger().Infof("=========%s====caller:%s=====digit:%s==", event["Event"], event["CallerIDNum"], event["Digit"])
  25. if utils.IsICP(event["CallerIDNum"]) && event["Exten"] != "" {
  26. //PA interrupt PAD
  27. switch event["Digit"] {
  28. case "#":
  29. //lfshook.NewLogger().Infof("===PA interrupt PAD====== ")
  30. runningTaskName := InterruptRunningTask("PA")
  31. if runningTaskName != "" {
  32. time.Sleep(time.Millisecond * 200) //wait endpoint release
  33. }
  34. case "*": //Cab cab interrupt PAD
  35. lfshook.NewLogger().Infof("===Cab cab interrupt PAD and====== ")
  36. runningTaskName := InterruptRunningTask("C2C")
  37. //Hangup("2311")
  38. //Hangup("2381")
  39. if runningTaskName != "" {
  40. time.Sleep(time.Millisecond * 100) //wait endpoint release
  41. }
  42. }
  43. }
  44. case "UserEvent": // RCD filename; PA;CPA; CabCab
  45. lfshook.NewLogger().Infof("========event:%s File:%s", event["Event"], event["FILENAME"])
  46. if event["UserEvent"] == "CONTINUE" && event["Type"] != "" {
  47. alstatus.PaStatus("", event["Type"], "continue")
  48. return
  49. }
  50. if event["UserEvent"] == "CallType" && (event["Type"] == "PA" || event["Type"] == "CPA") { //PA start; check manual PA priority
  51. //PA & CPA interrupt others
  52. if utils.IsICP(event["CallerIDNum"]) { //PA
  53. if active.ActivedCab == "" { //No active Signal on both side,Hangup caller
  54. Hangup(event["CallerIDNum"])
  55. }
  56. if priority.CheckPriority("ManuPa") {
  57. //hangup others if priority is higher
  58. lfshook.NewLogger().Infof("UserEvent event :PA start")
  59. runningTaskName := InterruptRunningTask("PA") //PA interrupt other
  60. if runningTaskName != "" {
  61. time.Sleep(time.Millisecond * 100) //wait endpoint release
  62. }
  63. } else {
  64. Hangup(event["CallerIDNum"]) //lowwer priority ,hangup caller
  65. }
  66. } else if utils.IsIO(event["CallerIDNum"]) { // CPA
  67. if priority.CheckPriority("CPA") {
  68. lfshook.NewLogger().Infof("========event:%s ========devide:%d", event["Event"], active.TrainDevide)
  69. if active.TrainDevide == 1 || active.RadioFault == 1 { // 列车没有断开的情况下限制如下;列车断开之后CPA无任何限制
  70. lfshook.NewLogger().Infof("===active.TrainDevide == 1 || active.RadioFault == 1====")
  71. } else {
  72. if active.ActivedCab == "" { //No active Signal on both side,Hangup caller
  73. Hangup(event["CallerIDNum"])
  74. } else if active.ActivedCab == "1" && event["CallerIDNum"] == "1411" {
  75. Hangup(event["CallerIDNum"])
  76. } else if active.ActivedCab == "8" && event["CallerIDNum"] == "1481" {
  77. Hangup(event["CallerIDNum"])
  78. }
  79. }
  80. //hangup others if priority is higher
  81. runningTaskName := InterruptRunningTask("CPA") //CPA interrupt other
  82. if runningTaskName != "" {
  83. time.Sleep(time.Millisecond * 100) //wait endpoint release
  84. }
  85. } else {
  86. Hangup(event["CallerIDNum"]) //lowwer priority ,hangup caller
  87. }
  88. }
  89. } else if event["UserEvent"] == "CallType" && event["Type"] == "C2C" { //CabCab start; check cab cab priority
  90. if priority.CheckPriority("CabCab") { // interrupt OCC-PAD
  91. //C2C start PAD interrupt
  92. taskName, _, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  93. lfshook.NewLogger().Infof("HighestPriorityRunningTask get task :%+v", taskName)
  94. if ok {
  95. if taskName == "PAD-ICP" || taskName == "PAD-TMS" || taskName == "PA" {
  96. runningTaskName := InterruptRunningTask("C2C")
  97. if runningTaskName != "" {
  98. time.Sleep(time.Millisecond * 100) //wait endpoint release
  99. }
  100. } else {
  101. lfshook.NewLogger().Infof("CabCab hangup other the one caller %s", event["CallerIDNum"])
  102. if event["CallerIDNum"] == "2311" {
  103. Hangup("2381")
  104. } else {
  105. Hangup("2311")
  106. }
  107. }
  108. }
  109. } else { // hangup caller; C2C start failed
  110. lfshook.NewLogger().Infof("CabCab hangup caller %s", event["CallerIDNum"])
  111. Hangup(event["CallerIDNum"])
  112. }
  113. break
  114. //Get record file name ,encode and upload
  115. } else if event["UserEvent"] == "SetRecordFile" {
  116. if configs.ConfigGlobal.ProcessRecord != "yes" {
  117. break
  118. }
  119. //检测录音文件是否存在;最多检测5次,每次间隔1秒
  120. var fileExists bool
  121. for i := 0; i < 5; i++ {
  122. time.Sleep(time.Second) // 等待1秒
  123. if _, err := os.Stat(event["FILENAME"]); err == nil {
  124. fileExists = true
  125. //lfshook.NewLogger().Infof("File found: %s", event["FILENAME"])
  126. break
  127. } else if os.IsNotExist(err) {
  128. //lfshook.NewLogger().Infof("File not found (attempt %d): %s", i+1, event["FILENAME"])
  129. } else {
  130. //lfshook.NewLogger().Infof("Error checking file: %v", err)
  131. }
  132. }
  133. if !fileExists { //5秒内没有生成录音文件
  134. lfshook.NewLogger().Infof("File %s not found after 5 attempts", event["FILENAME"])
  135. break
  136. }
  137. //获取录音文件时长,检测录音文件是否超过3min;
  138. duration, err := utils.GetDuration(event["FILENAME"])
  139. if err != nil {
  140. utils.Logger.Printf("%s Get duration err: %+v", event["FILENAME"], err)
  141. break
  142. }
  143. //lfshook.NewLogger().Infof("==========duration===== %d", duration)
  144. //转wav文件的采样率到22kHz,并切割位180秒每段
  145. var FileNames []string
  146. if duration >= 2000 { //超过2000秒的超长文件,不处理
  147. lfshook.NewLogger().Infof("Audio file time length over 2000 seconds, Ignored !")
  148. break
  149. } else if duration < 2000 { //小于2000秒文件进行转换和切割
  150. FileNames, err = utils.ConvertAndSegmentWAV(event["FILENAME"], strings.Replace(event["FILENAME"], ".wav", "", -1))
  151. if err != nil {
  152. lfshook.NewLogger().Infof("%s Get duration err: %+v", event["FILENAME"], err)
  153. break
  154. }
  155. //lfshook.NewLogger().Infof("=============== File %+v found after convert", FileNames)
  156. }
  157. //执行加密操作,并将录音信息写入日志文件
  158. DstFile := ""
  159. if len(FileNames) > 0 { // 文件切割之后进入循环处理
  160. for _, filepathFull := range FileNames {
  161. file := strings.Replace(filepathFull, ".wav", "", -1)
  162. DstFile = fmt.Sprintf("%s-encrypted.wav", file)
  163. //lfshook.NewLogger().Infof("Bin file====%s", DstFile)
  164. err = utils.AudioFileEncode(DstFile, filepathFull)
  165. if err != nil {
  166. lfshook.NewLogger().Infof("Encode file: %s err: %+v", DstFile, err)
  167. continue
  168. }
  169. //切割&加密之后发送生成的文件名到STC;
  170. alstatus.SendRecordFile(DstFile, event["RecordType"])
  171. trainInfo = fmt.Sprintf("TrainNumber %s ", active.TrainNum)
  172. if strings.Contains(event["FILENAME"], "PAD") {
  173. _, caller, callee := utils.GetPadInfo(event["FILENAME"])
  174. carNum := int(caller[2] - '0')
  175. //carNum := 4
  176. //trainInfo = fmt.Sprintf("TrainNumber %s CarNumber %s ", active.TrainNum, active.TrainInfoMap[active.TrainNum][int(caller[2])])
  177. //lfshook.NewLogger().Infof("Train info carNum===caller[2]==========:%d===============", carNum)
  178. trainInfo = fmt.Sprintf("TrainNumber %s CarNumber %s ", active.TrainNum, active.TrainInfoMap[active.TrainNum][carNum])
  179. //lfshook.NewLogger().Infof("Train info=============%s===============", trainInfo)
  180. if len(caller) == 4 && len(caller) > 0 {
  181. utils.Logger.Printf("Train Information: %s, MessageType: PAD , LocationCode: %c, Connected: %s, RecordFileName:%s", trainInfo, caller[3], callee, DstFile)
  182. } else {
  183. utils.Logger.Printf("Train Information: %s, MessageType: PAD , RecordFileName:%s . Can not get caller and callee !", trainInfo, DstFile)
  184. }
  185. } else if strings.Contains(event["FILENAME"], "C2C") {
  186. _, caller, _ := utils.GetPadInfo(event["FILENAME"])
  187. utils.Logger.Printf("Train Information: %s , MessageType: CabCab, Caller: %s, RecordFileName: %s", trainInfo, caller, DstFile)
  188. } else if strings.Contains(event["FILENAME"], "CPA") {
  189. _, caller, _ := utils.GetPadInfo(event["FILENAME"])
  190. utils.Logger.Printf("Train Information: %s , MessageType: CPA, Caller: %s, RecordFileName: %s", trainInfo, caller, DstFile)
  191. } else if strings.Contains(event["FILENAME"], "EMG") {
  192. utils.Logger.Printf("Train Information: %s , MessageType: EMG, RecordFileName: %s", trainInfo, DstFile)
  193. } else if strings.Contains(event["FILENAME"], "STN") {
  194. utils.Logger.Printf("Train Information: %s , MessageType: STN, RecordFileName: %s", trainInfo, DstFile)
  195. } else if strings.Contains(event["FILENAME"], "DCS") {
  196. utils.Logger.Printf("Train Information: %s , MessageType: DCS, RecordFileName: %s", trainInfo, DstFile)
  197. } else if strings.Contains(event["FILENAME"], "SPC") {
  198. utils.Logger.Printf("Train Information: %s , MessageType: SPC, RecordFileName: %s", trainInfo, DstFile)
  199. } else if strings.Contains(event["FILENAME"], "CHK") {
  200. utils.Logger.Printf("Train Information: %s , MessageType: Self Check, RecordFileName: %s", trainInfo, DstFile)
  201. } else if strings.Contains(event["FILENAME"], "TONE") {
  202. utils.Logger.Printf("Train Information: %s , MessageType: TONE Test, RecordFileName: %s", trainInfo, DstFile)
  203. } else if strings.Contains(event["FILENAME"], "PA") {
  204. _, caller, _ := utils.GetPadInfo(event["FILENAME"])
  205. utils.Logger.Printf("Train Information: %s , MessageType: PA, Caller: %s, RecordFileName: %s", trainInfo, caller, DstFile)
  206. }
  207. }
  208. //Get path & generate recording XML file
  209. path := filepath.Dir(event["FILENAME"])
  210. rcdFileName := filepath.Base(event["FILENAME"])
  211. xmlFileName := strings.Replace(rcdFileName, "wav", "xml", 1)
  212. xmlFilePath := path + "/" + xmlFileName
  213. lfshook.NewLogger().Infof("Train info= xml path============%s===============", xmlFilePath)
  214. err := active.GenerateXML(xmlFilePath)
  215. if err != nil {
  216. lfshook.NewLogger().Infof("Generate recording XML err:%+v", err)
  217. }
  218. } else {
  219. lfshook.NewLogger().Infof("No files to upload!!!")
  220. break
  221. }
  222. }
  223. case "Hangup":
  224. lfshook.NewLogger().Infof("%s", event["Event"])
  225. //OCC answer PAD, hangup, redirect the next PAD to OCC
  226. if utils.IsIO(event["CallerIDNum"]) && (event["ConnectedLineNum"] == "ano1" || event["ConnectedLineNum"] == "ano8") && event["Context"] == "default" {
  227. lfshook.NewLogger().Infof("Hangup OCC-PAD event: %+v", event)
  228. // OCC hangup detected, hangup other running channels
  229. runningTaskName := InterruptRunningTask("PAD-OCC")
  230. if runningTaskName != "" {
  231. time.Sleep(time.Millisecond * 100) //wait endpoint release
  232. }
  233. res, _ := QueueStatus("0301", "") // check OCC queue ,if empty PAD end
  234. if res == nil {
  235. return
  236. }
  237. if res.Calls == "0" { //OCC queue is empty
  238. alstatus.OccPad("end")
  239. priority.OCCAnswer = 0
  240. priority.PADOccStart = 0
  241. /*//clean confbridge
  242. taskTmp, _ := priority.RegistryTask.Get("PAD-OCC")
  243. ConfbridgeKick(taskTmp.ConfbridgeID, "all")
  244. //check resume
  245. priority.RegistryTask.StopAndUnregister("PAD-OCC")
  246. taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  247. if ok {
  248. if taskName == "EMG" {
  249. EMGConfbridgeReinvite(task.ConfbridgeID)
  250. } else if taskName == "CPA" {
  251. CPAConfbridgeReinvite(task.ConfbridgeID)
  252. }
  253. }
  254. */
  255. //break
  256. } else { //OCC queue is not empty
  257. time.Sleep(time.Millisecond * 100) //wait io idle
  258. //lfshook.NewLogger().Infof("====Start OCC-PAD===next==%+v", res)
  259. if active.ActivedCab == "1" && ExtenStatus("1411") == "Idle" { //check active and OCC status
  260. time.Sleep(time.Second)
  261. PADChan := ""
  262. if res.Entrys != nil {
  263. for _, chanEntry := range res.Entrys {
  264. lfshook.NewLogger().Infof("PAD answered by OCC1 pos:%s chan:%s", chanEntry.Position, chanEntry.Channel)
  265. if chanEntry.Position == "1" {
  266. PADChan = chanEntry.Channel
  267. break
  268. }
  269. }
  270. if PADChan != "" {
  271. Ext := strings.Split(strings.Split(res.Entrys[0].Channel, "/")[1], "-")[0]
  272. alstatus.AlarmStatus(Ext, "connect")
  273. go RedirectInQueue(PADChan, "1411", "pad-page-occ-icp", Ext) //PAD Page(OCC+ICPs)
  274. go Dial("0401", "0512", "pad-rule-pacus-occ", "ano1", "ano1", "1") // PACUs dial OCC1
  275. } else {
  276. lfshook.NewLogger().Infof("OCC-QueueStatus PADCchan NULL")
  277. }
  278. }
  279. break
  280. } else if active.ActivedCab == "8" && ExtenStatus("1481") == "Idle" {
  281. time.Sleep(time.Second)
  282. PADChan := ""
  283. if res.Entrys != nil {
  284. for _, chanEntry := range res.Entrys {
  285. lfshook.NewLogger().Infof("PAD answered by OCC1 pos:%s chan:%s", chanEntry.Position, chanEntry.Channel)
  286. if chanEntry.Position == "1" {
  287. PADChan = chanEntry.Channel
  288. break
  289. }
  290. }
  291. if PADChan != "" {
  292. Ext := strings.Split(strings.Split(res.Entrys[0].Channel, "/")[1], "-")[0]
  293. alstatus.AlarmStatus(Ext, "connect")
  294. go RedirectInQueue(PADChan, "1481", "pad-page-occ-icp", Ext) //PAD Page(OCC+ICPs)
  295. go Dial("0401", "0512", "pad-rule-pacus-occ", "ano8", "ano8", "8") // PACUs dial OCC1
  296. } else {
  297. lfshook.NewLogger().Infof("OCC QueueStatus PADCchan NULL")
  298. }
  299. }
  300. break
  301. }
  302. }
  303. }
  304. if utils.IsPAIU(event["CallerIDNum"]) { // PAD hangup, check if PAD all end, send PAD end status
  305. number := strings.Split(strings.Split(event["Channel"], "-")[0], "/")[1]
  306. //lfshook.NewLogger().Infof("===hangup PAD =======================%s", number)
  307. if utils.IsPAIU(number) {
  308. //clean confbridge & clean task info
  309. //PAD-ICP
  310. taskTmp, ok := priority.RegistryTask.Get("PAD-ICP")
  311. if ok {
  312. ConfbridgeKick(taskTmp.ConfbridgeID, "all")
  313. priority.RegistryTask.StopAndUnregister("PAD-ICP")
  314. }
  315. // PAD-TMS
  316. taskTmp, ok = priority.RegistryTask.Get("PAD-TMS")
  317. if ok {
  318. ConfbridgeKick(taskTmp.ConfbridgeID, "all")
  319. priority.RegistryTask.StopAndUnregister("PAD-TMS")
  320. }
  321. //PAD-OCC
  322. taskTmp, ok = priority.RegistryTask.Get("PAD-OCC")
  323. if ok {
  324. ConfbridgeKick(taskTmp.ConfbridgeID, "all")
  325. priority.RegistryTask.StopAndUnregister("PAD-OCC")
  326. }
  327. //Check PAD END
  328. res, _ := QueueStatus("0300", "") // check ICP queue ,if empty PAD end
  329. res1, _ := QueueStatus("0301", "") // check OCC queue ,if empty PAD end
  330. if res == nil || res1 == nil {
  331. return
  332. }
  333. lfshook.NewLogger().Infof("===Hangup PAD====== ICP Queue calls:%s OCC Queue calls:%s", res.Calls, res1.Calls)
  334. if res.Calls == "0" && res1.Calls == "0" {
  335. if priority.PADStart == 1 {
  336. //SetPadTimer()
  337. alstatus.PaStatus("", "PAD", "end")
  338. priority.PADStart = 0
  339. //priority.PADTMSStart = 0
  340. /*
  341. //clean confbridge
  342. //PAD-ICP
  343. taskTmp, ok := priority.RegistryTask.Get("PAD-ICP")
  344. if ok {
  345. ConfbridgeKick(taskTmp.ConfbridgeID, "all")
  346. }
  347. priority.RegistryTask.StopAndUnregister("PAD-ICP")
  348. // PAD-TMS
  349. taskTmp, ok = priority.RegistryTask.Get("PAD-TMS")
  350. if ok {
  351. ConfbridgeKick(taskTmp.ConfbridgeID, "all")
  352. }
  353. priority.RegistryTask.StopAndUnregister("PAD-TMS")
  354. //PAD-OCC
  355. taskTmp, ok = priority.RegistryTask.Get("PAD-OCC")
  356. if ok {
  357. ConfbridgeKick(taskTmp.ConfbridgeID, "all")
  358. }
  359. priority.RegistryTask.StopAndUnregister("PAD-OCC")
  360. */
  361. //check resume
  362. taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  363. if ok {
  364. if taskName == "EMG" {
  365. EMGConfbridgeReinvite(task.ConfbridgeID)
  366. alstatus.PaStatus("", "EMG", "start")
  367. } else if taskName == "CPA" {
  368. CPAConfbridgeReinvite(task.ConfbridgeID)
  369. alstatus.PaStatus("", "CPA", "start")
  370. }
  371. }
  372. }
  373. priority.ICPAnswer = 0
  374. priority.OCCAnswer = 0
  375. break
  376. }
  377. }
  378. }
  379. case "QueueCallerJoin":
  380. lfshook.NewLogger().Infof("=========%s", event["Event"])
  381. if priority.OCCAnswer == 1 && event["Queue"] == "0300" { //New PAD Goto the OCC queue in the first time, if OCC answered
  382. alstatus.AlarmStatus(event["CallerIDNum"], "queue") //send status to STC
  383. go RedirectInQueue(event["CallerIDNum"], "0301", "queues-occ", event["CallerIDNum"])
  384. break
  385. }
  386. if utils.IsPAIU(event["CallerIDNum"]) && utils.IsPAIU(event["CallerIDName"]) && event["Queue"] == "0300" { // Alarm join the queue, PAD in the queue
  387. alstatus.AlarmStatus(event["CallerIDNum"], "queue") //send status to STC
  388. ICPQueue, err := QueueStatus("0300", "") // check ICP queue, get entries
  389. if err != nil {
  390. lfshook.NewLogger().Infof("ICP QueueStatus err:%+v", err)
  391. return
  392. }
  393. if ICPQueue == nil {
  394. return
  395. }
  396. if priority.ICPAnswer == 0 && ICPQueue.Calls == "1" { //ICP did not answer any first call to the ICP queue ; Ready to Set Occ Queue Timer
  397. toRunpriority := priority.GetPriorityByKey("PAD-ICP")
  398. time.Sleep(time.Millisecond * 500) //wait high priority task start
  399. _, taskTmp, ok := priority.RegistryTask.HighestPriorityRunningTask()
  400. if ok {
  401. //lfshook.NewLogger().Infof("=1==QueueCallerJoin===runing:%d=====toRun:=%d==Status:%s", taskTmp, toRunpriority, event["ChannelStateDesc"])
  402. if taskTmp.Priority < toRunpriority { //higher priority task running ,do not set timer
  403. break
  404. }
  405. }
  406. //lfshook.NewLogger().Infof("==2=QueueCallerJoin===runing:%d=====toRun:=%d==Status:%s", taskTmp, toRunpriority, event["ChannelStateDesc"])
  407. //if (priority.RunningTypePriority > toRunpriority || priority.RunningTypePriority == 0) && event["ChannelStateDesc"] != "Up" {
  408. //active.SetTimer = true
  409. //lfshook.NewLogger().Logger.Infof("=========Start PAD timer !=============")
  410. if active.QueueTimer != nil {
  411. if active.QueueTimer.Stop() {
  412. lfshook.NewLogger().Logger.Infof("=========Release PAD timer true !============")
  413. } else {
  414. lfshook.NewLogger().Logger.Infof("=========Release PAD timer false ! ============")
  415. }
  416. }
  417. lfshook.NewLogger().Logger.Infof("=========Start PAD timer !======%d=======", active.PADTimeout)
  418. active.QueueTimer = time.AfterFunc(time.Duration(active.PADTimeout)*time.Second, func() { // check the PAD 30s timeout
  419. //active.QueueTimer = time.AfterFunc(30*time.Second, func() { // check the PAD 30s timeout
  420. //if both not active , return
  421. if active.ActivedCab == "" {
  422. return
  423. }
  424. res, err := QueueStatus("0301", "") // check OCC queue , if empty OCC-PAD start
  425. if err != nil {
  426. lfshook.NewLogger().Infof("OCC QueueStatus err:%+v", err)
  427. return
  428. }
  429. if res == nil {
  430. return
  431. }
  432. if res.Calls == "0" { // OCC queue empty
  433. resCaller, err := QueueStatus("0300", "") // check ICP queue, get entries
  434. if err != nil {
  435. lfshook.NewLogger().Infof("ICP QueueStatus err:%+v", err)
  436. return
  437. }
  438. if resCaller.Entrys != nil {
  439. sort.Slice(resCaller.Entrys, func(i, j int) bool {
  440. return resCaller.Entrys[i].Position < resCaller.Entrys[j].Position
  441. })
  442. for _, caller := range resCaller.Entrys {
  443. priority.ICPAnswer = 0
  444. //lfshook.NewLogger().Infof("====QueueCallerJoin==QueueTimer===%s", event["Event"])
  445. lfshook.NewLogger().Infof("Redirect to 0301 extension:%s Pos:%s", caller.CallerIDNum, caller.Position)
  446. //order by pos
  447. RedirectInQueue(caller.CallerIDNum, "0301", "queues-occ", caller.CallerIDNum) // redirect All ICP-PAD redirect to OCC queue
  448. time.Sleep(time.Millisecond * 100) //200 ms delay
  449. }
  450. }
  451. //==============test info =====================
  452. /*
  453. time.Sleep(2 * time.Second)
  454. occque, err1 := QueueStatus("0301", "") // check ICP queue, get entries
  455. if err1 != nil {
  456. lfshook.NewLogger().Infof("ICP QueueStatus err:%+v", err)
  457. return
  458. }
  459. for _, caller := range occque.Entrys {
  460. lfshook.NewLogger().Infof("Q301====666666=SetPadTimer= entry:%s=Pos:%s==", caller.CallerIDNum, caller.Position)
  461. }*/
  462. }
  463. })
  464. }
  465. break
  466. }
  467. //first PAD caller goto OCC
  468. //OCC dial PACUs;
  469. //PAD Page OCC+ICPs;
  470. if utils.IsPAIU(event["CallerIDNum"]) && event["Queue"] == "0301" && priority.OCCAnswer == 0 { // The first PAD to OCC ,caller is PAD
  471. if priority.CheckPriority("PAD-OCC") {
  472. runningTaskName := InterruptRunningTask("PAD-OCC") //PAD-OCC interrupt other
  473. if runningTaskName != "" {
  474. time.Sleep(time.Millisecond * 100) //wait endpoint release
  475. }
  476. priority.OCCAnswer = 1
  477. time.Sleep(time.Millisecond * 300)
  478. if active.TrainDevide == 0 { //列车没有断开
  479. if active.ActivedCab == "1" && ExtenStatus("1411") == "Idle" { //check active and OCC status
  480. alstatus.AlarmStatus(event["CallerIDNum"], "connect")
  481. go RedirectInQueue(event["Channel"], "1411", "pad-page-occ-icp", event["CallerIDNum"]) //PAD Page(OCC+ICPs)
  482. go Dial("0401", "0512", "pad-rule-pacus-occ", "ano1", "ano1", "1") // PACUs dial OCC1
  483. } else if active.ActivedCab == "8" && ExtenStatus("1481") == "Idle" {
  484. alstatus.AlarmStatus(event["CallerIDNum"], "connect")
  485. go RedirectInQueue(event["Channel"], "1481", "pad-page-occ-icp", event["CallerIDNum"]) //PAD Page(OCC+ICPs)
  486. go Dial("0401", "0512", "pad-rule-pacus-occ", "ano8", "ano8", "8") // PACUs dial OCC8
  487. }
  488. } else { //列车断开模式下
  489. if active.ActivedCab == "1" && ExtenStatus("1411") == "Idle" { //check active and OCC status
  490. alstatus.AlarmStatus(event["CallerIDNum"], "connect")
  491. go RedirectInQueue(event["Channel"], "1411", "pad-page-occ-icp", event["CallerIDNum"]) //PAD Page(OCC+ICPs)
  492. go Dial("0401", "0512", "pad-rule-pacus-occ", "ano1", "ano1", "1") // PACUs dial OCC1
  493. } else if active.ActivedCab == "8" && ExtenStatus("1481") == "Idle" {
  494. alstatus.AlarmStatus(event["CallerIDNum"], "connect")
  495. go RedirectInQueue(event["Channel"], "1481", "pad-page-occ-icp", event["CallerIDNum"]) //PAD Page(OCC+ICPs)
  496. go Dial("0401", "0512", "pad-rule-pacus-occ", "ano8", "ano8", "8") // PACUs dial OCC8
  497. }
  498. }
  499. } else {
  500. lfshook.NewLogger().Infof("====PAD-OCC Priority false===")
  501. }
  502. }
  503. case "ConfbridgeJoin":
  504. lfshook.NewLogger().Infof("=========%+v", event["Event"])
  505. lfshook.NewLogger().Infof("=========%+v", event)
  506. //set priority and send PA status msg
  507. switch event["CallerIDName"] {
  508. case "EMG":
  509. if event["Exten"] == "0502" {
  510. //================================
  511. task := priority.TaskInfo{
  512. RunChannel: event["Channel"],
  513. LocalChan: event["Channel"],
  514. RunType: "EMG",
  515. Priority: priority.AllTasks.EMG.Priority,
  516. ConfbridgeID: event["Conference"],
  517. Running: true,
  518. }
  519. priority.RegistryTask.Register("EMG", task)
  520. alstatus.PaStatus("", "EMG", "start")
  521. //check PAD timer
  522. if priority.AllTasks.PADOCC.Priority > priority.AllTasks.EMG.Priority {
  523. if active.QueueTimer != nil {
  524. if active.QueueTimer.Stop() {
  525. lfshook.NewLogger().Logger.Infof("=========Release PAD timer true !============")
  526. } else {
  527. lfshook.NewLogger().Logger.Infof("=========Release PAD timer false ! ============")
  528. }
  529. }
  530. }
  531. return
  532. }
  533. case "SPC":
  534. if event["Exten"] == "0505" {
  535. //================================
  536. task := priority.TaskInfo{
  537. RunChannel: event["Channel"],
  538. LocalChan: event["Channel"],
  539. RunType: "SPC",
  540. Priority: priority.AllTasks.SPC.Priority,
  541. ConfbridgeID: event["Conference"],
  542. Running: true,
  543. }
  544. priority.RegistryTask.Register("SPC", task)
  545. alstatus.PaStatus("", "SPC", "start")
  546. //check PAD timer
  547. if priority.AllTasks.PADOCC.Priority > priority.AllTasks.SPC.Priority {
  548. if active.QueueTimer != nil {
  549. if active.QueueTimer.Stop() {
  550. lfshook.NewLogger().Logger.Infof("=========Release PAD timer true !============")
  551. } else {
  552. lfshook.NewLogger().Logger.Infof("=========Release PAD timer false ! ============")
  553. }
  554. }
  555. }
  556. return
  557. }
  558. case "DCS":
  559. if event["Exten"] == "0504" {
  560. //================================
  561. task := priority.TaskInfo{
  562. RunChannel: event["Channel"],
  563. LocalChan: event["Channel"],
  564. RunType: "DCS",
  565. Priority: priority.AllTasks.DCS.Priority,
  566. ConfbridgeID: event["Conference"],
  567. Running: true,
  568. }
  569. priority.RegistryTask.Register("DCS", task)
  570. alstatus.PaStatus("", "DCS", "start")
  571. //check PAD timer
  572. if priority.AllTasks.PADOCC.Priority > priority.AllTasks.DCS.Priority {
  573. if active.QueueTimer != nil {
  574. if active.QueueTimer.Stop() {
  575. lfshook.NewLogger().Logger.Infof("=========Release PAD timer true !============")
  576. } else {
  577. lfshook.NewLogger().Logger.Infof("=========Release PAD timer false ! ============")
  578. }
  579. }
  580. }
  581. return
  582. }
  583. case "STN":
  584. if event["Exten"] == "0503" {
  585. //================================
  586. task := priority.TaskInfo{
  587. RunChannel: event["Channel"],
  588. LocalChan: event["Channel"],
  589. RunType: "STN",
  590. Priority: priority.AllTasks.STN.Priority,
  591. ConfbridgeID: event["Conference"],
  592. Running: true,
  593. }
  594. priority.RegistryTask.Register("STN", task)
  595. alstatus.PaStatus("", "STN", "start")
  596. //check PAD timer
  597. if priority.AllTasks.PADOCC.Priority > priority.AllTasks.STN.Priority {
  598. if active.QueueTimer != nil {
  599. if active.QueueTimer.Stop() {
  600. lfshook.NewLogger().Logger.Infof("=========Release PAD timer true !============")
  601. } else {
  602. lfshook.NewLogger().Logger.Infof("=========Release PAD timer false ! ============")
  603. }
  604. }
  605. }
  606. return
  607. }
  608. case "CHK":
  609. if event["Exten"] == "0510" {
  610. //================================
  611. task := priority.TaskInfo{
  612. RunChannel: event["Channel"],
  613. LocalChan: event["Channel"],
  614. RunType: "CHK",
  615. Priority: priority.AllTasks.CHK.Priority,
  616. ConfbridgeID: event["Conference"],
  617. Running: true,
  618. }
  619. priority.RegistryTask.Register("CHK", task)
  620. alstatus.PaStatus("", "CHK", "start")
  621. //check PAD timer
  622. if priority.AllTasks.PADOCC.Priority > priority.AllTasks.CHK.Priority {
  623. if active.QueueTimer != nil {
  624. if active.QueueTimer.Stop() {
  625. lfshook.NewLogger().Logger.Infof("=========Release PAD timer true !============")
  626. } else {
  627. lfshook.NewLogger().Logger.Infof("=========Release PAD timer false ! ============")
  628. }
  629. }
  630. }
  631. return
  632. }
  633. case "VOL": // tone-test
  634. if event["Exten"] == "0513" {
  635. //================================
  636. task := priority.TaskInfo{
  637. RunChannel: event["Channel"],
  638. LocalChan: event["Channel"],
  639. RunType: "VOL",
  640. Priority: priority.AllTasks.VOL.Priority,
  641. ConfbridgeID: event["Conference"],
  642. Running: true,
  643. }
  644. priority.RegistryTask.Register("VOL", task)
  645. alstatus.PaStatus("", "VOL", "start")
  646. //check PAD timer
  647. if priority.AllTasks.PADOCC.Priority > priority.AllTasks.VOL.Priority {
  648. if active.QueueTimer != nil {
  649. if active.QueueTimer.Stop() {
  650. lfshook.NewLogger().Logger.Infof("=========Release PAD timer true !============")
  651. } else {
  652. lfshook.NewLogger().Logger.Infof("=========Release PAD timer false ! ============")
  653. }
  654. }
  655. }
  656. return
  657. }
  658. }
  659. /*
  660. //get confbridge id for join back to confbridge
  661. if event["Context"] == "pad-page-occ-icp" && utils.IsPAIU(event["CallerIDNum"]) {
  662. //active.ICPCONBID = event["Conference"] //pad-occ
  663. priority.AllTasks.PADOCC.ConfbridgeID = event["Conference"]
  664. }
  665. */
  666. //Send PA start msg to STC
  667. if utils.IsICP(event["CallerIDNum"]) && event["Exten"] == "0500" { // PA start
  668. alstatus.PaStatus(event["CallerIDNum"], "PA", "start")
  669. //================================
  670. task := priority.TaskInfo{
  671. RunChannel: event["Channel"],
  672. LocalChan: event["Channel"],
  673. RunType: "PA",
  674. Priority: priority.AllTasks.PA.Priority,
  675. ConfbridgeID: event["Conference"],
  676. Running: true,
  677. }
  678. priority.RegistryTask.Register("PA", task)
  679. //check PAD timer
  680. if priority.AllTasks.PADOCC.Priority > priority.AllTasks.PA.Priority {
  681. if active.QueueTimer != nil {
  682. if active.QueueTimer.Stop() {
  683. lfshook.NewLogger().Logger.Infof("=========Release PAD timer true !============")
  684. } else {
  685. lfshook.NewLogger().Logger.Infof("=========Release PAD timer false ! ============")
  686. }
  687. }
  688. }
  689. break
  690. } else if utils.IsIO(event["CallerIDNum"]) && event["Exten"] == "0501" { //CPA start
  691. alstatus.PaStatus(event["CallerIDNum"], "CPA", "start")
  692. //================================
  693. task := priority.TaskInfo{
  694. RunChannel: event["Channel"],
  695. LocalChan: event["Channel"],
  696. RunType: "CPA",
  697. Priority: priority.AllTasks.CPA.Priority,
  698. ConfbridgeID: event["Conference"],
  699. Running: true,
  700. }
  701. priority.RegistryTask.Register("CPA", task)
  702. //check PAD timer
  703. if priority.AllTasks.PADOCC.Priority > priority.AllTasks.CPA.Priority {
  704. if active.QueueTimer != nil {
  705. if active.QueueTimer.Stop() {
  706. lfshook.NewLogger().Logger.Infof("=========Release PAD timer true !============")
  707. } else {
  708. lfshook.NewLogger().Logger.Infof("=========Release PAD timer false ! ============")
  709. }
  710. }
  711. }
  712. return
  713. }
  714. //ICP answer PAD;PACUs connected ICP
  715. //PAD chanspy ICP1
  716. //ICP8 call PAD
  717. if event["ConnectedLineNum"] == "ani1" && event["Exten"] == "0511" { //PAD answered by ICP; PACUs connected ICP1
  718. lfshook.NewLogger().Infof("====PAD answered by ICP1:%s=====", event["ConnectedLineName"])
  719. alstatus.AlarmStatus(event["ConnectedLineName"], "connect")
  720. //================================
  721. task := priority.TaskInfo{
  722. RunChannel: event["Channel"],
  723. LocalChan: event["Channel"],
  724. RunType: "PAD-ICP",
  725. Priority: priority.AllTasks.PADICP.Priority,
  726. ConfbridgeID: event["Conference"],
  727. Running: true,
  728. }
  729. priority.RegistryTask.Register("PAD-ICP", task)
  730. lfshook.NewLogger().Infof("=========PAD-ICP answer==ListAll===%+v", priority.RegistryTask.ListAll())
  731. go RedirectInQueue(event["ConnectedLineName"], "2311", "chanspy-rule-whisper", event["ConnectedLineName"]) //PAD chanspy(EqW) ICP1
  732. if ExtenStatus("2381") == "Idle" {
  733. go Dial("0402", event["ConnectedLineName"], "call-pad-rule", event["ConnectedLineName"], event["ConnectedLineName"], "8") // PAD call ICP8
  734. }
  735. }
  736. if event["ConnectedLineNum"] == "ani8" && event["Exten"] == "0511" { //PAD ansered by ICP8; PACUs connected ICP8
  737. lfshook.NewLogger().Infof("====PAD answered by ICP8:%s=====", event["ConnectedLineName"])
  738. alstatus.AlarmStatus(event["ConnectedLineName"], "connect")
  739. //================================
  740. task := priority.TaskInfo{
  741. RunChannel: event["Channel"],
  742. LocalChan: event["Channel"],
  743. RunType: "PAD-ICP",
  744. Priority: priority.AllTasks.PADICP.Priority,
  745. ConfbridgeID: event["Conference"],
  746. Running: true,
  747. }
  748. priority.RegistryTask.Register("PAD-ICP", task)
  749. lfshook.NewLogger().Infof("=========PAD-ICP answer==ListAll===%+v", priority.RegistryTask.ListAll())
  750. go RedirectInQueue(event["ConnectedLineName"], "2381", "chanspy-rule-whisper", event["ConnectedLineName"]) //PAD chanspy(EqW) ICP8
  751. if ExtenStatus("2311") == "Idle" {
  752. go Dial("0402", event["ConnectedLineName"], "call-pad-rule", event["ConnectedLineName"], event["ConnectedLineName"], "1") // PAD call ICP1
  753. }
  754. break
  755. }
  756. //OCC answer PAD;Set the task channel
  757. if utils.IsPAIU(event["CallerIDNum"]) && utils.IsIO(event["Exten"]) && event["Context"] == "pad-page-occ-icp" { //PAD Page OCC1+ICPs connected
  758. lfshook.NewLogger().Infof("====PAD answered by OCC:====")
  759. //================================
  760. task := priority.TaskInfo{
  761. RunChannel: event["Channel"],
  762. LocalChan: event["Channel"],
  763. RunType: "PAD-OCC",
  764. Priority: priority.AllTasks.PADOCC.Priority,
  765. ConfbridgeID: event["Conference"],
  766. Running: true,
  767. }
  768. priority.RegistryTask.Register("PAD-OCC", task)
  769. break
  770. }
  771. case "ConfbridgeLeave":
  772. lfshook.NewLogger().Infof("=========%s", event["Event"])
  773. if utils.IsICP(event["CallerIDNum"]) && event["Exten"] == "0500" { // PA end
  774. alstatus.PaStatus(event["CallerIDNum"], "PA", "end")
  775. priority.RegistryTask.StopAndUnregister("PA")
  776. SetPadTimer()
  777. // check resume
  778. taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  779. if ok {
  780. if taskName == "EMG" {
  781. EMGConfbridgeReinvite(task.ConfbridgeID)
  782. alstatus.PaStatus("", "EMG", "start")
  783. } else if taskName == "CPA" {
  784. CPAConfbridgeReinvite(task.ConfbridgeID)
  785. alstatus.PaStatus("", "CPA", "start")
  786. }
  787. }
  788. } else if utils.IsIO(event["CallerIDNum"]) && event["Exten"] == "0501" { //CPA end
  789. alstatus.PaStatus(event["CallerIDNum"], "CPA", "end")
  790. //CPA
  791. taskTmp, ok := priority.RegistryTask.Get("CPA")
  792. if ok {
  793. ConfbridgeKick(taskTmp.ConfbridgeID, "all")
  794. }
  795. priority.RegistryTask.StopAndUnregister("CPA")
  796. SetPadTimer()
  797. //check resume
  798. taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  799. if ok {
  800. if taskName == "EMG" {
  801. EMGConfbridgeReinvite(task.ConfbridgeID)
  802. alstatus.PaStatus("", "EMG", "start")
  803. }
  804. }
  805. //lfshook.NewLogger().Infof("=========%s", event["Event"])
  806. } else if event["CallerIDName"] == "EMG" && event["Exten"] == "0502" { // EMG broadcast hangup
  807. alstatus.PaStatus("", "EMG", "end")
  808. //EMG
  809. taskTmp, ok := priority.RegistryTask.Get("EMG")
  810. if ok {
  811. ConfbridgeKick(taskTmp.ConfbridgeID, "all")
  812. }
  813. priority.RegistryTask.StopAndUnregister("EMG")
  814. SetPadTimer()
  815. //check resume
  816. taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  817. if ok {
  818. if taskName == "CPA" {
  819. CPAConfbridgeReinvite(task.ConfbridgeID)
  820. alstatus.PaStatus("", "CPA", "start")
  821. }
  822. }
  823. } else if event["CallerIDName"] == "STN" && event["Exten"] == "0503" {
  824. alstatus.PaStatus("", "STN", "end")
  825. //STN
  826. taskTmp, ok := priority.RegistryTask.Get("STN")
  827. if ok {
  828. ConfbridgeKick(taskTmp.ConfbridgeID, "all")
  829. }
  830. priority.RegistryTask.StopAndUnregister("STN")
  831. SetPadTimer()
  832. //check resume
  833. taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  834. if ok {
  835. if taskName == "CPA" {
  836. CPAConfbridgeReinvite(task.ConfbridgeID)
  837. alstatus.PaStatus("", "CPA", "start")
  838. } else if taskName == "EMG" {
  839. EMGConfbridgeReinvite(task.ConfbridgeID)
  840. alstatus.PaStatus("", "EMG", "start")
  841. }
  842. }
  843. } else if event["CallerIDName"] == "DCS" && event["Exten"] == "0504" {
  844. alstatus.PaStatus("", "DCS", "end")
  845. //DSC
  846. taskTmp, ok := priority.RegistryTask.Get("DCS")
  847. if ok {
  848. ConfbridgeKick(taskTmp.ConfbridgeID, "all")
  849. }
  850. priority.RegistryTask.StopAndUnregister("DCS")
  851. SetPadTimer()
  852. //check resume
  853. taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  854. if ok {
  855. if taskName == "CPA" {
  856. CPAConfbridgeReinvite(task.ConfbridgeID)
  857. alstatus.PaStatus("", "CPA", "start")
  858. } else if taskName == "EMG" {
  859. EMGConfbridgeReinvite(task.ConfbridgeID)
  860. alstatus.PaStatus("", "EMG", "start")
  861. //alstatus.PaStatus("", "EMG", "start")
  862. }
  863. }
  864. } else if event["CallerIDName"] == "SPC" && event["Exten"] == "0505" {
  865. alstatus.PaStatus("", "SPC", "end")
  866. //SPC
  867. taskTmp, ok := priority.RegistryTask.Get("SPC")
  868. if ok {
  869. ConfbridgeKick(taskTmp.ConfbridgeID, "all")
  870. }
  871. priority.RegistryTask.StopAndUnregister("SPC")
  872. SetPadTimer()
  873. //check resume
  874. taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  875. if ok {
  876. if taskName == "CPA" {
  877. CPAConfbridgeReinvite(task.ConfbridgeID)
  878. alstatus.PaStatus("", "CPA", "start")
  879. } else if taskName == "EMG" {
  880. EMGConfbridgeReinvite(task.ConfbridgeID)
  881. alstatus.PaStatus("", "EMG", "start")
  882. }
  883. }
  884. } else if event["CallerIDName"] == "CHK" && event["Exten"] == "0510" {
  885. alstatus.PaStatus("", "CHK", "end")
  886. //CHK
  887. taskTmp, ok := priority.RegistryTask.Get("CHK")
  888. if ok {
  889. ConfbridgeKick(taskTmp.ConfbridgeID, "all")
  890. }
  891. priority.RegistryTask.StopAndUnregister("CHK")
  892. SetPadTimer()
  893. //check resume
  894. taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  895. if ok {
  896. if taskName == "CPA" {
  897. CPAConfbridgeReinvite(task.ConfbridgeID)
  898. alstatus.PaStatus("", "CPA", "start")
  899. } else if taskName == "EMG" {
  900. EMGConfbridgeReinvite(task.ConfbridgeID)
  901. alstatus.PaStatus("", "EMG", "start")
  902. }
  903. }
  904. } else if event["CallerIDName"] == "VOL" && event["Exten"] == "0513" {
  905. alstatus.PaStatus("", "VOL", "end")
  906. //VOL
  907. taskTmp, ok := priority.RegistryTask.Get("VOL")
  908. if ok {
  909. ConfbridgeKick(taskTmp.ConfbridgeID, "all")
  910. }
  911. priority.RegistryTask.StopAndUnregister("VOL")
  912. SetPadTimer()
  913. //check resume
  914. taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  915. if ok {
  916. if taskName == "CPA" {
  917. CPAConfbridgeReinvite(task.ConfbridgeID)
  918. alstatus.PaStatus("", "CPA", "start")
  919. } else if taskName == "EMG" {
  920. EMGConfbridgeReinvite(task.ConfbridgeID)
  921. alstatus.PaStatus("", "EMG", "start")
  922. }
  923. }
  924. }
  925. case "DialEnd":
  926. //lfshook.NewLogger().Infof("=========%s", event["Event"])
  927. //Cab Cab start
  928. if utils.IsICP(event["CallerIDNum"]) && event["Exten"] == "0400" && event["DialStatus"] == "ANSWER" {
  929. //================================
  930. task := priority.TaskInfo{
  931. RunChannel: event["Channel"],
  932. LocalChan: event["Channel"],
  933. RunType: "C2C",
  934. Priority: priority.AllTasks.C2C.Priority,
  935. ConfbridgeID: "",
  936. Running: true,
  937. }
  938. priority.RegistryTask.Register("C2C", task)
  939. alstatus.PaStatus(event["CallerIDNum"], "C2C", "start")
  940. //check PAD timer
  941. if priority.AllTasks.PADOCC.Priority > priority.AllTasks.C2C.Priority {
  942. if active.QueueTimer != nil {
  943. if active.QueueTimer.Stop() {
  944. lfshook.NewLogger().Logger.Infof("=========Release PAD timer true !============")
  945. } else {
  946. lfshook.NewLogger().Logger.Infof("=========Release PAD timer false ! ============")
  947. }
  948. }
  949. }
  950. } else if utils.IsICP(event["CallerIDNum"]) && utils.IsICP(event["ConnectedLineNum"]) && event["DialStatus"] == "NOANSWER" {
  951. //lfshook.NewLogger().Infof("===%s======%s", event["Event"], event["DialStatus"])
  952. time.Sleep(time.Millisecond * 300)
  953. //check resume
  954. taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  955. if ok {
  956. ICPConfbridgeReinvite(task.ConfbridgeID, taskName)
  957. }
  958. }
  959. //TMS Answer PAD (有时asterisk反馈的BridgeEnter事件有问题,根据dialend判断)
  960. if utils.IsPAIU(event["CallerIDName"]) && utils.IsPACU(event["CallerIDNum"]) && event["DialStatus"] == "ANSWER" && event["Exten"] == "0403" {
  961. lfshook.NewLogger().Infof("====BridgeEnter==IN action===%s===ID:%s Name:%s", event["Event"], event["CallerIDNum"], event["CallerIDName"])
  962. alstatus.AlarmStatus(event["CallerIDName"], "connect") // Alarm connected
  963. //=============================
  964. task := priority.TaskInfo{
  965. RunChannel: event["Channel"],
  966. LocalChan: event["Channel"],
  967. RunType: "PAD-TMS",
  968. Priority: priority.AllTasks.PADTMS.Priority,
  969. ConfbridgeID: "",
  970. Running: true,
  971. }
  972. priority.RegistryTask.Register("PAD-TMS", task)
  973. lfshook.NewLogger().Infof("=========PAD-TMS answer==ListAll===%+v", priority.RegistryTask.ListAll())
  974. if active.ActivedCab == "1" {
  975. go RedirectInQueue(event["CallerIDName"], "2311", "chanspy-rule-whisper", "") //PAD chanspy(EqW) ICP1
  976. go Dial("0403", event["CallerIDName"], "call-pad-rule", "2381", "2381", "8") //ICP8---call----PAD
  977. } else if active.ActivedCab == "8" {
  978. go RedirectInQueue(event["CallerIDName"], "2381", "chanspy-rule-whisper", "") //PAD chanspy(EqW) ICP8
  979. go Dial("0403", event["CallerIDName"], "call-pad-rule", "2311", "2311", "1") //ICP1---call----PAD
  980. } else if active.ActivedCab == "" {
  981. go RedirectInQueue(event["CallerIDName"], "2311", "chanspy-rule-whisper", "") //PAD chanspy(EqW) ICP1
  982. go Dial("0403", event["CallerIDName"], "call-pad-rule", "2381", "2381", "8") //ICP8---call----PAD
  983. }
  984. }
  985. case "BridgeLeave":
  986. //lfshook.NewLogger().Infof("=========%s", event["Event"])
  987. //Cab Cab end
  988. if utils.IsICP(event["CallerIDNum"]) && utils.IsICP(event["ConnectedLineNum"]) && event["Exten"] == "0400" {
  989. alstatus.PaStatus(event["CallerIDNum"], "C2C", "end")
  990. priority.RegistryTask.StopAndUnregister("C2C")
  991. time.Sleep(time.Millisecond * 300)
  992. SetPadTimer()
  993. //check resume
  994. taskName, task, ok := priority.RegistryTask.HighestPriorityRunningTask1()
  995. if ok {
  996. ICPConfbridgeReinvite(task.ConfbridgeID, taskName)
  997. //check resume
  998. /*if taskName == "CPA" {
  999. alstatus.PaStatus("", "CPA", "start")
  1000. } else if taskName == "EMG" {
  1001. alstatus.PaStatus("", "EMG", "start")
  1002. } else if taskName == "SPC" {
  1003. alstatus.PaStatus("", "SPC", "start")
  1004. } else if taskName == "DCS" {
  1005. alstatus.PaStatus("", "DCS", "start")
  1006. } else if taskName == "STN" {
  1007. alstatus.PaStatus("", "STN", "start")
  1008. } else if taskName == "CHK" {
  1009. alstatus.PaStatus("", "CHK", "start")
  1010. }*/
  1011. }
  1012. }
  1013. case "ExtensionStatus":
  1014. //lfshook.NewLogger().Infof("=========event:%s Ext:%s status:%s ", event["Event"], event["Exten"], event["StatusText"])
  1015. //update extension status
  1016. if event["StatusText"] == "Idle" || event["StatusText"] == "Unavailable" {
  1017. if len(event["Exten"]) > 3 && utils.IsPAIU(event["Exten"]) {
  1018. alstatus.AlarmStatus(event["Exten"], event["StatusText"]) // PAD idle + unavailable
  1019. }
  1020. }
  1021. case "BridgeEnter": // TMS-ICP answer PAD; PACU connect ICP
  1022. lfshook.NewLogger().Infof("=========event:%s callerid-num:%s callerid-name:%s", event["Event"], event["CallerIDNum"], event["CallerIDName"])
  1023. //PAD-OCC start
  1024. if utils.IsIO(event["CallerIDNum"]) && utils.IsPAIU(event["ConnectedLineNum"]) {
  1025. if priority.PADOccStart == 0 {
  1026. alstatus.OccPad("start")
  1027. priority.PADOccStart = 1
  1028. }
  1029. if priority.PADStart == 0 {
  1030. alstatus.PaStatus("", "PAD", "start")
  1031. priority.PADStart = 1
  1032. }
  1033. }
  1034. /*if utils.IsPACU(event["CallerIDNum"]) && utils.IsPAIU(event["CallerIDName"]) { //ICP and PACU connected -----TMS Answer PAD
  1035. lfshook.NewLogger().Infof("====BridgeEnter==IN action===%s===ID:%s Name:%s", event["Event"], event["CallerIDNum"], event["CallerIDName"])
  1036. alstatus.AlarmStatus(event["CallerIDName"], "connect") // Alarm connected
  1037. //=============================
  1038. task := priority.TaskInfo{
  1039. RunChannel: event["Channel"],
  1040. LocalChan: event["Channel"],
  1041. RunType: "PAD-TMS",
  1042. Priority: priority.AllTasks.PADTMS.Priority,
  1043. ConfbridgeID: "",
  1044. Running: true,
  1045. }
  1046. priority.RegistryTask.Register("PAD-TMS", task)
  1047. lfshook.NewLogger().Infof("=========PAD-TMS answer==ListAll===%+v", priority.RegistryTask.ListAll())
  1048. if active.ActivedCab == "1" {
  1049. go RedirectInQueue(event["CallerIDName"], "2311", "chanspy-rule-whisper", "") //PAD chanspy(EqW) ICP1
  1050. go Dial("0403", event["CallerIDName"], "call-pad-rule", "2381", "2381", "8") //ICP8---call----PAD
  1051. } else if active.ActivedCab == "8" {
  1052. go RedirectInQueue(event["CallerIDName"], "2381", "chanspy-rule-whisper", "") //PAD chanspy(EqW) ICP8
  1053. go Dial("0403", event["CallerIDName"], "call-pad-rule", "2311", "2311", "1") //ICP1---call----PAD
  1054. } else if active.ActivedCab == "" {
  1055. go RedirectInQueue(event["CallerIDName"], "2311", "chanspy-rule-whisper", "") //PAD chanspy(EqW) ICP1
  1056. go Dial("0403", event["CallerIDName"], "call-pad-rule", "2381", "2381", "8") //ICP8---call----PAD
  1057. }
  1058. } else*/if utils.IsPAIU(event["CallerIDNum"]) && event["Exten"] == "0405" { // PAD connect ICP-TMS;PACU not available
  1059. //=============================
  1060. task := priority.TaskInfo{
  1061. RunChannel: event["Channel"],
  1062. LocalChan: event["Channel"],
  1063. RunType: "PAD-TMS",
  1064. Priority: priority.AllTasks.PADTMS.Priority,
  1065. ConfbridgeID: "",
  1066. Running: true,
  1067. }
  1068. priority.RegistryTask.Register("PAD-TMS", task)
  1069. lfshook.NewLogger().Infof("=========PAD-TMS answer==ListAll===%+v", priority.RegistryTask.ListAll())
  1070. alstatus.AlarmStatus(event["CallerIDNum"], "connect") // PAD connect ICP-TMS
  1071. }
  1072. }
  1073. }
  1074. func StartAMI(connectOKCallBack func(), handleEvents []func(event map[string]string)) {
  1075. lfshook.NewLogger().Info("Start AMI")
  1076. settings := &amigo.Settings{
  1077. Host: configs.ConfigGlobal.AsteriskAMIHost,
  1078. Port: configs.ConfigGlobal.AsteriskAMIPort,
  1079. Username: configs.ConfigGlobal.AsteriskAMIUser,
  1080. Password: configs.ConfigGlobal.AsteriskAMISecret,
  1081. LogLevel: logrus.ErrorLevel}
  1082. //lfshook.NewLogger().Infof("ami setting: %+v", settings)
  1083. AminInstance = amigo.New(settings, lfshook.NewLogger())
  1084. AminInstance.EventOn(func(payload ...interface{}) {
  1085. // lfshook.NewLogger().Infof("ami event on %+v", payload[0])
  1086. event := payload[0].(map[string]string)
  1087. go HandleAMI(event)
  1088. for _, handle := range handleEvents {
  1089. go handle(event)
  1090. }
  1091. })
  1092. AminInstance.ConnectOn(func(payload ...interface{}) {
  1093. //lfshook.NewLogger().Infof("ami connect on %+v", payload[0])
  1094. if payload[0] == pkg.Connect_OK {
  1095. connectOKCallBack()
  1096. } else {
  1097. lfshook.NewLogger().Errorf("ami connect failure %+v", payload)
  1098. //active.Master = false
  1099. }
  1100. })
  1101. AminInstance.Connect()
  1102. }
  1103. func Connected() bool {
  1104. if AminInstance != nil {
  1105. return AminInstance.Connected()
  1106. }
  1107. return false
  1108. }