1
0

2 Commity a0504d696a ... 1df9f21c64

Autor SHA1 Správa Dátum
  dujunchen 1df9f21c64 delete useless files 4 dní pred
  dujunchen 5cbdccb50e update priority 6 dní pred
42 zmenil súbory, kde vykonal 444 pridanie a 2438 odobranie
  1. 0 1
      api/index.go
  2. 0 16
      api/model/callforward.go
  3. 0 6
      api/model/conference.go
  4. 0 11
      api/model/database.go
  5. 0 16
      api/model/extension.go
  6. 0 10
      api/model/jwt.go
  7. 0 36
      api/model/meetme.go
  8. 0 34
      api/model/page.go
  9. 0 16
      api/model/park.go
  10. 0 28
      api/model/request.go
  11. 1 0
      api/model/response.go
  12. 0 232
      api/panel/asterisk/call.go
  13. 0 154
      api/panel/asterisk/conference.go
  14. 0 272
      api/panel/asterisk/meetme.go
  15. 0 109
      api/panel/asterisk/park.go
  16. 117 5
      internal/app/ami/action/call.go
  17. 1 0
      internal/app/ami/action/channel.go
  18. 0 130
      internal/app/ami/action/conference.go
  19. 0 36
      internal/app/ami/action/extension.go
  20. 155 40
      internal/app/ami/action/index.go
  21. 0 149
      internal/app/ami/action/meetme.go
  22. 0 81
      internal/app/ami/action/park.go
  23. 9 13
      internal/app/ami/model/cdr.go
  24. 0 80
      internal/app/ami/model/meetme.go
  25. 0 210
      internal/app/ami/model/park.go
  26. 0 130
      internal/app/ami/model/sip.go
  27. 0 15
      internal/app/ami/model/userevent.go
  28. 1 2
      internal/app/index.go
  29. 0 53
      internal/app/mysql/index.go
  30. 104 116
      internal/app/stc/broadcast/stc-broadcast.go
  31. 22 16
      internal/app/stc/priority/index.go
  32. 34 2
      internal/app/stc/sendstatus/status.go
  33. 0 57
      pkg/systeminfo/file.go
  34. 0 90
      pkg/systeminfo/index.go
  35. 0 49
      pkg/utils/cron.go
  36. 0 24
      pkg/utils/ini.go
  37. 0 63
      pkg/utils/trans.go
  38. 0 20
      pkg/utils/uuid.go
  39. 0 31
      test/config.yaml
  40. 0 35
      test/info_test.go
  41. 0 39
      test/ini.go
  42. 0 11
      test/my.ini

+ 0 - 1
api/index.go

@@ -1 +0,0 @@
-package api

+ 0 - 16
api/model/callforward.go

@@ -1,16 +0,0 @@
-package model
-
-// CallForward 呼叫转移
-type CallForward struct {
-	ID        int64  `xorm:"id pk autoincr" json:"id"`
-	Extension string `xorm:"exten" json:"extension"`
-	FwType    string `xorm:"fw_type" json:"fw_type"`
-	FwDest    string `xorm:"fw_dest" json:"fw_dest"`
-	Timeout   int    `xorm:"timeout" json:"timeout"`
-	Timerule  int    `xorm:"timerule" json:"timerule"`
-	Enable    bool   `xorm:"enable" json:"enable"`
-}
-
-func (*CallForward) TableName() string {
-	return "t_call_forward"
-}

+ 0 - 6
api/model/conference.go

@@ -1,6 +0,0 @@
-package model
-
-type ConferenceInfo struct {
-	ConfNum string `json:"confnum"  binding:"required"`
-	Channel string `json:"channel"  binding:"required"`
-}

+ 0 - 11
api/model/database.go

@@ -1,11 +0,0 @@
-package model
-
-type DBCommonVO struct {
-	Family string `json:"family"  binding:"required"`
-	Key    string `json:"key"  binding:"required"`
-}
-
-type DBActionVO struct {
-	DBCommonVO
-	Value string `json:"value" binding:"required"`
-}

+ 0 - 16
api/model/extension.go

@@ -1,16 +0,0 @@
-package model
-
-// Extension describes a user
-type Extension struct {
-	Extension string `xorm:"exten" json:"exten"`
-	DevType      string `xorm:"devtype" json:"devtype"`
-	Priority  string `xorm:"priority" json:"priority"`
-	Special   int    `xorm:"special" json:"special"`
-	Status    string `xorm:"status" json:"status"`
-	PaType    string `xorm:"patype" json:"patype"`
-	Remark    string `xorm:"remark" json:"remark"`
-}
-
-func (*Extension) TableName() string {
-	return "t_extension"
-}

+ 0 - 10
api/model/jwt.go

@@ -1,10 +0,0 @@
-package model
-
-import "github.com/dgrijalva/jwt-go"
-
-type JWTCustomClaims struct {
-	UserName string `json:"UserName"`
-	ID       int64  `json:"ID"`
-	Role     string `json:"Role"`
-	jwt.StandardClaims
-}

+ 0 - 36
api/model/meetme.go

@@ -1,36 +0,0 @@
-package model
-
-// MeetMe describes a user
-type MeetMe struct {
-	Conference string `xorm:"confno" json:"confno"`
-	Pin        string `xorm:"pin" json:"pin"`
-	AdminPin   string `xorm:"adminpin" json:"adminPin"`
-}
-
-func (*MeetMe) TableName() string {
-	return "t_conference"
-}
-
-type MeetMeRoom struct {
-	MeetMe
-
-	Activity string ` json:"activity"`
-	Creation string ` json:"creation"`
-	Event    string ` json:"event"`
-	Locked   string ` json:"locked"`
-	Marked   string ` json:"marked"`
-	Parties  string ` json:"parties"`
-}
-
-type MeetMeCommonVO struct {
-	Meetme string `json:"meetMe" binding:"required"`
-}
-
-type MeetMeVO struct {
-	MeetMeCommonVO
-	UserNum []string `json:"userNumbers" binding:"required"`
-}
-type MeetMeInviteVO struct {
-	MeetMeCommonVO
-	Extensions []string `json:"extensions" binding:"required"`
-}

+ 0 - 34
api/model/page.go

@@ -1,34 +0,0 @@
-package model
-
-import (
-	"fmt"
-)
-
-type PageGroup struct {
-	ID         int64  `xorm:"id pk autoincr" json:"id"`
-	Name       string `xorm:"name" json:"name"`
-	PageNumber string `xorm:"paging_number" json:"pageNumber"`
-	Mode       string `xorm:"mode" json:"mode"`
-	Timeout    string `xorm:"timeout" json:"timeout"`
-	VoiceFile  string `xorm:"voice_file" json:"voiceFile"`
-	AutoAnswer string `xorm:"auto_answer" json:"autoAnswer"`
-
-	Members []*PageGroupMember `xorm:"-"`
-}
-
-func (*PageGroup) TableName() string {
-	return "t_paging_group"
-}
-
-type PageGroupMember struct {
-	ID        int64  `xorm:"id pk autoincr" json:"id"`
-	Extension string `xorm:"exten"`
-	GroupID   string `xorm:"group_id"`
-}
-
-func (*PageGroupMember) TableName() string {
-	return "t_paging_group_member"
-}
-func (group PageGroupMember) String() string {
-	return fmt.Sprintf("Extension: %+v GroupID: %+v", group.Extension, group.GroupID)
-}

+ 0 - 16
api/model/park.go

@@ -1,16 +0,0 @@
-package model
-
-type ParkCommonVO struct {
-	Parkinglot string `json:"parkinglot"`
-}
-
-type ParkInfoVO struct {
-	Extension string `json:"extension"`
-	ParkCommonVO
-}
-
-type ParkBackVO struct {
-	Extension    string `json:"extension"`
-	CallerID     string `json:"callerID"`     // callerID 显示,空值使用 Extension
-	CallerNumber string `json:"callerNumber"` // 主叫, 若未传入通过登录账号查询关联分机
-}

+ 0 - 28
api/model/request.go

@@ -1,28 +0,0 @@
-package model
-
-type SrcDstInfo struct {
-	Src string `json:"src"  binding:"required"`
-	Dst string `json:"dst"  binding:"required"`
-}
-
-type ChannelDstInfo struct {
-	Channel string `json:"channel"  binding:"required"`
-	Dst     string `json:"dst"  binding:"required"`
-}
-
-type ExtensionDstInfo struct {
-	Extension string `json:"extension"  binding:"required"`
-	Dst       string `json:"dst"  binding:"required"`
-}
-
-type PageVO struct {
-	Extensions []string `json:"extensions"  binding:"required"`
-	Src        string   `json:"src"  binding:"required"`
-	Duplex     bool     `json:"duplex"`
-}
-
-type DialVO struct {
-	Extension    string `json:"extension"  binding:"required"` // 被叫
-	CallerID     string `json:"callerID"`                      // callerID 显示,空值使用 Extension
-	CallerNumber string `json:"callerNumber"`                  // 主叫, 若未传入通过登录账号查询关联分机
-}

+ 1 - 0
api/model/response.go

@@ -26,4 +26,5 @@ type CoreShowChannelResVO struct {
 	ConnectedLineNum  string `json:"connectedLineNumber"`
 	Duration          string `json:"duration"`
 	DurationSecond    int    `json:"durationSecond"`
+	ChannelStateDesc  string `json:"channelStateDesc"`
 }

+ 0 - 232
api/panel/asterisk/call.go

@@ -1,232 +0,0 @@
-package asterisk
-
-import (
-	"fmt"
-	"net/http"
-	"pbx-api-gin/api/model"
-	"pbx-api-gin/internal/app/ami/action"
-	"strings"
-
-	"github.com/gin-gonic/gin"
-)
-
-// @tags Asterisk-Call
-// @Summary 挂断
-// @Description 挂断分机或通道数组
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param   data body  []string  true "需要挂断的分机或通道数组"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/call/hangup [post]
-func Hangup(extens string) {
-	//var extensions []string
-	extensions := strings.Split(extens, ";")
-	for _, extension := range extensions {
-		action.Hangup(extension)
-	}
-}
-
-// @tags Asterisk-Call
-// @Summary 拨打电话
-// @Description 拨打指定的分机
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param   data body  model.DialVO  true "需要拨打的分机信息"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/call/dial [post]
-func Dial(ctx *gin.Context) {
-	var info model.DialVO
-	if err := ctx.ShouldBindJSON(&info); err != nil {
-		ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-
-	// 根据参数确定主叫, 再考虑用户登录的分机信息
-	myExtension := info.CallerNumber
-	if myExtension == "" {
-		ID, _ := ctx.Get("ID")
-		myExtension = "===================="
-		if myExtension == "" {
-			ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: fmt.Sprintf("not found user extension by ID %d", ID)})
-			return
-		}
-	}
-
-	dialplan := "default"
-	if info.CallerID == "" {
-		info.CallerID = info.Extension
-	}
-
-	// 喊话 主动挂断被叫
-	action.Hangup(info.Extension)
-
-	action.Dial(myExtension, info.Extension, dialplan, info.CallerID, "================", "Local")
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: info})
-}
-
-// @tags Asterisk-Call
-// @Summary 强拆()
-// @Description 将当前正在进行的通话保持,src 与 正在通话的 dst建立通话。
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param   data body  model.SrcDstInfo  true "src, dst"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/call/clear [post]
-func Clear(ctx *gin.Context) {
-	var input model.SrcDstInfo
-	if err := ctx.ShouldBindJSON(&input); err != nil {
-		ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-	action.Redirect(input.Src, input.Dst, "default")
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: input})
-}
-
-// @tags Asterisk-Call
-// @Summary 密语(悄悄话)
-// @Description 将 src 插入到 dst 的通话中,与 dst 密语
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param   data body  model.ExtensionDstInfo  true "src, dst"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/call/whisper [post]
-func extenWhisper(ctx *gin.Context) {
-	var input model.ExtensionDstInfo
-
-	if err := ctx.ShouldBindJSON(&input); err != nil {
-		ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-
-	action.ChanSpy(input.Extension, input.Dst, true, false)
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: input})
-}
-
-// @tags Asterisk-Call
-// @Summary 强插(三方通话)
-// @Description  将 src 插入 dst 的通话中
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param   data body  model.ExtensionDstInfo  true "src, dst"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/call/bargein [post]
-func extenBargeIn(ctx *gin.Context) {
-	var input model.ExtensionDstInfo
-
-	if err := ctx.ShouldBindJSON(&input); err != nil {
-		ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-
-	action.ChanSpy(input.Extension, input.Dst, false, true)
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: input})
-}
-
-// @tags Asterisk-Call
-// @Summary 监听
-// @Description 将当前正在进行的通话终止,并与分机建立通话。
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param   data body  model.ExtensionDstInfo  true "src 为已进行的通话分机, dst 为未通话的分机"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/call/spy [post]
-func extenSpy(ctx *gin.Context) {
-	var input model.ExtensionDstInfo
-
-	if err := ctx.ShouldBindJSON(&input); err != nil {
-		ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-
-	action.ChanSpy(input.Extension, input.Dst, false, false)
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: input})
-}
-
-// @tags Asterisk-Call
-// @Summary 转接
-// @Description 转接 src 到 dst
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param   data body  model.SrcDstInfo  true "src, dst"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/call/transfer [post]
-func transfer(ctx *gin.Context) {
-	var input model.SrcDstInfo
-
-	if err := ctx.ShouldBindJSON(&input); err != nil {
-		ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-
-	myExtension := ""
-	if myExtension == "" {
-		ID, _ := ctx.Get("ID")
-		myExtension = "============================="
-		if myExtension == "" {
-			ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: fmt.Sprintf("not found user extension by ID %d", ID)})
-			return
-		}
-	}
-
-	//action.BlindTransfer(input.Src, input.Dst, mysql.GetDialPlanByExtension(myExtension))
-	action.Redirect(input.Src, input.Dst, "default")
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: input})
-}
-
-// @tags Asterisk-Call
-// @Summary 转移
-// @Description 通话已进行, 将 Src 的通话转移到 Dst, 挂断后 Dst 与 Src 继续通话
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param   data body  model.ChannelDstInfo  true "src, dst"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/call/atxfer [post]
-func atxfer(ctx *gin.Context) {
-	var input model.ChannelDstInfo
-
-	if err := ctx.ShouldBindJSON(&input); err != nil {
-		ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-
-	//ID, _ := ctx.Get("ID")
-	dialplan := "default"
-	// admin 用户通过主叫获取
-
-	action.Atxfer(input.Channel, input.Dst, dialplan)
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: input})
-}
-
-// @tags Asterisk-Call
-// @Summary 广播
-// @Description 广播
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param   data body  model.PageVO  true "广播参数"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/call/page [post]
-func page(ctx *gin.Context) {
-	var input model.PageVO
-
-	if err := ctx.ShouldBindJSON(&input); err != nil {
-		ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-
-	// 主动挂断被叫
-	for _, exten := range input.Extensions {
-		action.Hangup(exten)
-	}
-
-	action.Page(input.Src, input.Extensions, input.Duplex)
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: input})
-}

+ 0 - 154
api/panel/asterisk/conference.go

