scrm-go

activity_controller.go 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. package marketing_tool
  2. import (
  3. "SCRM/controllers"
  4. "SCRM/enums"
  5. "SCRM/models"
  6. "SCRM/service/marketing_tool_service"
  7. "SCRM/utils"
  8. "encoding/json"
  9. "time"
  10. "github.com/astaxie/beego"
  11. )
  12. func ActivityCtlRegistRouters() {
  13. beego.Router("/api/activities", &ActivityAPIController{}, "get:Activities")
  14. beego.Router("/api/activity", &ActivityAPIController{}, "get:GetActivity")
  15. beego.Router("/api/activity/submit", &ActivityAPIController{}, "post:ActivitySubmit")
  16. }
  17. type ActivityAPIController struct {
  18. controllers.BaseAuthAPIController
  19. }
  20. // /api/activities [get]
  21. // @param page?:int
  22. // @param keyword?:string
  23. // @param status?:int 1.已发布 2.待发布 3.未通过 4.已结束 其他取全部
  24. func (this *ActivityAPIController) Activities() {
  25. page, _ := this.GetInt("page")
  26. keyword := this.GetString("keyword")
  27. status, _ := this.GetInt("status")
  28. if page <= 0 {
  29. page = 1
  30. }
  31. if status < 1 || status > 4 {
  32. status = 0
  33. }
  34. adminUserInfo := this.GetAdminUserInfo()
  35. var activities []*models.Activity
  36. var totalCount int64
  37. var getActivityErr error
  38. if status == 1 {
  39. activities, totalCount, getActivityErr = marketing_tool_service.GetActivitiesWithStatus(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, keyword, 1, page, 10)
  40. } else if status == 2 {
  41. activities, totalCount, getActivityErr = marketing_tool_service.GetActivitiesWithStatus(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, keyword, 4, page, 10)
  42. } else if status == 3 {
  43. activities, totalCount, getActivityErr = marketing_tool_service.GetActivitiesWithStatus(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, keyword, 3, page, 10)
  44. } else if status == 4 {
  45. activities, totalCount, getActivityErr = marketing_tool_service.GetDidEndedActivities(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, keyword, page, 10)
  46. } else {
  47. activities, totalCount, getActivityErr = marketing_tool_service.GetValidActivities(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, keyword, page, 10)
  48. }
  49. if getActivityErr != nil {
  50. this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
  51. return
  52. }
  53. activityJSONList := make([]map[string]interface{}, 0, len(activities))
  54. for _, activity := range activities {
  55. var json map[string]interface{}
  56. // 活动状态 1:已发布 2:待审核 3:未通过 4:草稿 9:已删除
  57. if activity.Status == 1 { // 已发布/已结束
  58. json = this._convertToPublishedActivityViewJSON(activity)
  59. } else if activity.Status == 3 { // 未通过
  60. json = this._convertToUnapprovedActivityViewJSON(activity)
  61. } else if activity.Status == 4 { // 草稿
  62. json = this._convertToActivityDraftsViewJSON(activity)
  63. }
  64. activityJSONList = append(activityJSONList, json)
  65. }
  66. this.ServeSuccessJSON(map[string]interface{}{
  67. "activities": activityJSONList,
  68. "total": totalCount,
  69. })
  70. }
  71. func (this *ActivityAPIController) _convertToPublishedActivityViewJSON(activity *models.Activity) map[string]interface{} {
  72. json := make(map[string]interface{})
  73. now := time.Now().Unix()
  74. if activity.StartTime < now {
  75. json["status"] = 4
  76. } else {
  77. json["status"] = 1
  78. }
  79. json["id"] = activity.Id
  80. json["poster_photo"] = activity.PosterPhoto
  81. json["title"] = activity.Title
  82. json["is_recommend"] = activity.IsRecommend
  83. json["read_num"] = activity.ReadNum
  84. json["comment_num"] = activity.CommentNum
  85. json["star_num"] = activity.StarNum
  86. json["join_num"] = activity.JoinNum
  87. json["limit_num"] = activity.LimitNum
  88. json["start_time"] = activity.StartTime
  89. return json
  90. }
  91. func (this *ActivityAPIController) _convertToActivityDraftsViewJSON(activity *models.Activity) map[string]interface{} {
  92. json := make(map[string]interface{})
  93. json["status"] = 2
  94. json["id"] = activity.Id
  95. json["poster_photo"] = activity.PosterPhoto
  96. json["title"] = activity.Title
  97. return json
  98. }
  99. func (this *ActivityAPIController) _convertToUnapprovedActivityViewJSON(activity *models.Activity) map[string]interface{} {
  100. json := make(map[string]interface{})
  101. json["status"] = 3
  102. json["id"] = activity.Id
  103. json["poster_photo"] = activity.PosterPhoto
  104. json["title"] = activity.Title
  105. json["reason"] = activity.Reason
  106. json["start_time"] = activity.StartTime
  107. return json
  108. }
  109. // /api/activity [get]
  110. // @param id:int
  111. func (this *ActivityAPIController) GetActivity() {
  112. activityID, _ := this.GetInt64("id")
  113. if activityID <= 0 {
  114. this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
  115. return
  116. }
  117. adminUserInfo := this.GetAdminUserInfo()
  118. activity, getActivityErr := marketing_tool_service.GetActivityWithID(adminUserInfo.CurrentOrgId, activityID)
  119. if getActivityErr != nil {
  120. this.ErrorLog("获取活动失败:%v", getActivityErr)
  121. this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
  122. return
  123. } else if activity == nil {
  124. this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeActivityNotExist)
  125. return
  126. }
  127. paragraph, getParagraphErr := marketing_tool_service.GetActivityParagraphByActivityID(activity.Id)
  128. if getParagraphErr != nil {
  129. this.ErrorLog("获取活动段落失败:%v", getParagraphErr)
  130. this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
  131. return
  132. }
  133. paragraphTitle := ""
  134. paragraphContent := ""
  135. if paragraph != nil {
  136. paragraphTitle = paragraph.Title
  137. paragraphContent = paragraph.Text
  138. }
  139. this.ServeSuccessJSON(map[string]interface{}{
  140. "activity": activity,
  141. "paragraph": map[string]interface{}{
  142. "title": paragraphTitle,
  143. "content": paragraphContent,
  144. },
  145. })
  146. }
  147. // /api/activity/submit [post]
  148. // @param publish:bool 是否发布
  149. // @data 如下格式
  150. /*
  151. {
  152. id?:int
  153. title:string
  154. subtitle:string
  155. poster_photo:string
  156. address:string
  157. limit_num?:int
  158. sign_up_deadline:string ("yyyy-MM-dd HH:mm")
  159. start_time:string ("yyyy-MM-dd HH:mm")
  160. phone_number?:string
  161. sign_up_notice?:string
  162. paragraph: {
  163. title:string
  164. content:string
  165. }
  166. }
  167. */
  168. func (this *ActivityAPIController) ActivitySubmit() {
  169. publish, _ := this.GetBool("publish")
  170. var activityForm ActivityForm
  171. parseErr := json.Unmarshal(this.Ctx.Input.RequestBody, &activityForm)
  172. if parseErr != nil {
  173. this.ErrorLog("解析 activity form 失败:%v", parseErr)
  174. this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamFormatWrong)
  175. return
  176. }
  177. adminUserInfo := this.GetAdminUserInfo()
  178. var activity *models.Activity
  179. if activityForm.ID > 0 {
  180. var getActivityErr error
  181. activity, getActivityErr = marketing_tool_service.GetActivityWithID(adminUserInfo.CurrentOrgId, activityForm.ID)
  182. if getActivityErr != nil {
  183. this.ErrorLog("获取活动失败:%v", getActivityErr)
  184. this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
  185. return
  186. } else if activity == nil || activity.Status == 9 {
  187. this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeActivityNotExist)
  188. return
  189. }
  190. }
  191. if len(activityForm.Title) == 0 || len(activityForm.Subtitle) == 0 || len(activityForm.PosterPhoto) == 0 || len(activityForm.Address) == 0 || len(activityForm.SignUpDeadline) == 0 || len(activityForm.StartTime) == 0 {
  192. this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
  193. return
  194. }
  195. timeFmt := "2006-01-02 15:04"
  196. signUpDeadlineTime, parseSUDErr := utils.ParseTimeStringToTime(timeFmt, activityForm.SignUpDeadline)
  197. if parseSUDErr != nil {
  198. this.ErrorLog("解析报名截止时间失败:%v", parseSUDErr)
  199. this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamFormatWrong)
  200. return
  201. }
  202. activityTime, parseActivityTimeErr := utils.ParseTimeStringToTime(timeFmt, activityForm.StartTime)
  203. if parseActivityTimeErr != nil {
  204. this.ErrorLog("解析活动开始时间失败:%v", parseActivityTimeErr)
  205. this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamFormatWrong)
  206. return
  207. }
  208. if len(activityForm.PhoneNumber) > 0 {
  209. if utils.PhoneRegexp().MatchString(activityForm.PhoneNumber) == false {
  210. this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamFormatWrong)
  211. return
  212. }
  213. }
  214. if activityForm.LimitNum < 0 {
  215. activityForm.LimitNum = 0
  216. }
  217. if activity == nil {
  218. activity = &models.Activity{
  219. UserOrgId: adminUserInfo.CurrentOrgId,
  220. UserAppId: adminUserInfo.CurrentAppId,
  221. Title: activityForm.Title,
  222. Subtitle: activityForm.Subtitle,
  223. Address: activityForm.Address,
  224. SignUpDeadline: signUpDeadlineTime.Unix(),
  225. SignUpNotice: activityForm.SignUpNotice,
  226. StartTime: activityTime.Unix(),
  227. PosterPhoto: activityForm.PosterPhoto,
  228. PosterPhotoThumb: activityForm.PosterPhoto,
  229. LimitNum: activityForm.LimitNum,
  230. PhoneNumber: activityForm.PhoneNumber,
  231. CreateTime: time.Now().Unix(),
  232. }
  233. } else {
  234. activity.Title = activityForm.Title
  235. activity.Subtitle = activityForm.Subtitle
  236. activity.Address = activityForm.Address
  237. activity.SignUpDeadline = signUpDeadlineTime.Unix()
  238. activity.SignUpNotice = activityForm.SignUpNotice
  239. activity.StartTime = activityTime.Unix()
  240. activity.PosterPhoto = activityForm.PosterPhoto
  241. activity.PosterPhotoThumb = activityForm.PosterPhoto
  242. activity.LimitNum = activityForm.LimitNum
  243. activity.PhoneNumber = activityForm.PhoneNumber
  244. }
  245. activity.ModifyTime = time.Now().Unix()
  246. if publish {
  247. activity.Status = 1
  248. } else {
  249. activity.Status = 4
  250. }
  251. var paragraph *models.ActivityParagraph
  252. if activity.Id > 0 {
  253. var getPErr error
  254. paragraph, getPErr = marketing_tool_service.GetActivityParagraphByActivityID(activity.Id)
  255. if getPErr != nil {
  256. this.ErrorLog("获取活动段落失败:%v", getPErr)
  257. this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
  258. return
  259. }
  260. }
  261. if len(activityForm.Paragraph.Title) > 0 {
  262. if paragraph == nil {
  263. paragraph = &models.ActivityParagraph{
  264. Title: activityForm.Paragraph.Title,
  265. Text: activityForm.Paragraph.Content,
  266. Status: 1,
  267. CreateTime: time.Now().Unix(),
  268. ModifyTime: time.Now().Unix(),
  269. }
  270. } else {
  271. paragraph.Title = activityForm.Paragraph.Title
  272. paragraph.Text = activityForm.Paragraph.Content
  273. paragraph.ModifyTime = time.Now().Unix()
  274. }
  275. } else {
  276. if paragraph != nil {
  277. paragraph.Status = 0
  278. paragraph.ModifyTime = time.Now().Unix()
  279. }
  280. }
  281. saveErr := marketing_tool_service.SaveActivityAndParagraph(activity, paragraph)
  282. if saveErr != nil {
  283. this.ErrorLog("保存活动失败:%v", saveErr)
  284. this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
  285. return
  286. }
  287. wxShareModel, getWxShareErr := marketing_tool_service.GetActivityWxShareByActivityID(activity.Id)
  288. if getWxShareErr != nil {
  289. this.ErrorLog("获取活动微信分享信息失败:%v", getWxShareErr)
  290. } else if wxShareModel != nil {
  291. wxShareModel.ModifyTime = time.Now().Unix()
  292. wxShareModel.Status = 1
  293. wxShareModel.Title = activity.Title
  294. wxShareModel.Subtitle = activity.Subtitle
  295. wxShareModel.Image = activity.PosterPhoto
  296. saveWxShareErr := marketing_tool_service.SaveActivityWxShare(wxShareModel)
  297. if saveWxShareErr != nil {
  298. this.ErrorLog("更新活动微信分享信息失败:%v", saveWxShareErr)
  299. }
  300. }
  301. this.ServeSuccessJSON(map[string]interface{}{
  302. "activity_id": activity.Id,
  303. })
  304. }