scrm-go

menu_controller.go 9.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. package mpwechat
  2. import (
  3. base_ctl "SCRM/controllers"
  4. "SCRM/enums"
  5. "SCRM/models"
  6. "SCRM/service/wechat_service"
  7. "time"
  8. "encoding/json"
  9. "github.com/astaxie/beego"
  10. )
  11. func MpMenusCtlRegistRouters() {
  12. beego.Router("/api/mpwechat/menus", &MpMenusAPIController{}, "Get:GetMenus")
  13. beego.Router("/api/mpwechat/savemenus", &MpMenusAPIController{}, "Put:SaveMenus")
  14. beego.Router("/api/mpwechat/deletemenus", &MpMenusAPIController{}, "Post:DeleteMenu")
  15. }
  16. type MpMenusAPIController struct {
  17. base_ctl.BaseAuthAPIController
  18. }
  19. func (c *MpMenusAPIController) GetMenus() {
  20. adminUserInfo := c.GetAdminUserInfo()
  21. buttons, err := wechat_service.GetOrgMenusWithMsgs(adminUserInfo.CurrentOrgId)
  22. if err != nil {
  23. c.ServeFailJsonSend(enums.ErrorCodeDataException, "读取菜单配置信息失败:("+err.Error()+")")
  24. return
  25. }
  26. if buttons != nil && buttons.ButtonStatus != 1 {
  27. buttons = nil
  28. }
  29. mediaIDs := make([]string, 0)
  30. var menus wechat_service.SelfMenuInfo
  31. if buttons != nil {
  32. err = json.Unmarshal([]byte(buttons.ButtonFileds), &menus)
  33. if err != nil {
  34. c.ServeFailJsonSend(enums.ErrorCodeDataException, "解析菜单配置信息失败:("+err.Error()+")")
  35. return
  36. }
  37. msgMap := make(map[string]string, 0)
  38. for _, msg := range buttons.Messages {
  39. msgMap[msg.MessageKeyName] = msg.MessageContent
  40. }
  41. for index, menu := range menus.Button {
  42. if menu.Type == "media_id" && len(menu.MediaId) > 0 {
  43. mediaIDs = append(mediaIDs, menu.MediaId)
  44. }
  45. if _, exist := msgMap[menu.Key]; exist {
  46. menus.Button[index].Message = msgMap[menu.Key]
  47. }
  48. for sindex, sub := range menus.Button[index].SubButton {
  49. if sub.Type == "media_id" && len(sub.MediaId) > 0 {
  50. mediaIDs = append(mediaIDs, sub.MediaId)
  51. }
  52. if _, exist := msgMap[sub.Key]; exist {
  53. menus.Button[index].SubButton[sindex].Message = msgMap[sub.Key]
  54. }
  55. }
  56. }
  57. if len(mediaIDs) > 0 {
  58. medias, err := wechat_service.FindMeterialsByMediaIDs(adminUserInfo.CurrentOrgId, "image", mediaIDs)
  59. if err != nil {
  60. c.ServeFailJsonSend(enums.ErrorCodeDataException, "获取菜单信息失败:("+err.Error()+")")
  61. return
  62. }
  63. if len(medias) > 0 {
  64. mediaMap := make(map[string]string, 0)
  65. for _, media := range medias {
  66. mediaMap[media.MediaId] = media.MediaUrl
  67. }
  68. for index, menu := range menus.Button {
  69. if menu.Type == "media_id" && len(menu.MediaId) > 0 {
  70. if _, exist := mediaMap[menu.MediaId]; exist {
  71. menus.Button[index].MediaUrl = mediaMap[menu.MediaId]
  72. }
  73. }
  74. for sindex, sub := range menus.Button[index].SubButton {
  75. if sub.Type == "media_id" && len(sub.MediaId) > 0 {
  76. if _, exist := mediaMap[sub.MediaId]; exist {
  77. menus.Button[index].SubButton[sindex].MediaUrl = mediaMap[sub.MediaId]
  78. }
  79. }
  80. }
  81. }
  82. }
  83. }
  84. }
  85. returnData := make(map[string]interface{}, 0)
  86. returnData["buttons"] = buttons
  87. returnData["menus"] = menus
  88. c.ServeSuccessJSON(returnData)
  89. return
  90. }
  91. func (c *MpMenusAPIController) SaveMenus() {
  92. adminUserInfo := c.GetAdminUserInfo()
  93. authorization, err := wechat_service.GetAuthorizationByOrgID(adminUserInfo.CurrentOrgId)
  94. if err != nil {
  95. c.ServeFailJsonSend(enums.ErrorCodeDataException, "保存菜单失败:("+err.Error()+")")
  96. return
  97. }
  98. if authorization == nil || authorization.AuthorizerStatus != 1 {
  99. c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "保存菜单失败:(未授权)")
  100. return
  101. }
  102. // 授权方公众号类型,0代表订阅号,1代表由历史老帐号升级后的订阅号,2代表服务号
  103. // 授权方认证类型,-1代表未认证,0代表微信认证,1代表新浪微博认证,2代表腾讯微博认证,3代表已资质认证通过但还未通过名称认证,4代表已资质认证通过、还未通过名称认证,但通过了新浪微博认证,5代表已资质认证通过、还未通过名称认证,但通过了腾讯微博认证
  104. if (authorization.AuthorizerServiceTypeInfo == 0 || authorization.AuthorizerServiceTypeInfo == 1) && authorization.AuthorizerVerifyTypeInfo == -1 {
  105. c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "保存菜单失败:(未认证的订阅号没有自定义菜单的接口权限)")
  106. return
  107. }
  108. var buttons wechat_service.SelfMenuInfo
  109. err = json.Unmarshal(c.Ctx.Input.RequestBody, &buttons)
  110. if err != nil {
  111. c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "解析菜单失败:("+err.Error()+")")
  112. return
  113. }
  114. clickMap := make(map[string]string, 0)
  115. for pindex, button := range buttons.Button {
  116. if button.Type == "click" && len(button.Key) > 0 && len(button.SubButton) == 0 {
  117. clickMap[button.Key] = button.Message
  118. }
  119. if button.Type != "click" {
  120. buttons.Button[pindex].Key = ""
  121. }
  122. if len(button.SubButton) > 0 {
  123. for sindex, child := range button.SubButton {
  124. if child.Type == "click" && len(child.Key) > 0 {
  125. clickMap[child.Key] = child.Message
  126. }
  127. buttons.Button[pindex].SubButton[sindex].Message = ""
  128. if child.Type != "click" {
  129. buttons.Button[pindex].SubButton[sindex].Key = ""
  130. }
  131. }
  132. }
  133. buttons.Button[pindex].Message = ""
  134. }
  135. messages, err := wechat_service.GetOrgAllClickMessages(adminUserInfo.CurrentOrgId)
  136. if err != nil {
  137. c.ServeFailJsonSend(enums.ErrorCodeDataException, "保存菜单失败:("+err.Error()+")")
  138. return
  139. }
  140. oldMsgs := make(map[string]models.AuthorizationMessageManagements)
  141. for _, message := range messages {
  142. if _, exist := clickMap[message.MessageKeyName]; exist {
  143. msg := *message
  144. oldMsgs[message.MessageKeyName] = msg
  145. }
  146. }
  147. buttonFileds, err := json.Marshal(buttons)
  148. if err != nil {
  149. c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "解析菜单失败:("+err.Error()+")")
  150. return
  151. }
  152. timeNow := time.Now().Unix()
  153. var saveButton wechat_service.Buttons
  154. saveButton.UserOrgID = adminUserInfo.CurrentOrgId
  155. saveButton.UpdatedTime = timeNow
  156. saveButton.ButtonStatus = 1
  157. saveButton.SendStatus = 0
  158. saveButton.ButtonFileds = string(buttonFileds)
  159. button, err := wechat_service.GetMenusByOrgID(adminUserInfo.CurrentOrgId)
  160. if err != nil {
  161. c.ServeFailJsonSend(enums.ErrorCodeDataException, "保存菜单失败:("+err.Error()+")")
  162. return
  163. }
  164. if button != nil {
  165. saveButton.ID = button.ID
  166. saveButton.CreatedTime = button.CreatedTime
  167. }
  168. saveButton.Messages = make([]*models.AuthorizationMessageManagements, 0)
  169. for keyName, Content := range clickMap {
  170. var msg models.AuthorizationMessageManagements
  171. msg.MessageMsgType = "event"
  172. msg.MessageMsgEvent = "click"
  173. msg.MessageContent = Content
  174. msg.UpdatedTime = timeNow
  175. msg.MessageStatus = 1
  176. msg.MessageKeyName = keyName
  177. msg.UserOrgId = adminUserInfo.CurrentOrgId
  178. if _, exist := oldMsgs[keyName]; exist {
  179. msg.ID = oldMsgs[keyName].ID
  180. msg.CreatedTime = oldMsgs[keyName].CreatedTime
  181. } else {
  182. msg.CreatedTime = timeNow
  183. }
  184. saveButton.Messages = append(saveButton.Messages, &msg)
  185. }
  186. err = wechat_service.SaveButtons(&saveButton)
  187. if err != nil {
  188. c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "保存菜单失败:("+err.Error()+")")
  189. return
  190. }
  191. err = wechat_service.SendMpWechatMenus(authorization.AuthorizerAccessToken, buttonFileds)
  192. if err != nil {
  193. c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "保存菜单成功,但发布菜单到公众号失败:("+err.Error()+")")
  194. return
  195. }
  196. returnData := make(map[string]interface{}, 0)
  197. returnData["buttons"] = buttons
  198. c.ServeSuccessJSON(returnData)
  199. return
  200. }
  201. func (c *MpMenusAPIController) DeleteMenu() {
  202. adminUserInfo := c.GetAdminUserInfo()
  203. authorization, err := wechat_service.GetAuthorizationByOrgID(adminUserInfo.CurrentOrgId)
  204. if err != nil {
  205. c.ServeFailJsonSend(enums.ErrorCodeDataException, "删除菜单失败:("+err.Error()+")")
  206. return
  207. }
  208. if authorization == nil || authorization.AuthorizerStatus != 1 {
  209. c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "删除菜单失败:(未授权)")
  210. return
  211. }
  212. // 授权方公众号类型,0代表订阅号,1代表由历史老帐号升级后的订阅号,2代表服务号
  213. // 授权方认证类型,-1代表未认证,0代表微信认证,1代表新浪微博认证,2代表腾讯微博认证,3代表已资质认证通过但还未通过名称认证,4代表已资质认证通过、还未通过名称认证,但通过了新浪微博认证,5代表已资质认证通过、还未通过名称认证,但通过了腾讯微博认证
  214. if (authorization.AuthorizerServiceTypeInfo == 0 || authorization.AuthorizerServiceTypeInfo == 1) && authorization.AuthorizerVerifyTypeInfo == -1 {
  215. c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "删除菜单失败:(未认证的订阅号没有自定义菜单相关接口的权限)")
  216. return
  217. }
  218. button, err := wechat_service.GetMenusByOrgID(adminUserInfo.CurrentOrgId)
  219. if err != nil {
  220. c.ServeFailJsonSend(enums.ErrorCodeDataException, "删除菜单失败:("+err.Error()+")")
  221. return
  222. }
  223. if button == nil || button.ButtonStatus != 1 {
  224. c.ServeFailJsonSend(enums.ErrorCodeDataException, "删除菜单失败:(未设置菜单)")
  225. return
  226. }
  227. err = wechat_service.DeleteMpWechatMenus(authorization.AuthorizerAccessToken)
  228. if err != nil {
  229. c.ServeFailJsonSend(enums.ErrorCodeDataException, "删除菜单失败:("+err.Error()+")")
  230. return
  231. }
  232. err = wechat_service.DeleteButton(adminUserInfo.CurrentOrgId, button.ID)
  233. if err != nil {
  234. c.ServeFailJsonSend(enums.ErrorCodeDataException, "删除菜单失败:("+err.Error()+")")
  235. return
  236. }
  237. returnData := make(map[string]interface{}, 0)
  238. returnData["msg"] = "ok"
  239. c.ServeSuccessJSON(returnData)
  240. return
  241. }