@@ -1,154 +0,0 @@
-package asterisk
-
-import (
-	"net/http"
-	"pbx-api-gin/api/model"
-	"pbx-api-gin/internal/app/ami/action"
-
-	"github.com/gin-gonic/gin"
-)
-
-/*
-// @tags Asterisk-Conference
-// @Summary 查看所有会议室
-// @Description 会议室列表
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/conference/listroom [get]
-*/
-func listRoom(ctx *gin.Context) {
-	res, err := action.ListRoom(make(map[string]string))
-	if err != nil {
-		ctx.JSON(http.StatusInternalServerError, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: res})
-}
-
-/*
-// @tags Asterisk-Conference
-// @Summary 查看指定会议室
-// @Description 会议室信息
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param  data body  model.ConferenceInfo  true "信息"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/conference/list [post]
-*/
-func list(ctx *gin.Context) {
-	var data model.ConferenceInfo
-	if err := ctx.ShouldBindJSON(&data); err != nil {
-		ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-	action.List(data.ConfNum)
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: data})
-}
-
-/*
-// @tags Asterisk-Conference
-// @Summary 踢人
-// @Description 移除指定通道
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param  data body  model.ConferenceInfo  true "参数"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/conference/kick [post]
-*/
-func kick(ctx *gin.Context) {
-	var data model.ConferenceInfo
-	if err := ctx.ShouldBindJSON(&data); err != nil {
-		ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-	action.Kick(data.ConfNum, data.Channel)
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: data})
-}
-
-/*
-// @tags Asterisk-Conference
-// @Summary 禁言
-// @Description 禁言
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param  data body  model.ConferenceInfo  true "参数"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/conference/mute [post]
-*/
-func mute(ctx *gin.Context) {
-	var data model.ConferenceInfo
-	if err := ctx.ShouldBindJSON(&data); err != nil {
-		ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-	action.Mute(data.ConfNum, data.Channel)
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: data})
-}
-
-/*
-// @tags Asterisk-Conference
-// @Summary 取消禁言
-// @Description 取消禁言
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param  data body  model.ConferenceInfo  true "参数"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/conference/unmute [post]
-*/
-func unMute(ctx *gin.Context) {
-	var data model.ConferenceInfo
-	if err := ctx.ShouldBindJSON(&data); err != nil {
-		ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-	action.UnMute(data.ConfNum, data.Channel)
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: data})
-}
-
-/*
-// @tags Asterisk-Conference
-// @Summary 开启锁定
-// @Description 开启锁定
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param  data body  model.ConferenceInfo  true "参数"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/conference/lock [post]
-*/
-func lock(ctx *gin.Context) {
-	var data model.ConferenceInfo
-	if err := ctx.ShouldBindJSON(&data); err != nil {
-		ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-	action.Lock(data.ConfNum)
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: data})
-}
-
-/*
-// @tags Asterisk-Conference
-// @Summary 关闭锁定
-// @Description 关闭锁定
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param  data body  model.ConferenceInfo  true "参数"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/conference/unlock [post]
-*/
-func unLock(ctx *gin.Context) {
-	var data model.ConferenceInfo
-	if err := ctx.ShouldBindJSON(&data); err != nil {
-		ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-	action.UnLock(data.ConfNum)
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: data})
-}

+ 0 - 272
api/panel/asterisk/meetme.go

@@ -1,272 +0,0 @@
-package asterisk
-
-import (
-	"errors"
-	"fmt"
-	"net/http"
-	"pbx-api-gin/api/model"
-	"pbx-api-gin/internal/app/ami/action"
-	amiModel "pbx-api-gin/internal/app/ami/model"
-	"pbx-api-gin/internal/app/mysql"
-	"pbx-api-gin/pkg/lfshook"
-	"strings"
-
-	"github.com/gin-gonic/gin"
-	"github.com/mitchellh/mapstructure"
-)
-
-// @tags Asterisk-MeetMe
-// @Summary 查看所有会议室
-// @Description 会议室列表
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/meetme/list [get]
-func listMeetMe(ctx *gin.Context) {
-	amiRooms, _ := action.ListRoomMeetMe(make(map[string]string))
-
-	var meets []model.MeetMe
-	if err := mysql.DBOrmInstance.Find(&meets); err != nil {
-		lfshook.NewLogger().Errorf("db index error %+v", err)
-		ctx.JSON(http.StatusInternalServerError, model.APIError{ErrorMessage: "db error"})
-		return
-	}
-
-	numRoomMap := make(map[string]*amiModel.MeetMeListRooms)
-	for _, room := range amiRooms {
-		numRoomMap[room.Conference] = room
-	}
-
-	rooms := make([]*model.MeetMeRoom, 0)
-	for _, meet := range meets {
-		room := &model.MeetMeRoom{
-			MeetMe: meet,
-		}
-		if data, has := numRoomMap[meet.Conference]; has {
-			mapstructure.Decode(data, room)
-		}
-		rooms = append(rooms, room)
-	}
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: rooms})
-}
-
-// @tags Asterisk-MeetMe
-// @Summary 查看指定会议室
-// @Description 会议室信息
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param conference query string true "会议室号"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/meetme/room [get]
-func room(ctx *gin.Context) {
-	conference := ctx.Query("conference")
-	if conference == "" {
-		ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: errors.New("conference is empty").Error()})
-		return
-	}
-	items, err := action.ListMeetMe(conference)
-	if err != nil {
-		lfshook.NewLogger().Warn(err)
-	}
-
-	// 查询 room 信息
-	var roomInfo *amiModel.MeetMeListRooms
-	amiRooms, _ := action.ListRoomMeetMe(make(map[string]string))
-	for _, room := range amiRooms {
-		if room.Conference == conference {
-			roomInfo = room
-			break
-		}
-	}
-
-	meet := model.MeetMe{Conference: conference}
-	if _, err := mysql.DBOrmInstance.Get(&meet); err != nil {
-		lfshook.NewLogger().Errorf("db get error %+v", err)
-		ctx.JSON(http.StatusInternalServerError, model.APIError{ErrorMessage: "db error"})
-		return
-	}
-	room := &model.MeetMeRoom{
-		MeetMe: meet,
-	}
-	mapstructure.Decode(roomInfo, room)
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: gin.H{"items": items, "room": room}})
-}
-
-// @tags Asterisk-MeetMe
-// @Summary 邀请会议
-// @Description 邀请会议
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param  data body  model.MeetMeInviteVO  true "加入会议参数"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/meetme/invite [post]
-func inviteMeetMe(ctx *gin.Context) {
-	var data model.MeetMeInviteVO
-	if err := ctx.ShouldBindJSON(&data); err != nil {
-		ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-
-	// 根据参数确定主叫, 再考虑用户登录的分机信息
-	myExtension := ""
-	if myExtension == "" {
-		ID, _ := ctx.Get("ID")
-		myExtension = "=================="
-		if myExtension == "" {
-			ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: fmt.Sprintf("not found user extension by ID %d", ID)})
-			return
-		}
-	}
-	dialplan := "default"
-
-	action.IviteMeetMe(data.Meetme, strings.Join(data.Extensions, ","), dialplan, myExtension)
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: data})
-}
-
-// @tags Asterisk-MeetMe
-// @Summary 踢出会议
-// @Description 踢出会议
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param  data body  model.MeetMeVO  true "参数"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/meetme/kick [post]
-func kickMeetMe(ctx *gin.Context) {
-	var data model.MeetMeVO
-	if err := ctx.ShouldBindJSON(&data); err != nil {
-		ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-	err := action.KickMeetMe(data.Meetme, strings.Join(data.UserNum, ","))
-	if err != nil {
-		ctx.JSON(http.StatusInternalServerError, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: data})
-}
-
-// @tags Asterisk-MeetMe
-// @Summary 禁言
-// @Description 禁言
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param  data body  model.MeetMeVO  true "参数"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/meetme/mute [post]
-func muteMeetMe(ctx *gin.Context) {
-	var data model.MeetMeVO
-	if err := ctx.ShouldBindJSON(&data); err != nil {
-		ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-
-	var hasError bool
-	for _, number := range data.UserNum {
-		_, err := action.MuteMeetMe(data.Meetme, number)
-		if err != nil {
-			lfshook.NewLogger().Error(err)
-			hasError = true
-		}
-	}
-
-	if hasError {
-		ctx.JSON(http.StatusInternalServerError, model.APIError{ErrorMessage: "check error.log"})
-		return
-	}
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: ""})
-}
-
-// @tags Asterisk-MeetMe
-// @Summary 取消禁言
-// @Description 取消禁言
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param  data body  model.MeetMeVO  true "参数"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/meetme/unmute [post]
-func unMuteMeetMe(ctx *gin.Context) {
-	var data model.MeetMeVO
-	if err := ctx.ShouldBindJSON(&data); err != nil {
-		ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-
-	var hasError bool
-	for _, number := range data.UserNum {
-		_, err := action.UnMuteMeetMe(data.Meetme, number)
-		if err != nil {
-			lfshook.NewLogger().Error(err)
-			hasError = true
-		}
-	}
-
-	if hasError {
-		ctx.JSON(http.StatusInternalServerError, model.APIError{ErrorMessage: "check error.log"})
-		return
-	}
-
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: "mute ok"})
-}
-
-// @tags Asterisk-MeetMe
-// @Summary 开启锁定
-// @Description 开启锁定
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param  data body  model.MeetMeCommonVO  true "参数"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/meetme/lock [post]
-func lockMeetMe(ctx *gin.Context) {
-	var data model.MeetMeCommonVO
-	if err := ctx.ShouldBindJSON(&data); err != nil {
-		ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-	action.LockMeetMe(data.Meetme)
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: data})
-}
-
-// @tags Asterisk-MeetMe
-// @Summary 关闭锁定
-// @Description 关闭锁定
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param  data body  model.MeetMeCommonVO  true "参数"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/meetme/unlock [post]
-func unLockMeetMe(ctx *gin.Context) {
-	var data model.MeetMeCommonVO
-	if err := ctx.ShouldBindJSON(&data); err != nil {
-		ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-	action.UnLockMeetMe(data.Meetme)
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: data})
-}
-
-// @tags Asterisk-MeetMe
-// @Summary 关闭会议
-// @Description 关闭会议
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param  data body  model.MeetMeCommonVO  true "参数"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/meetme/end [post]
-func endMeetMe(ctx *gin.Context) {
-	var data model.MeetMeCommonVO
-	if err := ctx.ShouldBindJSON(&data); err != nil {
-		ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-	action.EndMeetMe(data.Meetme)
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: data})
-}

+ 0 - 109
api/panel/asterisk/park.go

