index.go 44 KB

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