@@ -1,109 +0,0 @@
-package asterisk
-
-import (
-	"net/http"
-	"pbx-api-gin/api/model"
-	"pbx-api-gin/internal/app/ami/action"
-	"pbx-api-gin/pkg/lfshook"
-
-	"github.com/gin-gonic/gin"
-)
-
-// @tags Asterisk-Park
-// @Summary  停泊分机
-// @Description 停泊分机
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param   data body  model.ParkInfoVO  true "更新信息"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/park/park [post]
-func park(ctx *gin.Context) {
-	var data model.ParkInfoVO
-	if err := ctx.ShouldBindJSON(&data); err != nil {
-		ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-	lfshook.NewLogger().Infof("park %+v", data)
-	if err := action.Park(data.Extension, data.Parkinglot); err != nil {
-		ctx.JSON(http.StatusInternalServerError, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: data})
-}
-
-// @tags Asterisk-Park
-// @Summary  停泊接回
-// @Description 停泊接回
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param   data body  model.ParkBackVO  true "更新信息"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/park/back [post]
-func parkBack(ctx *gin.Context) {
-	var info model.ParkBackVO
-	if err := ctx.ShouldBindJSON(&info); err != nil {
-		ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-	lfshook.NewLogger().Infof("park back %+v", info)
-
-	// 根据参数确定主叫, 再考虑用户登录的分机信息
-	myExtension := info.CallerNumber
-	if myExtension == "" {
-		//ID, _ := ctx.Get("ID")
-		myExtension = "=============="
-		if myExtension == "" {
-			ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: "not found extension"})
-			return
-		}
-	}
-
-	dialplan := "default"
-	if info.CallerID == "" {
-		info.CallerID = info.Extension
-	}
-	action.Dial(myExtension, info.Extension, dialplan, info.CallerID, "=================", "Local")
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: info})
-}
-
-// @tags Asterisk-Park
-// @Summary  获取停泊信息
-// @Description 获取停泊信息
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Param   data body  model.ParkCommonVO  true "更新信息"
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/park/calls [post]
-func parkedCalls(ctx *gin.Context) {
-	var data model.ParkCommonVO
-	if err := ctx.ShouldBindJSON(&data); err != nil {
-		ctx.JSON(http.StatusBadRequest, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-	res, err := action.ParkedCalls(data.Parkinglot)
-	if err != nil {
-		ctx.JSON(http.StatusInternalServerError, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: res})
-}
-
-// @tags Asterisk-Park
-// @Summary 获取停泊池信息
-// @Description 获取停泊池信息
-// @Security ApiKeyAuth
-// @Accept  json
-// @Produce  json
-// @Success 200 {object} model.APIOK "请求成功"
-// @Router /ginapi/plugin-asterisk/park/lots [get]
-func parkinglots(ctx *gin.Context) {
-	data, err := action.Parkinglots()
-	if err != nil {
-		ctx.JSON(http.StatusInternalServerError, model.APIError{ErrorMessage: err.Error()})
-		return
-	}
-	ctx.JSON(http.StatusOK, model.APIOK{Message: "ok", Data: data})
-}

+ 117 - 5
internal/app/ami/action/call.go

@@ -2,12 +2,19 @@ package action
 
 import (
 	"fmt"
+	"pbx-api-gin/internal/app/stc/priority"
 	"pbx-api-gin/pkg/lfshook"
 	"pbx-api-gin/pkg/utils"
 	"strings"
 	"time"
 )
 
+var Pads = []string{"2413", "2414", "2415", "2421", "2422", "2423", "2424", "2425", "2431", "2432", "2433", "2434", "2435", "2441", "2442", "2443", "2444",
+	"2445", "2451", "2452", "2453", "2454", "2455", "2461", "2462", "2463", "2464", "2465", "2471", "2472", "2473", "2474", "2475", "2481", "2482", "2483",
+	"2484", "2485", "2411", "2412"}
+
+var Pacus = []string{"2111", "2121", "2131", "2141", "2151", "2161", "2171", "2181"}
+
 // Hangup 挂断指定分机或通道
 func Hangup(channel string) {
 	lfshook.NewLogger().Infof("hangup extensions/channel %s", channel)
@@ -25,20 +32,125 @@ func Hangup(channel string) {
 	}
 }
 
-// Hangup 挂断所有分机
-func HangupAll() {
-	var Pacus = []string{"2111", "2121", "2131", "2141", "2151", "2161", "2171", "2181"}
+// Hangup 挂断所有分机,除指定分机和PAD
+func HangupAllExcept(caller string) {
+
 	//all PACU
 	for _, ret := range Pacus {
 		Hangup(ret)
 	}
 
-	Hangup("1411") //IO1
-	Hangup("1481") //IO8
+	switch caller {
+	case "2311":
+		Hangup("1411") //IO1
+		Hangup("1481") //IO8
+		//Hangup("2311") //ICP1
+		Hangup("2381") //ICP8
+	case "2381":
+		Hangup("1411") //IO1
+		Hangup("1481") //IO8
+		Hangup("2311") //ICP1
+		//Hangup("2381") //ICP8
+	case "1411":
+		//Hangup("1411") //IO1
+		Hangup("1481") //IO8
+		Hangup("2311") //ICP1
+		Hangup("2381") //ICP8
+	case "1481":
+		Hangup("1411") //IO1
+		//Hangup("1481") //IO8
+		Hangup("2311") //ICP1
+		Hangup("2381") //ICP8
+	case "":
+		Hangup("1411") //IO1
+		Hangup("1481") //IO8
+		Hangup("2311") //ICP1
+		Hangup("2381") //ICP8
+	}
+}
+
+// Hangup all ICP
+func HangupRunningTask() {
+
+	if priority.RunningPATaskChan != "" {
+		switch priority.RunningType {
+		case "PAD-ICP", "PAD-TMS": // PAD task running
+			chans, err := CoreShowChannels()
+			if err != nil {
+				lfshook.NewLogger().Errorf("CoreShowChannels %+v", err)
+			}
+
+			//1. Redirect the connected PAD to 0300
+			for _, ret := range chans {
+				if utils.IsPAIU(ret.CallerIDNum) && ret.ChannelStateDesc == "Up" {
+					err := Redirect(ret.Channel, "0300", "default")
+					if err != nil {
+						lfshook.NewLogger().Errorf("Redirect %+v", err)
+					}
+				}
+			}
+			//2. hangup task channel (ICP + PACU)
+			Hangup(priority.RunningPATaskChan)
+
+			//3. hangup other channel
+			HangupICP()
+
+			//4. Hangup Local channel
+			for _, ret := range chans {
+				if strings.Contains(ret.Channel, "Local") {
+					Hangup(ret.Channel)
+				}
+			}
+		case "PAD-OCC":
+			//Hangup connected PAD
+
+			Hangup(priority.RunningPATaskChan)
+			//Redirect all the other pads in 0301 to 0300
+
+			priority.OCCAnswer = 0
+			HangupIO()
+
+		default:
+			Hangup(priority.RunningPATaskChan)
+		}
+		priority.RunningPATaskChan = ""
+
+	}
+}
+
+// Hangup all ICP
+func HangupICP() {
 	Hangup("2311") //ICP1
 	Hangup("2381") //ICP8
 }
 
+// Hangup all IO
+func HangupIO() {
+	Hangup("1411") //IO1
+	Hangup("1481") //IO8
+}
+
+// Hangup all PACU
+func HangupAllPACU() {
+	//all PACU
+	for _, ret := range Pacus {
+		Hangup(ret)
+	}
+}
+
+// Hangup all PACU
+func HangupAllPAD() {
+	//all PAD
+	for _, ret := range Pads {
+		Hangup(ret)
+	}
+}
+
+// Hangup all calls
+func HangupAll() {
+	utils.ExecCmdAsync("/usr/sbin/asterisk", "-rx", "hangup request all")
+}
+
 // Dial 拨打号码
 func Dial(src, dst, dialrule, callerID, callerName string, callType string) {
 	chanel := fmt.Sprintf("%s/%s@default", "Local", src)

+ 1 - 0
internal/app/ami/action/channel.go

@@ -30,6 +30,7 @@ func CoreShowChannels() (result []model.CoreShowChannelResVO, err error) {
 				Channel:           event.Data["Channel"],
 				Duration:          event.Data["Duration"],
 				DurationSecond:    utils.TimeStringToSecond(event.Data["Duration"]),
+				ChannelStateDesc:  event.Data["ChannelStateDesc"],
 			}
 			result = append(result, channel)
 		}

+ 0 - 130
internal/app/ami/action/conference.go

@@ -1,130 +0,0 @@
-package action
-
-import (
-	"errors"
-)
-
-func ListRoom(options map[string]string) (res map[string]string, err error) {
-	action := map[string]string{
-		"Action": "ConfbridgeListRooms",
-	}
-
-	for key, value := range options {
-		action[key] = value
-	}
-
-	res, _, err = AminInstance.Send(action)
-	if err != nil {
-		return nil, err
-	}
-	if res["Response"] != "Success" {
-		return nil, errors.New(res["Message"])
-	}
-
-	return res, nil
-}
-
-func List(confnum string) (res map[string]string, err error) {
-	action := map[string]string{
-		"Action":     "ConfbridgeList",
-		"Conference": confnum,
-	}
-
-	res, _, err = AminInstance.Send(action)
-	if err != nil {
-		return nil, err
-	}
-	if res["Response"] != "Success" {
-		return nil, errors.New(res["Message"])
-	}
-
-	return res, nil
-}
-
-func Kick(confnum, channel string) (res map[string]string, err error) {
-	action := map[string]string{
-		"Action":     "ConfbridgeKick",
-		"Conference": confnum,
-		"Channel":    channel,
-	}
-
-	res, _, err = AminInstance.Send(action)
-	if err != nil {
-		return nil, err
-	}
-	if res["Response"] != "Success" {
-		return nil, errors.New(res["Message"])
-	}
-
-	return res, nil
-}
-
-func Mute(confnum, channel string) (res map[string]string, err error) {
-	action := map[string]string{
-		"Action":     "ConfbridgeMute",
-		"Conference": confnum,
-		"Channel":    channel,
-	}
-
-	res, _, err = AminInstance.Send(action)
-	if err != nil {
-		return nil, err
-	}
-	if res["Response"] != "Success" {
-		return nil, errors.New(res["Message"])
-	}
-
-	return res, nil
-}
-
-func UnMute(confnum, channel string) (res map[string]string, err error) {
-	action := map[string]string{
-		"Action":     "ConfbridgeUnmute",
-		"Conference": confnum,
-		"Channel":    channel,
-	}
-
-	res, _, err = AminInstance.Send(action)
-	if err != nil {
-		return nil, err
-	}
-	if res["Response"] != "Success" {
-		return nil, errors.New(res["Message"])
-	}
-
-	return res, nil
-}
-
-func Lock(confnum string) (res map[string]string, err error) {
-	action := map[string]string{
-		"Action":     "ConfbridgeLock",
-		"Conference": confnum,
-	}
-
-	res, _, err = AminInstance.Send(action)
-	if err != nil {
-		return nil, err
-	}
-	if res["Response"] != "Success" {
-		return nil, errors.New(res["Message"])
-	}
-
-	return res, nil
-}
-
-func UnLock(confnum string) (res map[string]string, err error) {
-	action := map[string]string{
-		"Action":     "ConfbridgeUnlock",
-		"Conference": confnum,
-	}
-
-	res, _, err = AminInstance.Send(action)
-	if err != nil {
-		return nil, err
-	}
-	if res["Response"] != "Success" {
-		return nil, errors.New(res["Message"])
-	}
-
-	return res, nil
-}

+ 0 - 36
internal/app/ami/action/extension.go

@@ -1,36 +0,0 @@
-package action
-
-import (
-	"errors"
-	"pbx-api-gin/internal/app/ami/model"
-)
-
-func ExtensionStateList() (result []*model.ExtensionStatus, err error) {
-	action := map[string]string{
-		"Action": "ExtensionStateList",
-	}
-
-	res, events, err := AminInstance.Send(action)
-
-	if err != nil {
-		return nil, err
-	}
-	if res["Response"] != "Success" {
-		return nil, errors.New(res["Message"])
-	}
-
-	for _, event := range events {
-		if event.Data["Event"] == "ExtensionStatus" {
-			point := &model.ExtensionStatus{
-				Event:      event.Data["Event"],
-				Exten:      event.Data["Exten"],
-				Context:    event.Data["Context"],
-				Hint:       event.Data["Hint"],
-				Status:     event.Data["StatusText"],
-				StatusText: event.Data["StatusText"],
-			}
-			result = append(result, point)
-		}
-	}
-	return result, nil
-}

+ 155 - 40
internal/app/ami/action/index.go

@@ -17,8 +17,6 @@ import (
 
 var AminInstance *amigo.Amigo
 
-//type Operation func(src, dst string, whisper, bargein bool)
-
 func HandleAMI(event map[string]string) {
 	//lfshook.NewLogger().Infof("===start======%s", event["Event"])
 	//return if not actived
@@ -28,60 +26,91 @@ func HandleAMI(event map[string]string) {
 
 	switch event["Event"] {
 
-	case "UserEvent":
+	case "UserEvent": // RCD filename; PA;CPA; CabCab
 		lfshook.NewLogger().Infof("========event:%s   File:%s", event["Event"], event["FILENAME"])
 		if event["UserEvent"] == "SetRecordFile" { //get  record file name
 			alstatus.SendRecordFile(event["FILENAME"], event["RecordType"])
-		} else if event["UserEvent"] == "CallType" && event["Type"] == "PA" { //check manual PA priority
-			if priority.CheckPriority("ManuPa") {
-				HangupAll()
+
+		} else if event["UserEvent"] == "CallType" && (event["Type"] == "PA" || event["Type"] == "CPA") { //PA; check manual PA priority
+			//check active signal  before PA
+			if active.CabNum == "1" && !active.Actived && event["CallerIDNum"] == "2311" {
+				Hangup(event["CallerIDNum"])
+			} else if active.CabNum == "8" && !active.Actived && event["CallerIDNum"] == "2381" {
+				Hangup(event["CallerIDNum"])
+			}
+
+			//PA & CPA interrupt others
+			if utils.IsICP(event["CallerIDNum"]) {
+				if priority.CheckPriority("ManuPa") {
+					//hangup others if priority is higher
+					HangupRunningTask()
+				} else {
+					Hangup(event["CallerIDNum"]) //lowwer priority ,hangup caller
+				}
+			} else if utils.IsIO(event["CallerIDNum"]) { // CPA
+				if priority.CheckPriority("CPA") {
+					//hangup others if priority is higher
+					HangupRunningTask()
+				} else {
+					Hangup(event["CallerIDNum"]) //lowwer priority ,hangup caller
+				}
 			}
-		} else if event["UserEvent"] == "CallType" && event["Type"] == "C2C" { //check cab cab priority
+		} else if event["UserEvent"] == "CallType" && event["Type"] == "C2C" { //CabCab; check cab cab priority
+
 			if priority.CheckPriority("CabCab") {
-				HangupAll()
+				HangupRunningTask()
 			}
 		}
 
 	case "Newchannel":
-		lfshook.NewLogger().Infof("=========%s", event["Event"])
+		//lfshook.NewLogger().Infof("=========%s", event["Event"])
 		if utils.IsPAIU(event["CallerIDNum"]) && event["Exten"] == "0300" { // Alarm dial queue start; PAD dialing
-			priority.RunningType, _ = strconv.Atoi(priority.Priority.PADICP)
 			alstatus.PaStatus(event["CallerIDNum"], "PAD", "start")
 			alstatus.AlarmStatus(event["CallerIDNum"], "dial")
 		}
 
 	case "SoftHangupRequest": //pre-recored broadcast end
-		lfshook.NewLogger().Infof("=========%s", event["Event"])
+		//lfshook.NewLogger().Infof("=========%s", event["Event"])
 		if event["CallerIDName"] == "EMG" && event["Exten"] == "0502" { // EMG broadcast hangup
-			priority.RunningType = 0
+			priority.RunningTypePriority = 0
+			priority.RunningType = ""
+
 			alstatus.PaStatus(event["CallerIDName"], "EMG", "end")
 
 		} else if event["CallerIDName"] == "STN" && event["Exten"] == "0503" {
-			priority.RunningType = 0
+			priority.RunningTypePriority = 0
+			priority.RunningType = ""
 			priority.SpecialVoice = 0
 			alstatus.PaStatus(event["CallerIDName"], "STN", "end")
 
 		} else if event["CallerIDName"] == "DCS" && event["Exten"] == "0504" {
-			priority.RunningType = 0
+			priority.RunningTypePriority = 0
+			priority.RunningType = ""
 			alstatus.PaStatus(event["CallerIDName"], "DCS", "end")
 
 		} else if event["CallerIDName"] == "SPC" && event["Exten"] == "0505" {
-			priority.RunningType = 0
+			priority.RunningTypePriority = 0
+			priority.RunningType = ""
 			alstatus.PaStatus(event["CallerIDName"], "SPC", "end")
 
 		} else if event["CallerIDName"] == "CHK" && event["Exten"] == "0510" {
-			priority.RunningType = 0
+			priority.RunningTypePriority = 0
+			priority.RunningType = ""
 			alstatus.PaStatus(event["CallerIDName"], "CHK", "end")
+		} else if event["CallerIDName"] == "VOL" && event["Exten"] == "0510" {
+			priority.RunningTypePriority = 0
+			priority.RunningType = ""
+			alstatus.PaStatus(event["CallerIDName"], "VOL", "end")
 		}
 
 	case "Hangup":
 
-		lfshook.NewLogger().Infof("=========%s", event["Event"])
+		//lfshook.NewLogger().Infof("=========%s", event["Event"])
 		if utils.IsPACU(event["CallerIDNum"]) && utils.IsICP(event["ConnectedLineNum"]) { // TMS-ICP answer PAD, hangup
 			res, _ := QueueStatus("0300", "") // check ICP queue ,if empty PAD end
 			if res.Calls == "0" {
 				priority.ICPAnswer = 0
-				priority.RunningType = 0
+				priority.RunningTypePriority = 0
 				alstatus.PaStatus(event["CallerIDNum"], "PAD", "end")
 				break
 			}
@@ -91,7 +120,7 @@ func HandleAMI(event map[string]string) {
 			res, _ := QueueStatus("0300", "") // check ICP queue ,if empty PAD end
 			if res.Calls == "0" {
 				priority.ICPAnswer = 0
-				priority.RunningType = 0
+				priority.RunningTypePriority = 0
 				alstatus.PaStatus(event["CallerIDNum"], "PAD", "end")
 				break
 			}
@@ -101,7 +130,7 @@ func HandleAMI(event map[string]string) {
 			res, _ := QueueStatus("0300", "") // check ICP queue ,if empty PAD end
 			if res.Calls == "0" {
 				priority.ICPAnswer = 0
-				priority.RunningType = 0
+				priority.RunningTypePriority = 0
 				alstatus.PaStatus(event["CallerIDNum"], "PAD", "end")
 				break
 			}
@@ -112,15 +141,15 @@ func HandleAMI(event map[string]string) {
 			res, _ := QueueStatus("0301", "") // check OCC queue ,if empty PAD end
 			if res.Calls == "0" {             //OCC queue is empty
 				priority.OCCAnswer = 0
-				priority.RunningType = 0
+				priority.RunningTypePriority = 0
 				alstatus.OccPad("end")
 				break
 			} else { //OCC queue is not empty
 
-				if active.CabNum == "1" && active.Actived && ExtenStatus("1411") == "Idle" { //check active and OCC status
+				if active.CabNum == "1" && active.Actived && alstatus.GetExtenStat("1411") == "Idle" { //check active and OCC status
 					Dial("0401", "0512", "pad-rule-pacus-occ", "ano1", event["CallerIDNum"], "1") // PACUs dial OCC1
 					//goto ConfbridgeJoin, OCC1 answer PAD
-				} else if active.CabNum == "8" && active.Actived && ExtenStatus("1481") == "Idle" {
+				} else if active.CabNum == "8" && active.Actived && alstatus.GetExtenStat("1481") == "Idle" {
 					Dial("0401", "0512", "pad-rule-pacus-occ", "ano8", event["CallerIDNum"], "8") // PACUs dial OCC8
 					//goto ConfbridgeJoin, OCC8 answer PAD
 				}
@@ -130,6 +159,7 @@ func HandleAMI(event map[string]string) {
 	case "QueueCallerJoin":
 		lfshook.NewLogger().Infof("=========%s", event["Event"])
 		if priority.OCCAnswer == 1 && event["Queue"] == "0300" { //New PAD Goto the OCC queue in the first time, if OCC answered
+			alstatus.AlarmStatus(event["CallerIDNum"], "queue") //send status to STC
 			go RedirectInQueue(event["CallerIDNum"], "0301", "queues-occ", "")
 			break
 		}
@@ -161,16 +191,19 @@ func HandleAMI(event map[string]string) {
 		}
 
 		//first PAD caller goto OCC
+		//PACUs dial OCC;
+		//PAD chanspy(WqE) OCC;
+		//ICPs chanspy(qE) PAD;
 		if utils.IsPAIU(event["CallerIDNum"]) && event["Queue"] == "0301" && priority.OCCAnswer == 0 { // The first PAD to OCC ,caller is PAD
-			if active.CabNum == "1" && active.Actived && ExtenStatus("1411") == "Idle" { //check active and OCC status
+			if active.CabNum == "1" && active.Actived && alstatus.GetExtenStat("1411") == "Idle" { //check active and OCC status
 				priority.OCCAnswer = 1
 				alstatus.OccPad("start")
-				priority.RunningType, _ = strconv.Atoi(priority.Priority.PADOCC)              //Set running priority
+				priority.RunningTypePriority, _ = strconv.Atoi(priority.Priority.PADOCC)      //Set running priority
 				Dial("0401", "0512", "pad-rule-pacus-occ", "ano1", event["CallerIDNum"], "1") // PACUs dial OCC1
 				//Goto event=ConfbridgeJoin;OCC answer PAD
-			} else if active.CabNum == "8" && active.Actived && ExtenStatus("1481") == "Idle" {
+			} else if active.CabNum == "8" && active.Actived && alstatus.GetExtenStat("1481") == "Idle" {
 				priority.OCCAnswer = 1
-				priority.RunningType, _ = strconv.Atoi(priority.Priority.PADOCC) //Set running priority
+				priority.RunningTypePriority, _ = strconv.Atoi(priority.Priority.PADOCC) //Set running priority
 				alstatus.OccPad("start")
 				Dial("0401", "0512", "pad-rule-pacus-occ", "ano8", event["CallerIDNum"], "8") // PACUs dial OCC8
 				//Goto event=ConfbridgeJoin;OCC answer PAD
@@ -179,25 +212,82 @@ func HandleAMI(event map[string]string) {
 
 	case "ConfbridgeJoin":
 		lfshook.NewLogger().Infof("=========%s", event["Event"])
+		//Send PA start msg to STC
 		if utils.IsICP(event["CallerIDNum"]) && event["Exten"] == "0500" { // PA start
 			lfshook.NewLogger().Infof("====PA status:%s=====", "start")
-			priority.RunningType, _ = strconv.Atoi(priority.Priority.ManuPa)
+			priority.RunningTypePriority, _ = strconv.Atoi(priority.Priority.ManuPa)
 			alstatus.PaStatus(event["CallerIDNum"], "PA", "start")
+			priority.RunningPATaskChan = event["Channel"]
+			priority.RunningType = "PA"
 			break
-		}
-
-		if utils.IsIO(event["CallerIDNum"]) && event["Exten"] == "0501" { //CPA start
+		} else if utils.IsIO(event["CallerIDNum"]) && event["Exten"] == "0501" { //CPA start
 			lfshook.NewLogger().Infof("====CPA status:%s=====", "start")
-			priority.RunningType, _ = strconv.Atoi(priority.Priority.CPA)
+			priority.RunningTypePriority, _ = strconv.Atoi(priority.Priority.CPA)
 			alstatus.PaStatus(event["CallerIDNum"], "CPA", "start")
+			priority.RunningPATaskChan = event["Channel"]
+			priority.RunningType = "CPA"
 			break
 		}
 
+		//set priority and send PA status msg
+		switch event["CallerIDName"] {
+		case "EMG":
+			alstatus.PaStatus(event["CallerIDNum"], "EMG", "start")
+			priority.RunningPATaskChan = event["Channel"]
+			priority.RunningType = "EMG"
+			//Pa status report
+			priority.RunningTypePriority, _ = strconv.Atoi(priority.Priority.EMG)
+			alstatus.PaStatus("", "EMG", "start")
+
+		case "SPC":
+			alstatus.PaStatus(event["CallerIDNum"], "SPC", "start")
+			priority.RunningPATaskChan = event["Channel"]
+			priority.RunningType = "SPC"
+			//Pa status report
+			priority.RunningTypePriority, _ = strconv.Atoi(priority.Priority.SPC)
+			alstatus.PaStatus("", "EMG", "start")
+
+		case "DCS":
+			alstatus.PaStatus(event["CallerIDNum"], "DCS", "start")
+			priority.RunningPATaskChan = event["Channel"]
+			priority.RunningType = "DCS"
+			//Pa status report
+			priority.RunningTypePriority, _ = strconv.Atoi(priority.Priority.DCS)
+			alstatus.PaStatus("", "EMG", "start")
+
+		case "STN":
+			alstatus.PaStatus(event["CallerIDNum"], "STN", "start")
+			priority.RunningPATaskChan = event["Channel"]
+			priority.RunningType = "STN"
+			//Pa status report
+			priority.RunningTypePriority, _ = strconv.Atoi(priority.Priority.STN)
+			alstatus.PaStatus("", "STN", "start")
+
+		case "CHK":
+			alstatus.PaStatus(event["CallerIDNum"], "CHK", "start")
+			priority.RunningPATaskChan = event["Channel"]
+			priority.RunningType = "CHK"
+			//Pa status report
+			priority.RunningTypePriority, _ = strconv.Atoi(priority.Priority.CHK)
+			alstatus.PaStatus("", "CHK", "start")
+
+		case "VOL":
+			alstatus.PaStatus(event["CallerIDNum"], "VOL", "start")
+			priority.RunningPATaskChan = event["Channel"]
+			priority.RunningType = "VOL"
+			//Pa status report
+			priority.RunningTypePriority, _ = strconv.Atoi(priority.Priority.VOL)
+			alstatus.PaStatus("", "VOL", "start")
+		}
+
 		//ICP answer PAD;
 		if event["ConnectedLineNum"] == "ani1" && event["Exten"] == "0511" { //PAD answered by ICP; PACUs connected ICP1
 			lfshook.NewLogger().Infof("====PAD answered by ICP1:%s=====", event["ConnectedLineName"])
 			alstatus.AlarmStatus(event["ConnectedLineName"], "connect")
 
+			priority.RunningPATaskChan = event["Channel"]
+			priority.RunningType = "PAD-ICP"
+			priority.RunningTypePriority, _ = strconv.Atoi(priority.Priority.PADICP)
 			go RedirectInQueue(event["ConnectedLineName"], "2311", "chanspy-rule-whisper", event["ConnectedLineName"])               //PAD chanspy(EqW) ICP1
 			go Dial("0402", event["ConnectedLineName"], "chanspy-rule", event["ConnectedLineName"], event["ConnectedLineName"], "8") //ICP8 chanspy PAD
 			//goto event=ChanSpyStart; PAD whisper ICP8
@@ -207,6 +297,9 @@ func HandleAMI(event map[string]string) {
 			lfshook.NewLogger().Infof("====PAD answered by ICP8:%s=====", event["ConnectedLineName"])
 			alstatus.AlarmStatus(event["ConnectedLineName"], "connect")
 
+			priority.RunningPATaskChan = event["Channel"]
+			priority.RunningType = "PAD-ICP"
+			priority.RunningTypePriority, _ = strconv.Atoi(priority.Priority.PADICP)
 			go RedirectInQueue(event["ConnectedLineName"], "2381", "chanspy-rule-whisper", event["ConnectedLineName"])               //PAD chanspy(EqW) ICP8
 			go Dial("0402", event["ConnectedLineName"], "chanspy-rule", event["ConnectedLineName"], event["ConnectedLineName"], "1") //ICP1 chanspy PAD
 			//goto event=ChanSpyStart; PAD whisper ICP1
@@ -218,6 +311,9 @@ func HandleAMI(event map[string]string) {
 			lfshook.NewLogger().Infof("====PAD answered by OCC1:%s=====", event["ConnectedLineName"])
 			alstatus.AlarmStatus(event["ConnectedLineName"], "connect")
 
+			priority.RunningPATaskChan = event["Channel"]
+			priority.RunningType = "PAD-OCC"
+			priority.RunningTypePriority, _ = strconv.Atoi(priority.Priority.PADOCC)
 			go RedirectInQueue(event["ConnectedLineName"], "1411", "chanspy-rule-whisper", event["ConnectedLineName"]) //PAD chanspy(EqW) IO1
 			//goto event=ChanSpyStart; ICPs spy PAD
 			break
@@ -226,6 +322,9 @@ func HandleAMI(event map[string]string) {
 			lfshook.NewLogger().Infof("====PAD answered by OCC8:%s=====", event["ConnectedLineName"])
 			alstatus.AlarmStatus(event["ConnectedLineName"], "connect")
 
+			priority.RunningPATaskChan = event["Channel"]
+			priority.RunningType = "PAD-OCC"
+			priority.RunningTypePriority, _ = strconv.Atoi(priority.Priority.PADOCC)
 			go RedirectInQueue(event["ConnectedLineName"], "1481", "chanspy-rule-whisper", event["ConnectedLineName"]) //PAD chanspy(EqW) IO8
 			//goto event=ChanSpyStart; ICPs spy PAD
 			break
@@ -234,7 +333,7 @@ func HandleAMI(event map[string]string) {
 	case "ChanSpyStart":
 		lfshook.NewLogger().Infof("=========event:%s   callerid:%s   SpyeeConnectedLineName:%s  SpyerExten:%s", event["Event"], event["CallerIDNum"], event["SpyeeConnectedLineName"], event["SpyerExten"])
 		//PAD answered by OCC; ICPs chanspy PAD
-		if utils.IsPAIU(event["SpyeeConnectedLineName"]) && utils.IsIO(event["SpyerExten"]) { // check if it is PAD whisper IO
+		if utils.IsPAIU(event["SpyeeConnectedLineName"]) && utils.IsIO(event["SpyerExten"]) { // check if it is PAD whisper IO/OCC
 			go Dial("0404", event["SpyeeConnectedLineName"], "chanspy-rule", "ano", "ano", "") //ICPs chanspy PAD
 		}
 
@@ -242,37 +341,46 @@ func HandleAMI(event map[string]string) {
 		lfshook.NewLogger().Infof("=========%s", event["Event"])
 		if utils.IsICP(event["CallerIDNum"]) && event["Exten"] == "0500" { // PA end
 			lfshook.NewLogger().Infof("====PA  status =====%s", "end")
-			priority.RunningType = 0
+			priority.RunningTypePriority = 0
+			priority.RunningType = ""
+			priority.RunningPATaskChan = ""
 			alstatus.PaStatus(event["CallerIDNum"], "PA", "end")
 		}
 		if utils.IsIO(event["CallerIDNum"]) && event["Exten"] == "0501" { //CPA end
 			lfshook.NewLogger().Infof("====CPA  status =====%s", "end")
-			priority.RunningType = 0
+			priority.RunningTypePriority = 0
+			priority.RunningType = ""
+			priority.RunningPATaskChan = ""
 			alstatus.PaStatus(event["CallerIDNum"], "CPA", "end")
 		}
 
 	case "DialEnd":
-		lfshook.NewLogger().Infof("=========%s", event["Event"])
+		//lfshook.NewLogger().Infof("=========%s", event["Event"])
 		//Cab Cab start
 		if utils.IsICP(event["CallerIDNum"]) && utils.IsICP(event["ConnectedLineNum"]) && event["DialStatus"] == "ANSWER" {
-			priority.RunningType, _ = strconv.Atoi(priority.Priority.CabCab)
+			priority.RunningTypePriority, _ = strconv.Atoi(priority.Priority.CabCab)
+			priority.RunningType = "C2C"
 			alstatus.PaStatus(event["CallerIDNum"], "C2C", "start")
 		}
 
 	case "BridgeLeave":
-		lfshook.NewLogger().Infof("=========%s", event["Event"])
+		//lfshook.NewLogger().Infof("=========%s", event["Event"])
 		//Cab Cab end
 		if utils.IsICP(event["CallerIDNum"]) && utils.IsICP(event["ConnectedLineNum"]) && event["Exten"] == "0400" {
-			priority.RunningType = 0
+			priority.RunningTypePriority = 0
+			priority.RunningType = ""
 			alstatus.PaStatus(event["CallerIDNum"], "C2C", "end")
 		}
 
 	case "ExtensionStatus":
-		lfshook.NewLogger().Infof("=========event:%s  Ext:%s status:%s ", event["Event"], event["extension"], event["StatusText"])
+		//lfshook.NewLogger().Infof("=========event:%s  Ext:%s status:%s ", event["Event"], event["Exten"], event["StatusText"])
 
 		//update extension status
 		if event["StatusText"] == "Idle" || event["StatusText"] == "Unavailable" {
 			if len(event["Exten"]) > 3 && utils.IsPAIU(event["Exten"]) {
+				//alstatus.ExtenStatMap[event["Exten"]] = event["StatusText"]
+				alstatus.SetExtenStat(event["Exten"], event["StatusText"])
+				//lfshook.NewLogger().Infof("======Extension Map : %+v==============", alstatus.ExtenStatMap)
 				alstatus.AlarmStatus(event["Exten"], event["StatusText"]) // PAD idle + unavailable
 			}
 		}
@@ -284,6 +392,9 @@ func HandleAMI(event map[string]string) {
 			lfshook.NewLogger().Infof("====BridgeEnter==IN action===%s===ID:%s   Name:%s", event["Event"], event["CallerIDNum"], event["CallerIDName"])
 			alstatus.AlarmStatus(event["CallerIDName"], "connect") // Alarm connected
 
+			priority.RunningPATaskChan = event["Channel"]
+			priority.RunningType = "PAD-TMS"
+			priority.RunningTypePriority, _ = strconv.Atoi(priority.Priority.PADTMS)
 			if active.CabNum == "1" && active.Actived {
 				go RedirectInQueue(event["CallerIDName"], "2311", "chanspy-rule-whisper", "") //PAD chanspy(EqW) ICP1
 				go Dial("0403", event["CallerIDName"], "chanspy-rule", "2381", "2381", "8")   //ICP8---chanspy----PAD
@@ -292,6 +403,10 @@ func HandleAMI(event map[string]string) {
 				go Dial("0403", event["CallerIDName"], "chanspy-rule", "2311", "2311", "1")   //ICP1---chanspy----PAD
 			}
 		} else if utils.IsPAIU(event["CallerIDNum"]) { // PAD connect ICP-TMS;PACU not available
+
+			priority.RunningPATaskChan = event["Channel"]
+			priority.RunningType = "PAD-TMS"
+			priority.RunningTypePriority, _ = strconv.Atoi(priority.Priority.PADTMS)
 			lfshook.NewLogger().Infof("====send pad status=====")
 			alstatus.AlarmStatus(event["CallerIDNum"], "connect") // PAD connect ICP-TMS
 		}

+ 0 - 149
internal/app/ami/action/meetme.go

@@ -1,149 +0,0 @@
-package action
-
-import (
-	"errors"
-	"pbx-api-gin/internal/app/ami/model"
-	"pbx-api-gin/pkg/lfshook"
-	"pbx-api-gin/pkg/utils"
-
-	"github.com/mitchellh/mapstructure"
-)
-
-func ListRoomMeetMe(options map[string]string) (points []*model.MeetMeListRooms, err error) {
-	action := map[string]string{
-		"Action": "MeetmeListRooms",
-	}
-
-	for key, value := range options {
-		action[key] = value
-	}
-
-	res, events, err := AminInstance.Send(action)
-	if err != nil {
-		return nil, err
-	}
-	if res["Response"] != "Success" {
-		return nil, errors.New(res["Message"])
-	}
-
-	for _, event := range events {
-		if event.Data["Event"] == "MeetmeListRooms" {
-			point := &model.MeetMeListRooms{}
-			mapstructure.Decode(event.Data, point)
-			points = append(points, point)
-		}
-	}
-	return points, nil
-}
-
-func ListMeetMe(confnum string) (points []*model.MeetmeList, err error) {
-	points = make([]*model.MeetmeList, 0)
-	action := map[string]string{
-		"Action": "MeetmeList",
-	}
-	if confnum != "" {
-		action["Conference"] = confnum
-	}
-
-	res, events, err := AminInstance.Send(action)
-	if err != nil {
-		return points, err
-	}
-	if res["Response"] != "Success" {
-		return points, errors.New(res["Message"])
-	}
-
-	lfshook.NewLogger().Tracef("ListMeetMe %+v", events)
-	for _, event := range events {
-		if event.Data["Event"] == "MeetmeList" {
-			point := &model.MeetmeList{}
-			mapstructure.Decode(event.Data, point)
-			points = append(points, point)
-		}
-
-	}
-	return points, nil
-}
-
-// 踢出成员:/etc/scripts/conference.sh kick 会议室号码 numbers
-func KickMeetMe(confnum, numbers string) (err error) {
-	lfshook.NewLogger().Infof("kick %s %s", confnum, numbers)
-	_, _, err = utils.ExecCmd("/etc/scripts/conference.sh", "kick", confnum, numbers)
-	if err != nil {
-		return err
-	}
-	return nil
-}
-
-func MuteMeetMe(meetme, usernum string) (res map[string]string, err error) {
-	lfshook.NewLogger().Infof("mute %s %s", meetme, usernum)
-	action := map[string]string{
-		"Action":  "MeetmeMute",
-		"Meetme":  meetme,
-		"Usernum": usernum,
-	}
-	lfshook.NewLogger().Infof("meetme action %+v", action)
-	res, _, err = AminInstance.Send(action)
-	if err != nil {
-		return nil, err
-	}
-	if res["Response"] != "Success" {
-		return nil, errors.New(res["Message"])
-	}
-
-	return res, nil
-}
-
-func UnMuteMeetMe(meetme, usernum string) (res map[string]string, err error) {
-	action := map[string]string{
-		"Action":  "MeetmeUnmute",
-		"Meetme":  meetme,
-		"Usernum": usernum,
-	}
-
-	res, _, err = AminInstance.Send(action)
-	if err != nil {
-		return nil, err
-	}
-	if res["Response"] != "Success" {
-		return nil, errors.New(res["Message"])
-	}
-
-	return res, nil
-}
-
-// 锁定会议室:/etc/scripts/conference.sh lock  会议室号码
-func LockMeetMe(confnum string) (err error) {
-	_, _, err = utils.ExecCmd("/etc/scripts/conference.sh", "lock", confnum)
-	if err != nil {
-		return err
-	}
-	return nil
-}
-
-// 解除锁定会议室:/etc/scripts/conference.sh unlock  会议室号码
-func UnLockMeetMe(confnum string) (err error) {
-	_, _, err = utils.ExecCmd("/etc/scripts/conference.sh", "unlock", confnum)
-	if err != nil {
-		return err
-	}
-	return nil
-}
-
-// 结束会议:/etc/scripts/conference.sh endconf  会议室号码
-func EndMeetMe(number string) (err error) {
-	_, _, err = utils.ExecCmd("/etc/scripts/conference.sh", "endconf", number)
-	if err != nil {
-		return err
-	}
-	return nil
-}
-
-// 邀请会议:/etc/scripts/conference.sh invite 会议室号码
-func IviteMeetMe(conference, number string, dialplan string, myExtension string) (err error) {
-	_, _, err = utils.ExecCmd("/etc/scripts/conference.sh", "invite", conference, number, dialplan, myExtension)
-	if err != nil {
-		return err
-	}
-	return nil
-}

+ 0 - 81
internal/app/ami/action/park.go

@@ -1,81 +0,0 @@
-package action
-
-import (
-	"errors"
-	amiModel "pbx-api-gin/internal/app/ami/model"
-	"pbx-api-gin/pkg/lfshook"
-
-	"github.com/mitchellh/mapstructure"
-)
-
-func Park(extension, lot string) (err error) {
-	channel, err := GetChannelByExten(extension)
-	if err != nil {
-		return err
-	}
-	action := map[string]string{
-		"Action":  "Park",
-		"Channel": channel,
-	}
-	if lot != "" {
-		action["Parkinglot"] = lot
-	}
-
-	res, events, err := AminInstance.Send(action)
-	if err != nil {
-		return err
-	}
-	lfshook.NewLogger().Infof("Park %+v %+v", res, events)
-	if res["Response"] != "Success" {
-		return errors.New(res["Message"])
-	}
-	return nil
-}
-
-func ParkedCalls(lot string) (result []*amiModel.ParkedCall, err error) {
-	action := map[string]string{
-		"Action":     "ParkedCalls",
-		"Parkinglot": lot,
-	}
-	res, events, err := AminInstance.Send(action)
-	if err != nil {
-		return nil, err
-	}
-	if res["Response"] != "Success" {
-		return result, errors.New(res["Message"])
-	}
-
-	result = make([]*amiModel.ParkedCall, 0)
-	for _, event := range events {
-		if event.Data["Event"] == "ParkedCall" {
-			call := &amiModel.ParkedCall{}
-			mapstructure.Decode(event.Data, call)
-			result = append(result, call)
-		}
-	}
-
-	return result, nil
-}
-
-func Parkinglots() (result []*amiModel.Parkinglot, err error) {
-	action := map[string]string{
-		"Action": "Parkinglots",
-	}
-	res, events, err := AminInstance.Send(action)
-	if err != nil {
-		return nil, err
-	}
-	if res["Response"] != "Success" {
-		return nil, errors.New(res["Message"])
-	}
-
-	result = make([]*amiModel.Parkinglot, 0)
-	for _, event := range events {
-		if event.Data["Event"] == "Parkinglot" {
-			lot := &amiModel.Parkinglot{}
-			mapstructure.Decode(event.Data, lot)
-			result = append(result, lot)
-		}
-	}
-	return result, nil
-}

+ 9 - 13
internal/app/ami/model/cdr.go

@@ -24,17 +24,13 @@ type Cdr struct {
 }
 
 type RcdConf struct {
-	PadRcdEnable      int `xorm:"pad_rcd_enable" json:"padRcdEnable"`
-	PadRcdStorageDays int `xorm:"pad_rcdstorage_days" json:"padRcdStorageDays"`
-	PaRcdStorageDays  int `xorm:"pa_rcdstorage_days" json:"paRcdStorageDays"`
-	CpaRcdStorageDays int `xorm:"cpa_rcdstorage_days" json:"cpaRcdStorageDays"`
-	OpaRcdStorageDays int `xorm:"opa_rcdstorage_days" json:"opaRcdStorageDays"`
-	PadRcdDelDays     int `xorm:"pad_rcd_del" json:"pad_rcd_del_days"`
-	PaRcdDelDays      int `xorm:"pa_rcd_del" json:"pa_rcd_del_days"`
-	CpaRcdDelDays     int `xorm:"cpa_rcd_del" json:"cpa_rcd_del_days"`
-	OpaRcdDelDays     int `xorm:"opa_rcd_del" json:"opa_rcd_del_days"`
-}
-
-func (*RcdConf) TableName() string {
-	return "t_record_conf"
+	PadRcdEnable      string `json:"padRcdEnable"`
+	PadRcdStorageDays string `json:"padRcdStorageDays"`
+	PaRcdStorageDays  string `json:"paRcdStorageDays"`
+	CpaRcdStorageDays string `json:"cpaRcdStorageDays"`
+	OpaRcdStorageDays string `json:"opaRcdStorageDays"`
+	PadRcdDelDays     string `json:"pad_rcd_del_days"`
+	PaRcdDelDays      string `json:"pa_rcd_del_days"`
+	CpaRcdDelDays     string `json:"cpa_rcd_del_days"`
+	OpaRcdDelDays     string `json:"opa_rcd_del_days"`
 }

+ 0 - 80
internal/app/ami/model/meetme.go

@@ -1,80 +0,0 @@
-package model
-
-import (
-	"encoding/json"
-	"pbx-api-gin/pkg/utils"
-)
-
-type MeetMeListRooms struct {
-	Activity   string `json:"activity"`
-	Conference string `json:"conference"`
-	Creation   string `json:"creation"`
-	Event      string `json:"event"`
-	Locked     string `json:"locked"`
-	Marked     string `json:"marked"`
-	Parties    string `json:"parties"`
-}
-
-type MeetmeList struct {
-	Admin             string `json:"admin"`
-	CallerIDName      string `json:"callerIDName"`
-	CallerIDNum       string `json:"callerIDNumber"`
-	Channel           string `json:"channel"`
-	Conference        string `json:"conference"`
-	ConnectedLineName string `json:"connectedLineName"`
-	ConnectedLineNum  string `json:"connectedLineNumber"`
-	Event             string `json:"event"`
-	MarkedUser        string `json:"markedUser"`
-	Muted             string `json:"muted"`
-	Role              string `json:"role"`
-	Talking           string `json:"talking"`
-	UserNumber        string `json:"user"`
-}
-
-func (data *MeetmeList) MarshalJSON() ([]byte, error) {
-	type Alias MeetmeList
-
-	muted := utils.YesToOn(data.Muted)
-	talking := utils.YesToOn(data.Talking)
-
-	return json.Marshal(&struct {
-		Talking string `json:"talking"`
-		Muted   string `json:"muted"`
-		*Alias
-	}{
-		Muted:   muted,
-		Talking: talking,
-		Alias:   (*Alias)(data),
-	})
-}
-
-type MeetmeEnd struct {
-	Event     string `json:"event"`
-	Meetme    string `json:"meetme"`
-	Timestamp string `json:"timestamp"`
-}
-
-type Meetme struct {
-	CallerIDName      string `json:"callerIDName"`
-	CallerIDNum       string `json:"callerIDNumber"`
-	Channel           string `json:"channel"`
-	ChannelState      string `json:"channelState"`
-	ConnectedLineName string `json:"connectedLineName"`
-	ConnectedLineNum  string `json:"connectedLineNumber"`
-	Duration          string `json:"duration"`
-	Context           string `json:"context"`
-	Event             string `json:"event"`
-	Exten             string `json:"exten"`
-	Meetme            string `json:"meetme"`
-	Priority          string `json:"priority"`
-	Privilege         string `json:"privilege"`
-	Timestamp         string `json:"timestamp"`
-	User              string `json:"user"`
-	Status            string `json:"status"`
-}
-
-type MeetmeJoin Meetme
-type MeetmeLeave Meetme
-type MeetmeMute Meetme
-type MeetmeTalkRequest Meetme
-type MeetmeTalking Meetme

+ 0 - 210
internal/app/ami/model/park.go

@@ -1,210 +0,0 @@
-package model
-
-type Parkinglot struct {
-	Name       string `json:"name"`
-	StartSpace string `json:"startSpace"`
-	StopSpace  string `json:"stopSpace"`
-	Timeout    string `json:"timeout"`
-}
-
-// Event:ParkedCall
-// ParkeeAccountCode:
-// ParkeeCallerIDName:106
-// ParkeeCallerIDNum:106
-// ParkeeChannel:PJSIP/106-00000171
-// ParkeeChannelState:6
-// ParkeeChannelStateDesc:Up
-// ParkeeConnectedLineName:120
-// ParkeeConnectedLineNum:120
-// ParkeeContext:macro-stdexten
-// ParkeeExten:s
-// ParkeeLanguage:en
-// ParkeeLinkedid:1621821838.695
-// ParkeePriority:26
-// ParkeeUniqueid:1621821838.695
-// ParkerDialString:PJSIP/106
-// ParkingDuration:113
-// ParkingSpace:41
-// ParkingTimeout:487
-// Parkinglot:default
-
-type ParkedCall struct {
-	Event                   string `json:"event"`
-	ParkeeCallerIDName      string `json:"parkeeCallerIDName"`
-	ParkeeCallerIDNum       string `json:"parkeeCallerIDNumber"`
-	ParkeeChannel           string `json:"parkeeChannel"`
-	ParkeeChannelState      string `json:"parkeeChannelState"`
-	ParkeeChannelStateDesc  string `json:"parkeeChannelStateDesc"`
-	ParkeeConnectedLineName string `json:"parkeeConnectedLineName"`
-	ParkeeConnectedLineNum  string `json:"parkeeConnectedLineNumber"`
-	ParkeeContext           string `json:"parkeeContext"`
-	ParkeeExten             string `json:"parkeeExten"`
-	ParkeeLanguage          string `json:"parkeeLanguage"`
-	ParkeeLinkedid          string `json:"parkeeLinkedid"`
-	ParkeePriority          string `json:"parkeePriority"`
-	ParkeeUniqueid          string `json:"parkeeUniqueid"`
-	ParkerDialString        string `json:"parkerDialString"`
-	ParkingDuration         string `json:"parkingDuration"`
-	ParkingSpace            string `json:"parkingSpace"`
-	ParkingTimeout          string `json:"parkingTimeout"`
-	Parkinglot              string `json:"parkinglot"`
-}
-
-// Event:UnParkedCall
-// ParkeeAccountCode: ParkeeCallerIDName:106
-// ParkeeCallerIDNum:106
-// ParkeeChannel:PJSIP/106-000001a0
-// ParkeeChannelState:6
-// ParkeeChannelStateDesc:Up
-// ParkeeConnectedLineName:120
-// ParkeeConnectedLineNum:120
-// ParkeeContext:macro-stdexten
-// ParkeeExten:s
-// ParkeeLanguage:en
-// ParkeeLinkedid:1621835298.828
-// ParkeePriority:26
-// ParkeeUniqueid:1621835298.828
-// ParkerDialString:PJSIP/106
-// ParkingDuration:12
-// ParkingSpace:41
-// ParkingTimeout:588
-// Parkinglot:default
-// Privilege:call,all
-// RetrieverAccountCode:
-// RetrieverCallerIDName:119
-// RetrieverCallerIDNum:119
-// RetrieverChannel:PJSIP/119-000001a2
-// RetrieverChannelState:6
-// RetrieverChannelStateDesc:Up
-// RetrieverConnectedLineName:<unknown>
-// RetrieverConnectedLineNum:<unknown>
-// RetrieverContext:DialPlan1
-// RetrieverExten:41
-// RetrieverLanguage:en
-// RetrieverLinkedid:1621835340.830
-// RetrieverPriority:1
-// RetrieverUniqueid:1621835340.830
-// Timestamp:1621835340.214037
-
-type UnParkedCall struct {
-	Event                   string `json:"event"`
-	ParkeeCallerIDName      string `json:"parkeeCallerIDName"`
-	ParkeeCallerIDNum       string `json:"parkeeCallerIDNumber"`
-	ParkeeChannel           string `json:"parkeeChannel"`
-	ParkeeChannelState      string `json:"parkeeChannelState"`
-	ParkeeChannelStateDesc  string `json:"parkeeChannelStateDesc"`
-	ParkeeConnectedLineName string `json:"parkeeConnectedLineName"`
-	ParkeeConnectedLineNum  string `json:"parkeeConnectedLineNumber"`
-	ParkeeContext           string `json:"parkeeContext"`
-	ParkeeExten             string `json:"parkeeExten"`
-	ParkeeLanguage          string `json:"parkeeLanguage"`
-	ParkeeLinkedid          string `json:"parkeeLinkedid"`
-	ParkeePriority          string `json:"parkeePriority"`
-	ParkeeUniqueid          string `json:"parkeeUniqueid"`
-	ParkerDialString        string `json:"parkerDialString"`
-	ParkingDuration         string `json:"parkingDuration"`
-	ParkingSpace            string `json:"parkingSpace"`
-	ParkingTimeout          string `json:"parkingTimeout"`
-	Parkinglot              string `json:"parkinglot"`
-}
-
-// Event: ParkedCallTimeOut
-// ParkeeAccountCode: <value>
-// ParkeeCallerIDName: <value>
-// ParkeeCallerIDNum: <value>
-// ParkeeChannel: <value>
-// ParkeeChannelState: <value>
-// ParkeeChannelStateDesc: <value>
-// ParkeeConnectedLineName: <value>
-// ParkeeConnectedLineNum: <value>
-// ParkeeContext: <value>
-// ParkeeExten: <value>
-// ParkeeLanguage: <value>
-// ParkeeLinkedid: <value>
-// ParkeePriority: <value>
-// ParkeeUniqueid: <value>
-// ParkerAccountCode: <value>
-// ParkerCallerIDName: <value>
-// ParkerCallerIDNum: <value>
-// ParkerChannel: <value>
-// ParkerChannelState: <value>
-// ParkerChannelStateDesc: <value>
-// ParkerConnectedLineName: <value>
-// ParkerConnectedLineNum: <value>
-// ParkerContext: <value>
-// ParkerDialString: <value>
-// ParkerExten: <value>
-// ParkerLanguage: <value>
-// ParkerLinkedid: <value>
-// ParkerPriority: <value>
-// ParkerUniqueid: <value>
-// ParkingDuration: <value>
-// ParkingSpace: <value>
-// ParkingTimeout: <value>
-// Parkinglot: <value>
-type ParkedCallTimeOut struct {
-	Event                   string `json:"event"`
-	ParkeeCallerIDName      string `json:"parkeeCallerIDName"`
-	ParkeeCallerIDNum       string `json:"parkeeCallerIDNumber"`
-	ParkeeChannel           string `json:"parkeeChannel"`
-	ParkeeChannelState      string `json:"parkeeChannelState"`
-	ParkeeChannelStateDesc  string `json:"parkeeChannelStateDesc"`
-	ParkeeConnectedLineName string `json:"parkeeConnectedLineName"`
-	ParkeeConnectedLineNum  string `json:"parkeeConnectedLineNumber"`
-	ParkeeContext           string `json:"parkeeContext"`
-	ParkeeExten             string `json:"parkeeExten"`
-	ParkeeLanguage          string `json:"parkeeLanguage"`
-	ParkeeLinkedid          string `json:"parkeeLinkedid"`
-	ParkeePriority          string `json:"parkeePriority"`
-	ParkeeUniqueid          string `json:"parkeeUniqueid"`
-	ParkerDialString        string `json:"parkerDialString"`
-	ParkingDuration         string `json:"parkingDuration"`
-	ParkingSpace            string `json:"parkingSpace"`
-	ParkingTimeout          string `json:"parkingTimeout"`
-	Parkinglot              string `json:"parkinglot"`
-}
-
-// Event: ParkedCallGiveUp
-// ParkeeAccountCode:
-// ParkeeCallerIDName: 106
-// ParkeeCallerIDNum: 106
-// ParkeeChannel: PJSIP/106-00000191
-// ParkeeChannelState: 6
-// ParkeeChannelStateDesc: Up
-// ParkeeConnectedLineName: 120
-// ParkeeConnectedLineNum: 120
-// ParkeeContext: macro-stdexten
-// ParkeeExten: s
-// ParkeeLanguage: en
-// ParkeeLinkedid: 1621827325.781
-// ParkeePriority: 26
-// ParkeeUniqueid: 1621827325.781
-// ParkerDialString: PJSIP/106
-// ParkingDuration: 48
-// ParkingSpace: 41
-// ParkingTimeout: 552
-// Parkinglot: default
-// Privilege: call,all
-// Timestamp: 1621827421.460917
-
-type ParkedCallGiveUp struct {
-	Event                   string `json:"event"`
-	ParkeeCallerIDName      string `json:"parkeeCallerIDName"`
-	ParkeeCallerIDNum       string `json:"parkeeCallerIDNumber"`
-	ParkeeChannel           string `json:"parkeeChannel"`
-	ParkeeChannelState      string `json:"parkeeChannelState"`
-	ParkeeChannelStateDesc  string `json:"parkeeChannelStateDesc"`
-	ParkeeConnectedLineName string `json:"parkeeConnectedLineName"`
-	ParkeeConnectedLineNum  string `json:"parkeeConnectedLineNumber"`
-	ParkeeContext           string `json:"parkeeContext"`
-	ParkeeExten             string `json:"parkeeExten"`
-	ParkeeLanguage          string `json:"parkeeLanguage"`
-	ParkeeLinkedid          string `json:"parkeeLinkedid"`
-	ParkeePriority          string `json:"parkeePriority"`
-	ParkeeUniqueid          string `json:"parkeeUniqueid"`
-	ParkerDialString        string `json:"parkerDialString"`
-	ParkingDuration         string `json:"parkingDuration"`
-	ParkingSpace            string `json:"parkingSpace"`
-	ParkingTimeout          string `json:"parkingTimeout"`
-	Parkinglot              string `json:"parkinglot"`
-}

+ 0 - 130
internal/app/ami/model/sip.go

@@ -1,130 +0,0 @@
-package model
-
-import "encoding/json"
-
-type Sysinfo struct {
-	Name  string `xorm:"name" json:"name"`
-	Value string `xorm:"value" json:"value"`
-}
-
-func (*Sysinfo) TableName() string {
-	return "t_sysinfo"
-}
-
-// Event: EndpointList
-// ObjectType: endpoint
-// ObjectName: 899
-// Transport:
-// Aor: 899
-// Auths: 899
-// OutboundAuths:
-// Contacts:
-// DeviceState: Unavailable
-// ActiveChannels:
-type Extension struct {
-	Extension string `xorm:"exten" json:"exten"`
-	ExtType   string `xorm:"dev_type" json:"extType"`
-	PaType    string `xorm:"pa_type" json:"paType"`
-	Priority  string `xorm:"priority" json:"priority"`
-	Special   int    `xorm:"special_pa" json:"special"`
-	Status    string `xorm:"status" json:"status"`
-	Remark    string `xorm:"remark" json:"remark"`
-}
-
-func (*Extension) TableName() string {
-	return "t_extension"
-}
-
-type EndpointList struct {
-	Event          string `json:"Event"`
-	ObjectType     string `json:"ObjectType"`
-	ObjectName     string `json:"ObjectName"`
-	Transport      string `json:"Transport"`
-	Aor            string `json:"Aor"`
-	Auths          string `json:"Auths"`
-	OutboundAuths  string `json:"OutboundAuths"`
-	Contacts       string `json:"Contacts"`
-	DeviceState    string `json:"DeviceState"`
-	ActiveChannels string `json:"ActiveChannels"`
-}
-
-// Event: PeerEntry
-// Channeltype: SIP
-// ObjectName: 875
-// ChanObjectType: peer
-// IPaddress: -none-
-// IPport: 0
-// Dynamic: yes
-// AutoForcerport: no
-// Forcerport: yes
-// AutoComedia: no
-// Comedia: yes
-// VideoSupport: no
-// TextSupport: no
-// ACL: no
-// Status: UNKNOWN
-// RealtimeDevice: no
-// Description:
-// Accountcode:
-type PeerEntry struct {
-	Event          string `json:"Event"`
-	Channeltype    string `json:"Channeltype"`
-	ObjectName     string `json:"ObjectName"`
-	ChanObjectType string `json:"ChanObjectType"`
-	IPaddress      string `json:"IPaddress"`
-	IPport         string `json:"IPport"`
-	Dynamic        string `json:"Dynamic"`
-	AutoForcerport string `json:"AutoForcerport"`
-	Forcerport     string `json:"Forcerport"`
-	AutoComedia    string `json:"AutoComedia"`
-	Status         string `json:"Status"`
-	RealtimeDevice string `json:"RealtimeDevice"`
-}
-
-// Event: ContactList
-// ObjectType: contact
-// ObjectName: 120;@199f77999ab9abe1ec7fbe48e0b51053
-// ViaAddr: 192.168.17.183
-// QualifyTimeout: 30.000000
-// CallId: DBnHD24ea-7MTKkYj9ewfafR0KAmWv4z
-// RegServer:
-// PruneOnBoot: no
-// Path:
-// Endpoint: 120
-// ViaPort: 60442
-// AuthenticateQualify: no
-// Uri: sip:120@192.168.17.183:60442;ob
-// QualifyFrequency: 300
-// UserAgent: Telephone 1.2.6
-// ExpirationTime: 1620818122
-// OutboundProxy:
-// Status: Reachable
-// RoundtripUsec: 85040
-type ContactList struct {
-	Event         string `json:"Event"`
-	ObjectName    string `json:"ObjectName"`
-	ViaAddr       string `json:"ViaAddr"`
-	Uri           string `json:"Uri"`
-	RoundtripUsec string `json:"RoundtripUsec"`
-}
-
-func (list ContactList) String() string {
-	data, _ := json.Marshal(list)
-	return string(data)
-}
-
-// 分机状态
-// Event: ExtensionStatus
-// Exten: 118
-// Context: channelhints_exten
-// Hint: PJSIP/118,CustomPresence:118
-// Status: 4
-// StatusText: Unavailable
-type ExtensionStatus struct {
-	Event      string `json:"event"`
-	Exten      string `json:"extension"`
-	Context    string `json:"context"`
-	Hint       string `json:"hint"`
-	Status     string `json:"status"`
-	StatusText string `json:"statusText"`
-}

+ 0 - 15
internal/app/ami/model/userevent.go

@@ -1,15 +0,0 @@
-package model
-
-type SetDND struct {
-	Context   string `json:"context"`
-	Exten     string `json:"exten"`
-	UserEvent string `json:"event"`
-	DNDStatus string `json:"dndStatus"`
-}
-
-type WakeUpStatus struct {
-	Status            string `json:"status"`
-	ResTime           string `json:"resTime"`
-	ConnectedLineName string `json:"connectedLineName"`
-	ConnectedLineNum  string `json:"connectedLineNum"`
-}

+ 1 - 2
internal/app/index.go

@@ -4,7 +4,6 @@ import (
 	"fmt"
 	"os/exec"
 	"pbx-api-gin/internal/app/ami/action"
-	"pbx-api-gin/internal/app/mysql"
 	"pbx-api-gin/internal/app/stc"
 	"pbx-api-gin/internal/app/stc/active"
 	"pbx-api-gin/internal/app/stc/priority"
@@ -17,7 +16,7 @@ import (
 
 func StartApp() {
 	//init mysql
-	mysql.CreateDBInstance()
+	//mysql.CreateDBInstance()
 
 	//Get cab number acording to IP
 	IP, err := getIPByCommand()

+ 0 - 53
internal/app/mysql/index.go

@@ -1,53 +0,0 @@
-package mysql
-
-import (
-	"fmt"
-	"os"
-	"pbx-api-gin/internal/pkg/configs"
-	"pbx-api-gin/pkg/lfshook"
-	"syscall"
-
-	_ "github.com/go-sql-driver/mysql"
-	"github.com/sirupsen/logrus"
-	"xorm.io/xorm"
-	"xorm.io/xorm/log"
-)
-
-var DBOrmInstance *xorm.Engine
-
-func CreateDBInstance() {
-	var err error
-	// DBOrmInstance, err = xorm.NewEngine("sqlite3", "playcall.db")
-	url := fmt.Sprintf("%s:%s@tcp(%s:3306)/%s?charset=utf8",
-		configs.ConfigGlobal.MysqlDBUser,
-		// "coovox_admin",
-		configs.ConfigGlobal.MysqlDBSecret,
-		// "ZycooCoovoxDba42",
-		configs.ConfigGlobal.MysqlDBHost,
-		configs.ConfigGlobal.MysqlDBName,
-	)
-	lfshook.NewLogger().Infof("mysql url %s", url)
-	DBOrmInstance, err = xorm.NewEngine("mysql", url)
-	if err != nil {
-		lfshook.NewLogger().Panic(err)
-		return
-	}
-	err = DBOrmInstance.Ping()
-	if err != nil {
-		lfshook.NewLogger().Error(err)
-		syscall.Kill(syscall.Getpid(), syscall.SIGINT)
-		return
-	}
-	//DBOrmInstance.ShowSQL(true)
-	if configs.ConfigGlobal.LogLevel >= logrus.DebugLevel {
-		DBOrmInstance.ShowSQL(true)
-	} else {
-		info, err := os.Open(configs.ConfigGlobal.LogInfoPath)
-		if err != nil {
-			println(err.Error())
-			return
-		}
-		DBOrmInstance.SetLogger(log.NewSimpleLogger(info))
-	}
-
-}

+ 104 - 116
internal/app/stc/broadcast/stc-broadcast.go

@@ -7,9 +7,9 @@ import (
 	"io"
 	"net"
 	"net/http"
+	"os"
 	"pbx-api-gin/internal/app/ami/action"
 	"pbx-api-gin/internal/app/ami/model"
-	"pbx-api-gin/internal/app/mysql"
 	"pbx-api-gin/internal/app/stc/active"
 	msgdata "pbx-api-gin/internal/app/stc/data"
 	"pbx-api-gin/internal/app/stc/priority"
@@ -18,9 +18,10 @@ import (
 	"strconv"
 	"sync"
 	"time"
-)
 
-var Pacus = []string{"2111", "2121", "2131", "2141", "2151", "2161", "2171", "2181"}
+	"github.com/sirupsen/logrus"
+	"gopkg.in/ini.v1"
+)
 
 func HandleStcCmd(ctx context.Context, conn net.Conn) {
 
@@ -80,62 +81,71 @@ func processPacket(packet []byte) {
 	}
 
 	switch packet[5] {
-	case 0x01:
+	case 0x01: //heartbeat
 		break
 
 	case 0x02: // STN
 		if priority.CheckPriority("STN") {
-			action.HangupAll()
+			//action.HangupICP()
+			action.HangupRunningTask()
 			StationAnn(packet)
 		}
 
 	case 0x05: // SPC
-		if priority.CheckPriority("SPC-TMS") {
-			action.HangupAll()
+		if priority.CheckPriority("SPC") {
+			//action.HangupICP()
+			action.HangupRunningTask()
 			SpecialAnn(packet)
 		}
 
 	case 0x06: // EMG
-		EmgMsg(packet)
-
+		if priority.CheckPriority("EMG") {
+			//action.HangupICP()
+			action.HangupRunningTask()
+			EmgMsg(packet)
+		}
 	case 0x07: // STOP
 		AnnStop([4]byte{packet[8], packet[9], packet[10], packet[11]})
 
 	case 0x08: // DCS
 		if priority.CheckPriority("DCS") {
-			action.HangupAll()
+			//action.HangupICP()
+			action.HangupRunningTask()
 			DcsAnn(packet)
 		}
 
 	case 0x09: // SELF CHECK
 		if priority.CheckPriority("CHK") {
-			action.HangupAll()
+			//action.HangupICP()
+			action.HangupRunningTask()
 			SelfCheck(packet)
 		}
 
-	case 0x10: // SELF CHECK
-		if priority.CheckPriority("CHK") {
-			action.HangupAll()
+	case 0x10: // VOLUME Adjust
+		if priority.CheckPriority("VOL") {
+			//action.HangupICP()
+			action.HangupRunningTask()
 			VolumeAdjust(packet)
 		}
 
-	case 0x0a:
+	case 0x0a: //TMS answer PAD
 		if priority.CheckPriority("PAD-TMS") {
-			action.HangupAll()
 			//AlarmHandleTMS(packet)
+			//action.HangupICP()
+			action.HangupRunningTask()
 			AlarmHandleICP(packet) //for test
 		}
 
-	case 0x0b:
-		AlarmHoldResetAll(packet[8])
+	case 0x0b: // reset all PAD
+		AlarmHoldResetAll(packet[8]) // reset all pad
 
-	case 0x0c:
-		RecordStorageConf(packet[8:])
+	case 0x0c: // recored config
+		RecordStorageConf(packet[8:]) // RCD setting
 
-	case 0x0d:
+	case 0x0d: // ICP answer PAD
 		if priority.CheckPriority("PAD-ICP") {
-			action.HangupAll()
-			AlarmHandleICP(packet)
+			//action.HangupICP()
+			action.HangupRunningTask()
 		}
 
 	default:
@@ -156,10 +166,6 @@ func StationAnn(data []byte) (err error) {
 	//set spc voice tag
 	priority.SpecialVoice = specialVoice
 
-	//Pa status report
-	priority.RunningType, _ = strconv.Atoi(priority.Priority.STN)
-	alstatus.PaStatus("", "STN", "start")
-
 	action.PlaybackPacu(filename, int(cycleCount), int(delay), "STN")
 	return nil
 }
@@ -235,10 +241,6 @@ func SpecialAnn(data []byte) {
 
 	filename := msgdata.SubstrByRune(string(data[11:]), 0, datalen-4)
 
-	//Pa status report
-	priority.RunningType, _ = strconv.Atoi(priority.Priority.SPCTMS)
-	alstatus.PaStatus("", "SPC", "start")
-
 	if int(cycleCount) == 255 {
 		action.PlaybackPacu(filename, 9999999, int(delay), "SPC")
 	} else {
@@ -254,10 +256,6 @@ func EmgMsg(data []byte) {
 
 	filename := msgdata.SubstrByRune(string(data[11:]), 0, datalen-4)
 
-	//Pa status report
-	priority.RunningType, _ = strconv.Atoi(priority.Priority.EMGTMS)
-	alstatus.PaStatus("", "EMG", "start")
-
 	if int(cycleCount) == 255 {
 		action.PlaybackPacu(filename, 9999999, int(delay), "EMG")
 	} else {
@@ -268,25 +266,34 @@ func EmgMsg(data []byte) {
 // 停止指定类型广播
 func AnnStop(data [4]byte) {
 
-	PaType := ""
-
+	//PaType := ""
+	lfshook.NewLogger().Logger.Infof("==priority.RunningType:%s======priority.RunningPATaskChan:%s", priority.RunningType, priority.RunningPATaskChan)
 	switch data[0] {
 	case 0x03:
-		PaType = "DCS"
+		if priority.RunningType == "DCS" {
+			action.HangupRunningTask()
+		}
 	case 0x04:
-		PaType = "EMG"
+		if priority.RunningType == "EMG" {
+			action.HangupRunningTask()
+		}
 	case 0x07:
-		PaType = "SPC"
+		if priority.RunningType == "SPC" {
+			action.HangupRunningTask()
+		}
 	case 0x08:
-		PaType = "STN"
+		if priority.RunningType == "STN" {
+			action.HangupRunningTask()
+		}
 	case 0x09:
-		PaType = "CHK"
+		if priority.RunningType == "CHK" {
+			action.HangupRunningTask()
+		}
+	case 0x10:
+		if priority.RunningType == "VOL" {
+			action.HangupRunningTask()
+		}
 	}
-
-	priority.RunningType = 0
-	alstatus.PaStatus("", PaType, "end")
-	action.HangupAll()
-
 }
 
 // DCS 语音
@@ -297,10 +304,6 @@ func DcsAnn(data []byte) {
 
 	filename := msgdata.SubstrByRune(string(data[11:]), 0, datalen-4)
 
-	//Pa status report
-	priority.RunningType, _ = strconv.Atoi(priority.Priority.DCS)
-	alstatus.PaStatus("", "DCS", "start")
-
 	if int(cycleCount) == 255 {
 		action.PlaybackPacu(filename, 9999999, int(delay), "DCS")
 	} else {
@@ -320,15 +323,12 @@ func VolumeAdjust(data []byte) {
 
 	switch check {
 	case 0x01: //start
-
-		//Pa status report
-		priority.RunningType, _ = strconv.Atoi(priority.Priority.CHK)
-		alstatus.PaStatus("", "VOL", "start")
 		action.PlaybackPacu(filename, int(cycleCount), int(delay), "VOL")
+
 	case 0x02: //stop
 
 		alstatus.PaStatus("", "VOL", "end")
-		action.HangupAll()
+		action.HangupAllExcept("")
 	}
 }
 
@@ -345,16 +345,13 @@ func SelfCheck(data []byte) {
 	switch check {
 	case 0x01: //start
 
-		//Pa status report
-		priority.RunningType, _ = strconv.Atoi(priority.Priority.CHK)
-		alstatus.PaStatus("", "CHK", "start")
 		action.PlaybackPacu(filename, int(cycleCount), int(delay), "CHK")
 	case 0x02: //stop
 
 		//Pa status report
-		priority.RunningType = 0
+		//priority.RunningTypePriority = 0
 		alstatus.PaStatus("", "CHK", "end")
-		action.HangupAll()
+		action.HangupAllExcept("")
 	}
 }
 
@@ -413,16 +410,13 @@ func AlarmHandleICP(data []byte) {
 		if err != nil {
 			lfshook.NewLogger().Info(err)
 		}
-		action.Hangup("2311") //1 车接听
-		action.Hangup("2381") //8 车接听
+		action.HangupICP()
 
 	case 0x03: //hangup
 		//NotifyPaiu(exten, "hangup")
-		/*		action.Hangup(exten)  //Pad
-				action.Hangup("2311") //1 车接听
-				action.Hangup("2381") //8 车接听
-		*/
-		action.HangupAll()
+		action.Hangup(exten) //Pad
+		action.HangupICP()
+
 	}
 }
 
@@ -460,7 +454,7 @@ func AlarmHandleTMS(data []byte) {
 
 		priority.ICPAnswer = 1
 		lfshook.NewLogger().Logger.Infof("================TMS Answer PAD:%s===PACU:%s==========", exten, PacuNum)
-		if action.ExtenStatus(PacuNum) == "Idle" {
+		if alstatus.GetExtenStat(PacuNum) == "Idle" {
 			if active.CabNum == "1" && active.Actived {
 				action.Dial("0403", PacuNum, "default", PacuNum, exten, "1") // PACU dial ICP1
 				//goto ami event BridgeEnter, ICP8 whisper ICP1
@@ -484,11 +478,9 @@ func AlarmHandleTMS(data []byte) {
 
 	case 0x03: //hangup
 		//NotifyPaiu(exten, "hangup")
-		/*action.Hangup(exten)  //PAD
+		action.Hangup(exten)  //PAD
 		action.Hangup("2311") //1 车接听
 		action.Hangup("2381") //8 车接听
-		*/
-		action.HangupAll()
 	}
 }
 
@@ -526,67 +518,63 @@ func NotifyPaiu(Exten, Action string) {
 }
 
 // 挂断所有报警器
-func AlarmHoldResetAll(data byte) {
-
-	var AlarmExts []model.Extension
-
-	er := mysql.DBOrmInstance.Where("dev_type = ? and status != ?", "PAIU", "Idle").Find(&AlarmExts)
-	if er != nil {
-		lfshook.NewLogger().Logger.Infof("update special voice to exten err : %+v", er.Error())
-	}
+func AlarmHoldResetAll(handler byte) {
 
 	//all hold
-	if data == 1 {
-		for _, ext := range AlarmExts {
-			err := action.RedirectInQueue(ext.Extension, "0300", "default", "1")
-			if err != nil {
-				lfshook.NewLogger().Info(err)
-			}
-		}
 
-		if active.CabNum == "1" && active.Actived {
-			action.Hangup("2311")                   //1 车接听
-			alstatus.AlarmStatus("0000", "allhold") //send all hold status
-		} else if active.CabNum == "8" && active.Actived {
-			action.Hangup("2381")                   //8 车接听
-			alstatus.AlarmStatus("0000", "allhold") // send all hold status
-		}
-	} else if data == 2 { //all reset
-		for _, ext := range AlarmExts {
-			action.Hangup(ext.Extension)
-		}
+	//hangup all actived PAD
+	for _, ext := range action.Pads {
+		action.Hangup(ext)
+	}
 
-		if active.CabNum == "1" && active.Actived {
-			action.Hangup("2311")                    //1 车接听
-			alstatus.AlarmStatus("0000", "allreset") //send all reset status
-		} else if active.CabNum == "8" && active.Actived {
-			action.Hangup("2381")                    //8 车接听
-			alstatus.AlarmStatus("0000", "allreset") // send all reset status
-		}
+	if active.CabNum == "1" && active.Actived {
+		action.Hangup("2311") //1 车接听
+		action.Hangup("1411")
+		alstatus.AlarmStatus("0000", "allreset") //send all reset status
+	} else if active.CabNum == "8" && active.Actived {
+		action.Hangup("2381") //8 车接听
+		action.Hangup("1481")
+		alstatus.AlarmStatus("0000", "allreset") // send all reset status
 	}
+
 }
 
 func RecordStorageConf(data []byte) {
 
 	var info model.RcdConf
 
-	info.PadRcdEnable = int(data[0])
-	info.PadRcdStorageDays = int(data[1])
-	info.PaRcdStorageDays = int(data[2])
-	info.CpaRcdStorageDays = int(data[3])
+	info.PadRcdEnable = strconv.Itoa(int(data[0]))
+	info.PadRcdStorageDays = strconv.Itoa(int(data[1]))
+	info.PaRcdStorageDays = strconv.Itoa(int(data[2]))
+	info.CpaRcdStorageDays = strconv.Itoa(int(data[3]))
 
-	info.PadRcdDelDays = int(data[4])
-	info.PaRcdDelDays = int(data[5])
-	info.CpaRcdDelDays = int(data[6])
+	info.PadRcdDelDays = strconv.Itoa(int(data[4]))
+	info.PaRcdDelDays = strconv.Itoa(int(data[5]))
+	info.CpaRcdDelDays = strconv.Itoa(int(data[6]))
 	//info.OpaRcdStorageDays = int(data[7])
 	//info.OpaRcdDelDays = int(data[8])
 
 	//lfshook.NewLogger().Infof("=============Set record Conf : %+v", info)
 
-	//update record config
-	_, er := mysql.DBOrmInstance.AllCols().Update(&info)
-	if er != nil {
-		lfshook.NewLogger().Logger.Infof("update special voice to exten err : %+v", er.Error())
+	filePath := "/etc/asterisk/recording.conf"
+	_, err := os.Stat(filePath)
+	if err != nil {
+		logrus.Error(err)
+		return
 	}
+	iniFile, err := ini.Load(filePath)
+	if err != nil {
+		logrus.Error(err)
+		return
+	}
+
+	iniFile.Section("general").Key("PADRCD").SetValue(info.PadRcdEnable)
+	iniFile.Section("general").Key("PADRCDDAYS").SetValue(info.PadRcdStorageDays)
+	iniFile.Section("general").Key("PARCDDAYS").SetValue(info.PaRcdStorageDays)
+	iniFile.Section("general").Key("CPARCDDAYS").SetValue(info.CpaRcdStorageDays)
+	iniFile.Section("general").Key("PADRCDDELDAYS").SetValue(info.PadRcdDelDays)
+	iniFile.Section("general").Key("PARCDDELDAYS").SetValue(info.PaRcdDelDays)
+	iniFile.Section("general").Key("CPARCDDELDAYS").SetValue(info.CpaRcdDelDays)
+	iniFile.SaveTo(filePath)
 
 }

+ 22 - 16
internal/app/stc/priority/index.go

@@ -2,6 +2,7 @@ package priority
 
 import (
 	"os"
+	"pbx-api-gin/pkg/lfshook"
 	"strconv"
 
 	"github.com/sirupsen/logrus"
@@ -10,8 +11,10 @@ import (
 
 var ICPAnswer = 0
 var OCCAnswer = 0
-var RunningType = 0
+var RunningTypePriority = 0
+var RunningType = ""
 var SpecialVoice = 0
+var RunningPATaskChan = ""
 
 type PriorityAll struct {
 	ManuPa string `json:"manualPa"`
@@ -20,11 +23,12 @@ type PriorityAll struct {
 	PADTMS string `json:"padTms"`
 	PADOCC string `json:"padOcc"`
 	CPA    string `json:"cpa"`
-	EMGTMS string `json:"emgTms"`
-	SPCTMS string `json:"spcTms"`
+	EMG    string `json:"emg"`
+	SPC    string `json:"spc"`
 	DCS    string `json:"dcs"`
 	STN    string `json:"stn"`
 	CHK    string `json:"chk"`
+	VOL    string `json:"vol"`
 }
 
 var Priority PriorityAll
@@ -42,17 +46,18 @@ func GetPriority() {
 		return
 	}
 
-	Priority.CHK = iniFile.Section("general").Key("ManuPa").Value()
-	Priority.STN = iniFile.Section("general").Key("CabCab").Value()
-	Priority.DCS = iniFile.Section("general").Key("PAD-ICP").Value()
-	Priority.SPCTMS = iniFile.Section("general").Key("PAD-TMS").Value()
-	Priority.EMGTMS = iniFile.Section("general").Key("PAD-OCC").Value()
+	Priority.CHK = iniFile.Section("general").Key("CHK").Value()
+	Priority.STN = iniFile.Section("general").Key("STN").Value()
+	Priority.DCS = iniFile.Section("general").Key("DCS").Value()
+	Priority.SPC = iniFile.Section("general").Key("SPC").Value()
+	Priority.EMG = iniFile.Section("general").Key("EMG").Value()
 	Priority.CPA = iniFile.Section("general").Key("CPA").Value()
-	Priority.PADOCC = iniFile.Section("general").Key("EMG-TMS").Value()
-	Priority.PADTMS = iniFile.Section("general").Key("SPC-TMS").Value()
-	Priority.PADICP = iniFile.Section("general").Key("DCS").Value()
-	Priority.CabCab = iniFile.Section("general").Key("STN").Value()
-	Priority.ManuPa = iniFile.Section("general").Key("CHK").Value()
+	Priority.PADOCC = iniFile.Section("general").Key("PAD-OCC").Value()
+	Priority.PADTMS = iniFile.Section("general").Key("PAD-TMS").Value()
+	Priority.PADICP = iniFile.Section("general").Key("PAD-ICP").Value()
+	Priority.CabCab = iniFile.Section("general").Key("CabCab").Value()
+	Priority.ManuPa = iniFile.Section("general").Key("ManuPa").Value()
+	Priority.VOL = iniFile.Section("general").Key("VOL").Value()
 }
 
 func GetPriorityByKey(key string) string {
@@ -73,13 +78,14 @@ func GetPriorityByKey(key string) string {
 
 // check priority , if the running priority is lowwer than the to run priority
 func CheckPriority(runType string) bool {
+	lfshook.NewLogger().Logger.Infof("=========Check Pri runType:%s====RunningTypePriority:%d============", runType, RunningTypePriority)
 	//check special voice
 	if SpecialVoice == 1 {
 		return false
 	}
 
 	//no any runing task
-	if RunningType == 0 {
+	if RunningTypePriority == 0 {
 		return true
 	}
 
@@ -89,9 +95,9 @@ func CheckPriority(runType string) bool {
 		logrus.Error(err)
 		return false
 	}
-
+	lfshook.NewLogger().Logger.Infof("=========Check Pri GetPriorityByKey:%d============", ret)
 	//if the running task priority is lowwer
-	if ret < RunningType && ret != 0 {
+	if ret < RunningTypePriority && ret != 0 {
 		return true
 	}
 	return false

+ 34 - 2
internal/app/stc/sendstatus/status.go

@@ -8,9 +8,35 @@ import (
 	"pbx-api-gin/internal/app/stc/socket"
 	"pbx-api-gin/pkg/lfshook"
 	"pbx-api-gin/pkg/utils"
+	"sync"
 )
 
-var ExtenStatMap map[string]string
+var (
+	ExtenStatMap map[string]string
+	extenLock    sync.Mutex
+)
+
+func init() {
+	ExtenStatMap = make(map[string]string)
+}
+
+// 安全写入
+func SetExtenStat(key, value string) {
+	extenLock.Lock()
+	defer extenLock.Unlock()
+	ExtenStatMap[key] = value
+}
+
+// 安全读取
+func GetExtenStat(key string) string {
+	extenLock.Lock()
+	defer extenLock.Unlock()
+	val, exists := ExtenStatMap[key]
+	if exists {
+		return val
+	}
+	return ""
+}
 
 func SendToStc(conn net.Conn, data []byte) {
 
@@ -101,7 +127,11 @@ func PaStatus(src string, patype string, operation string) {
 		protocol.Data[0] = 0x01
 	case "2381": //mc8
 		protocol.Data[0] = 0x08
-	case "": //
+	case "1411": //mc8
+		protocol.Data[0] = 0x08
+	case "1481": //mc8
+		protocol.Data[0] = 0x08
+	default: //
 		protocol.Data[0] = 0x00
 	}
 
@@ -125,6 +155,8 @@ func PaStatus(src string, patype string, operation string) {
 		protocol.Data[1] = 0x08
 	case "CHK": //自检
 		protocol.Data[1] = 0x09
+	case "VOL": //自检
+		protocol.Data[1] = 0x10
 	}
 
 	//操作类型

+ 0 - 57
pkg/systeminfo/file.go

@@ -1,57 +0,0 @@
-// Copyright 2017 The Gogs Authors. All rights reserved.
-// Use of this source code is governed by a MIT-style
-// license that can be found in the LICENSE file.
-
-package systeminfo
-
-import (
-	"fmt"
-	"math"
-	"net/http"
-	"strings"
-)
-
-// IsTextFile returns true if file content format is plain text or empty.
-func IsTextFile(data []byte) bool {
-	if len(data) == 0 {
-		return true
-	}
-	return strings.Contains(http.DetectContentType(data), "text/")
-}
-
-func IsImageFile(data []byte) bool {
-	return strings.Contains(http.DetectContentType(data), "image/")
-}
-
-func IsPDFFile(data []byte) bool {
-	return strings.Contains(http.DetectContentType(data), "application/pdf")
-}
-
-func IsVideoFile(data []byte) bool {
-	return strings.Contains(http.DetectContentType(data), "video/")
-}
-
-func logn(n, b float64) float64 {
-	return math.Log(n) / math.Log(b)
-}
-
-func humanateBytes(s uint64, base float64, sizes []string) string {
-	if s < 10 {
-		return fmt.Sprintf("%d B", s)
-	}
-	e := math.Floor(logn(float64(s), base))
-	suffix := sizes[int(e)]
-	val := float64(s) / math.Pow(base, math.Floor(e))
-	f := "%.0f"
-	if val < 10 {
-		f = "%.1f"
-	}
-
-	return fmt.Sprintf(f+" %s", val, suffix)
-}
-
-// FileSize calculates the file size and generate user-friendly string.
-func FileSize(s int64) string {
-	sizes := []string{"B", "KB", "MB", "GB", "TB", "PB", "EB"}
-	return humanateBytes(uint64(s), 1024, sizes)
-}

+ 0 - 90
pkg/systeminfo/index.go

@@ -1,90 +0,0 @@
-package systeminfo
-
-import (
-	"fmt"
-	"runtime"
-	"time"
-)
-
-var initTime = time.Now()
-
-type SystemInfo struct {
-	Uptime       string
-	NumGoroutine int
-
-	// General statistics.
-	MemAllocated string // bytes allocated and still in use
-	MemTotal     string // bytes allocated (even if freed)
-	MemSys       string // bytes obtained from system (sum of XxxSys below)
-	Lookups      uint64 // number of pointer lookups
-	MemMallocs   uint64 // number of mallocs
-	MemFrees     uint64 // number of frees
-
-	// Main allocation heap statistics.
-	HeapAlloc    string // bytes allocated and still in use
-	HeapSys      string // bytes obtained from system
-	HeapIdle     string // bytes in idle spans
-	HeapInuse    string // bytes in non-idle span
-	HeapReleased string // bytes released to the OS
-	HeapObjects  uint64 // total number of allocated objects
-
-	// Low-level fixed-size structure allocator statistics.
-	//	Inuse is bytes used now.
-	//	Sys is bytes obtained from system.
-	StackInuse  string // bootstrap stacks
-	StackSys    string
-	MSpanInuse  string // mspan structures
-	MSpanSys    string
-	MCacheInuse string // mcache structures
-	MCacheSys   string
-	BuckHashSys string // profiling bucket hash table
-	GCSys       string // GC metadata
-	OtherSys    string // other system allocations
-
-	// Garbage collector statistics.
-	NextGC       string // next run in HeapAlloc time (bytes)
-	LastGC       string // last run in absolute time (ns)
-	PauseTotalNs string
-	PauseNs      string // circular buffer of recent GC pause times, most recent at [(NumGC+255)%256]
-	NumGC        uint32
-}
-
-func GetSystemInfo() (sysStatus *SystemInfo) {
-	sysStatus = &SystemInfo{}
-	sysStatus.Uptime = TimeSincePro(initTime)
-
-	m := new(runtime.MemStats)
-	runtime.ReadMemStats(m)
-	sysStatus.NumGoroutine = runtime.NumGoroutine()
-
-	sysStatus.MemAllocated = FileSize(int64(m.Alloc))
-	sysStatus.MemTotal = FileSize(int64(m.TotalAlloc))
-	sysStatus.MemSys = FileSize(int64(m.Sys))
-	sysStatus.Lookups = m.Lookups
-	sysStatus.MemMallocs = m.Mallocs
-	sysStatus.MemFrees = m.Frees
-
-	sysStatus.HeapAlloc = FileSize(int64(m.HeapAlloc))
-	sysStatus.HeapSys = FileSize(int64(m.HeapSys))
-	sysStatus.HeapIdle = FileSize(int64(m.HeapIdle))
-	sysStatus.HeapInuse = FileSize(int64(m.HeapInuse))
-	sysStatus.HeapReleased = FileSize(int64(m.HeapReleased))
-	sysStatus.HeapObjects = m.HeapObjects
-
-	sysStatus.StackInuse = FileSize(int64(m.StackInuse))
-	sysStatus.StackSys = FileSize(int64(m.StackSys))
-	sysStatus.MSpanInuse = FileSize(int64(m.MSpanInuse))
-	sysStatus.MSpanSys = FileSize(int64(m.MSpanSys))
-	sysStatus.MCacheInuse = FileSize(int64(m.MCacheInuse))
-	sysStatus.MCacheSys = FileSize(int64(m.MCacheSys))
-	sysStatus.BuckHashSys = FileSize(int64(m.BuckHashSys))
-	sysStatus.GCSys = FileSize(int64(m.GCSys))
-	sysStatus.OtherSys = FileSize(int64(m.OtherSys))
-
-	sysStatus.NextGC = FileSize(int64(m.NextGC))
-	sysStatus.LastGC = fmt.Sprintf("%.1fs", float64(time.Now().UnixNano()-int64(m.LastGC))/1000/1000/1000)
-	sysStatus.PauseTotalNs = fmt.Sprintf("%.1fs", float64(m.PauseTotalNs)/1000/1000/1000)
-	sysStatus.PauseNs = fmt.Sprintf("%.3fs", float64(m.PauseNs[(m.NumGC+255)%256])/1000/1000/1000)
-	sysStatus.NumGC = m.NumGC
-	return
-}

+ 0 - 49
pkg/utils/cron.go

@@ -1,49 +0,0 @@
-package utils
-
-import (
-	"fmt"
-	"pbx-api-gin/pkg/lfshook"
-	"strings"
-)
-
-func GenCronRule(mode, timeStr string, weeks []string) string {
-	switch mode {
-	case "once":
-		return genOnceCronRule(timeStr)
-	case "loop":
-		return genWeekCronRule(timeStr, weeks)
-	}
-	return ""
-}
-
-//genOnceCronRule
-func genOnceCronRule(timeStr string) string {
-	hourMinute := strings.Split(timeStr, ":")
-	if len(hourMinute) != 2 {
-		lfshook.NewLogger().Errorf("error timeStr %s", timeStr)
-		return ""
-	}
-	return fmt.Sprintf("%s %s * * *", hourMinute[1], hourMinute[0])
-}
-
-//GenOnceCronRule
-func genWeekCronRule(timeStr string, weeks []string) string {
-	hourMinute := strings.Split(timeStr, ":")
-	if len(weeks) == 0 {
-		return fmt.Sprintf("%s %s * * *", hourMinute[1], hourMinute[0])
-	}
-	return fmt.Sprintf("%s %s * * %s", hourMinute[1], hourMinute[0], strings.Join(weeks, ","))
-}
-
-//FkZero 格式化数据,去掉多余的0
-func FkZero(times string) (fmttime string) {
-	if string(times[0]) != "0" {
-		return times
-	} else if strings.Split(times, "0")[1] == "" {
-		fkzero := "0"
-		return fkzero
-	} else {
-		fkzero := strings.Split(times, "0")[1]
-		return fkzero
-	}
-}

+ 0 - 24
pkg/utils/ini.go

@@ -1,24 +0,0 @@
-package utils
-
-import (
-	"fmt"
-	"os"
-
-	"gopkg.in/ini.v1"
-)
-
-var conf *ini.File
-
-//Conf 配置转 ini
-func Conf(path string) *ini.File {
-	if conf != nil {
-		return conf
-	}
-	var err error
-	conf, err = ini.Load(path)
-	if err != nil {
-		fmt.Printf("Fail to read file: %v", err)
-		os.Exit(1)
-	}
-	return conf
-}

+ 0 - 63
pkg/utils/trans.go

@@ -1,63 +0,0 @@
-package utils
-
-import (
-	"fmt"
-	"reflect"
-	"strings"
-)
-
-func ReflectTrans(obj interface{}) {
-	v := reflect.ValueOf(obj).Elem()
-	t := v.Type()
-
-	data := make(map[string]string)
-
-	for k := 0; k < t.NumField(); k++ {
-		if t.Field(k).Type.Kind() == reflect.Bool {
-			key := fmt.Sprintf("%sStr", t.Field(k).Name)
-			value := "no"
-			if v.Field(k).Interface().(bool) {
-				value = "yes"
-			}
-			data[key] = value
-		}
-	}
-
-	for k := 0; k < t.NumField(); k++ {
-		if value, ok := data[t.Field(k).Name]; ok {
-			v.Field(k).SetString(value)
-			if v.Field(k).CanSet() {
-				v.Field(k).SetString(value)
-			}
-		}
-	}
-}
-
-func MapTrans(obj interface{}) {
-	v := reflect.ValueOf(obj).Elem()
-	t := v.Type()
-
-	data := make(map[string]bool)
-
-	for k := 0; k < t.NumField(); k++ {
-		if v.Field(k).Interface() == "yes" || v.Field(k).Interface() == "no" {
-			key := strings.TrimSuffix(t.Field(k).Name, "Str")
-			var value bool
-			if v.Field(k).Interface().(string) == "yes" {
-				value = true
-			} else {
-				value = false
-			}
-			data[key] = value
-		}
-	}
-
-	for k := 0; k < t.NumField(); k++ {
-		if value, ok := data[t.Field(k).Name]; ok {
-			v.Field(k).SetBool(value)
-			if v.Field(k).CanSet() {
-				v.Field(k).SetBool(value)
-			}
-		}
-	}
-}

+ 0 - 20
pkg/utils/uuid.go

@@ -1,20 +0,0 @@
-package utils
-
-import (
-	"crypto/rand"
-	"fmt"
-)
-
-//NewV4 Returns a new uuid v4
-func NewV4() string {
-	u := [16]byte{}
-	_, err := rand.Read(u[:16])
-	if err != nil {
-		panic(err)
-	}
-
-	u[8] = (u[8] | 0x80) & 0xBf
-	u[6] = (u[6] | 0x40) & 0x4f
-
-	return fmt.Sprintf("%x-%x-%x-%x-%x", u[:4], u[4:6], u[6:8], u[8:10], u[10:])
-}

+ 0 - 31
test/config.yaml

@@ -1,31 +0,0 @@
-identityKey: 'zycoozycoo' # jwt secret
-
-ttsPath: './msc/res/tts' #tts 路径
-googleJsonKeyFile: '/google.json' #google key file
-savePath: '/tmp' #存储路径
-
-# AMI
-asteriskAMIHost: '127.0.0.1'
-asteriskAMIPort: '5038'
-asteriskAMIUser: 'admin'
-asteriskAMISecret: 'admin'
-
-# AGI
-asteriskAGIPort: '18080'
-
-# 数据库配置
-mysqlDBHost: '127.0.0.1'
-mysqlDBUser: 'coovox_admin'
-mysqlDBSecret: 'ZycooCoovoxDba42'
-
-# Redis
-redisDBHost: 'localhost'
-redisDBPort: '6379'
-redisDBSecret: ''
-
-# log
-logErrorPath: './error.log'
-logInfoPath: './info.log'
-
-# music upload
-storagePath: '/tmp'

+ 0 - 35
test/info_test.go

@@ -1,35 +0,0 @@
-package test
-
-import (
-	"pbx-api-gin/api/admin/extensioncommon"
-	"pbx-api-gin/api/admin/rdepartment"
-	"pbx-api-gin/internal/app/mysql"
-	"testing"
-
-	"github.com/gin-gonic/gin"
-)
-
-func TestServer(t *testing.T) {
-	// t.Run("测试AdminExtensionRangeInfo函数获取部门号码取值范围", testinfo)
-	t.Run("测试AdminExtensionRangeInfo函数获取部门号码取值范围", testdepartment)
-}
-
-//testinfo 测试获取部门号码
-func testinfo(t *testing.T) {
-
-	mysql.CreateDBInstance()
-	r := gin.Default()
-	r.POST("/admin/extension-common/extension-range-info", extensioncommon.AdminExtensionRangeInfo)
-	r.Run(":51873")
-
-}
-
-//testdepartment 测试获取部门数据和部门成员信息
-func testdepartment(t *testing.T) {
-	mysql.CreateDBInstance()
-	r := gin.Default()
-	// r.GET("/r-department/list-department-info", rdepartment.AdminListDepartmentInfo)
-	// r.POST("/r-department/add-department", rdepartment.AdminAddDepartment)
-	r.POST("/r-department/update-department", rdepartment.AdminUpdateDepartment)
-	r.Run(":51873")
-}

+ 0 - 39
test/ini.go

@@ -1,39 +0,0 @@
-package main
-
-import (
-	"fmt"
-	"os"
-
-	"gopkg.in/ini.v1"
-)
-
-func main() {
-	ini.PrettyFormat = false
-	cfg, err := ini.LoadSources(ini.LoadOptions{
-		SpaceBeforeInlineComment: false,
-		IgnoreInlineComment:      true,
-	}, "my.ini")
-	if err != nil {
-		fmt.Printf("Fail to read file: %v", err)
-		os.Exit(1)
-	}
-	// Classic read of values, default section can be represented as empty string
-	cfg.Section("").Comment = "#include extensions_trigger.conf"
-	fmt.Println("App Mode:", cfg.Section("").Key("app_mode").String())
-	fmt.Println("Data Path:", cfg.Section("paths").Key("data").String())
-
-	// Let's do some candidate value limitation
-	fmt.Println("Server Protocol:",
-		cfg.Section("server").Key("protocol").In("http", []string{"http", "https"}))
-	// Value read that is not in candidates will be discarded and fall back to given default value
-	fmt.Println("Email Protocol:",
-		cfg.Section("server").Key("protocol").In("smtp", []string{"imap", "smtp"}))
-
-	// Try out auto-type conversion
-	fmt.Printf("Port Number: (%[1]T) %[1]d\n", cfg.Section("server").Key("http_port").MustInt(9999))
-	fmt.Printf("Enforce Domain: (%[1]T) %[1]v\n", cfg.Section("server").Key("enforce_domain").MustBool(false))
-
-	// Now, make some changes and save it
-	cfg.Section("").Key("app_mode").SetValue("production")
-	cfg.SaveTo("my.ini")
-}

+ 0 - 11
test/my.ini

@@ -1,11 +0,0 @@
-# include extensions_trigger.conf
-app_mode=production
-
-[paths]
-data=
-
-[server]
-protocol=
-http_port=9999
-enforce_domain=false
-