email.go 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. package service
  2. import (
  3. "context"
  4. "fmt"
  5. "strconv"
  6. "strings"
  7. "time"
  8. "go-common/app/job/main/videoup-report/model/archive"
  9. emailmdl "go-common/app/job/main/videoup-report/model/email"
  10. "go-common/app/job/main/videoup-report/model/manager"
  11. account "go-common/app/service/main/account/api"
  12. "go-common/library/cache/redis"
  13. "go-common/library/log"
  14. )
  15. //一审备注中有"私单报备", 则发送邮件
  16. func (s *Service) sendVideoPrivateEmail(c context.Context, a *archive.Archive, v *archive.Video) (err error) {
  17. if a == nil || v == nil {
  18. return
  19. }
  20. note, err := s.arc.VideoAuditNote(c, v.ID)
  21. if err != nil {
  22. log.Error("sendVideoPrivateEmail s.arc.VideoAuditNote error(%v)", err)
  23. return
  24. }
  25. if !s.needPrivateEmail(a.TypeID, note) {
  26. log.Info("sendVideoPrivateEmail no need to send email: vid(%d), aid(%d), note(%s), typeId(%d)", v.ID, v.Aid, note, a.TypeID)
  27. return
  28. }
  29. log.Info("start to sendVideoPrivateEmail: note(%s), typeId(%d), aid(%d), video(%v), archive(%v)", note, a.TypeID, a.ID, v, a)
  30. //up主信息
  31. pfl, err := s.profile(c, a.Mid)
  32. if err != nil || pfl == nil {
  33. log.Error("sendVideoPrivateEmail s.profile error(%v) or nil, mid(%d), vid(%d), aid(%d)", err, a.Mid, v.ID, a.ID)
  34. return
  35. }
  36. //审核人员信息
  37. mngUID, err := s.arc.LastVideoOperUID(c, v.ID)
  38. if err != nil || mngUID <= 0 {
  39. log.Error("sendVideoPrivateEmail s.arc.LastVideoOperUID error(%v) or zero(%d) vid(%d) aid(%d)", err, mngUID, v.ID, v.Aid)
  40. return
  41. }
  42. mngUser, err := s.mng.User(c, mngUID)
  43. if err != nil || mngUser == nil || mngUser.ID != mngUID {
  44. log.Error("sendVideoPrivateEmail s.mng.User(%d) error(%v) or not found(%+v) uid(%d)", mngUID, err, mngUser)
  45. return
  46. }
  47. //禁止项状态
  48. noRankAttr, noDynamicAttr, noRecommend := "关", "关", "关"
  49. if v.AttrVal(archive.AttrBitNoRank) == archive.AttrYes {
  50. noRankAttr = "开"
  51. }
  52. if v.AttrVal(archive.AttrBitNoDynamic) == archive.AttrYes {
  53. noDynamicAttr = "开"
  54. }
  55. if v.AttrVal(archive.AttrBitNoRecommend) == archive.AttrYes {
  56. noRecommend = "开"
  57. }
  58. //组合邮件参数
  59. params := map[string]string{
  60. "upName": pfl.Profile.Name,
  61. "aid": strconv.FormatInt(v.Aid, 10),
  62. "arcTitle": a.Title,
  63. "arcState": archive.StateMean[a.State],
  64. "noRankAttr": noRankAttr,
  65. "noDynamicAttr": noDynamicAttr,
  66. "noRecommendAttr": noRecommend,
  67. "upFans": strconv.FormatInt(pfl.Follower, 10),
  68. "uid": strconv.FormatInt(mngUID, 10),
  69. "mngName": mngUser.Username,
  70. "mngDepartment": mngUser.Department,
  71. "note": note,
  72. "typeId": strconv.Itoa(int(s.topType(a.TypeID))),
  73. "emailType": emailmdl.EmailPrivateVideo,
  74. }
  75. tpl := s.email.PrivateEmailTemplate(params)
  76. s.email.PushToRedis(c, tpl)
  77. return
  78. }
  79. //稿件备注中有"私单报备", 则发送邮件
  80. func (s *Service) sendArchivePrivateEmail(c context.Context, a *archive.Archive) (err error) {
  81. defer func() {
  82. if pErr := recover(); pErr != nil {
  83. log.Error("s.sendArchivePrivateEmail panic(%v)", pErr)
  84. }
  85. }()
  86. if a == nil {
  87. return
  88. }
  89. note, err := s.arc.ArchiveNote(c, a.ID)
  90. if err != nil {
  91. log.Error("sendArchivePrivateEmail s.arc.ArchiveNote error(%v) aid(%d)", err, a.ID)
  92. return
  93. }
  94. if !s.needPrivateEmail(a.TypeID, note) {
  95. log.Info("sendArchivePrivateEmail: no need to send email: aid(%d), note(%s), typeId(%d)", a.ID, note, a.TypeID)
  96. return
  97. }
  98. log.Info("start to sendArchivePrivateEmail: note(%s), typeId(%d), aid(%d), archive(%v)", note, a.TypeID, a.ID, a)
  99. //up主信息
  100. pfl, err := s.profile(c, a.Mid)
  101. if err != nil || pfl == nil {
  102. log.Error("sendArchivePrivateEmail s.profile error(%v) or nil, mid(%d), aid(%d)", err, a.Mid, a.ID)
  103. return
  104. }
  105. //审核人员信息
  106. arcOper, err := s.arc.LastArcOper(c, a.ID)
  107. if err != nil || arcOper == nil || arcOper.AID <= 0 {
  108. log.Error("sendArchivePrivateEmail s.arc.LastArcOper(%d), error(%v) or not found(%+v)", a.ID, err, arcOper)
  109. return
  110. }
  111. mngUser, err := s.mng.User(c, arcOper.UID)
  112. if err != nil || mngUser == nil || mngUser.ID != arcOper.UID {
  113. log.Error("sendArchivePrivateEmail s.mng.User error(%v) or not found(%+v), aid(%d), uid(%d)", err, mngUser, a.ID, arcOper.UID)
  114. return
  115. }
  116. //禁止项状态
  117. noRankAttr, noDynamicAttr, noRecommend := "关", "关", "关"
  118. if a.AttrVal(archive.AttrBitNoRank) == archive.AttrYes {
  119. noRankAttr = "开"
  120. }
  121. if a.AttrVal(archive.AttrBitNoDynamic) == archive.AttrYes {
  122. noDynamicAttr = "开"
  123. }
  124. if a.AttrVal(archive.AttrBitNoRecommend) == archive.AttrYes {
  125. noRecommend = "开"
  126. }
  127. //组合邮件参数
  128. params := map[string]string{
  129. "upName": pfl.Profile.Name,
  130. "aid": strconv.FormatInt(a.ID, 10),
  131. "arcTitle": a.Title,
  132. "arcState": archive.StateMean[a.State],
  133. "noRankAttr": noRankAttr,
  134. "noDynamicAttr": noDynamicAttr,
  135. "noRecommendAttr": noRecommend,
  136. "upFans": strconv.FormatInt(pfl.Follower, 10),
  137. "uid": strconv.FormatInt(mngUser.ID, 10),
  138. "mngName": mngUser.Username,
  139. "mngDepartment": mngUser.Department,
  140. "note": note,
  141. "typeId": strconv.Itoa(int(s.topType(a.TypeID))),
  142. "emailType": emailmdl.EmailPrivateArchive,
  143. }
  144. tpl := s.email.PrivateEmailTemplate(params)
  145. s.email.PushToRedis(c, tpl)
  146. return
  147. }
  148. //触发私单报备邮件的条件
  149. func (s *Service) needPrivateEmail(typeID int16, note string) (matched bool) {
  150. typeI := int(s.topType(typeID))
  151. _, exist := s.email.PrivateAddr[strconv.Itoa(typeI)]
  152. matched = exist && strings.Contains(note, "私单报备")
  153. return
  154. }
  155. func (s *Service) sendMail(c context.Context, a *archive.Archive, v *archive.Video) (err error) {
  156. defer func() {
  157. if pErr := recover(); pErr != nil {
  158. log.Error("s.sendMail panic(%v)", pErr)
  159. }
  160. }()
  161. var (
  162. condition, additionCondition, content []string
  163. mngUser *manager.User
  164. pfl *account.ProfileStatReply
  165. remark, additionType string
  166. mngUID int64
  167. videoOper *archive.VideoOper
  168. arcOper *archive.Oper
  169. )
  170. //触发条件
  171. if s.isSigned(a.Mid) {
  172. additionCondition = append(additionCondition, "签约UP主")
  173. additionType = "signed"
  174. }
  175. if s.isWhite(a.Mid) {
  176. condition = append(condition, "优质UP主")
  177. }
  178. if s.isPolitices(a.Mid) {
  179. condition = append(condition, "时政UP主")
  180. }
  181. if s.isEnterprise(a.Mid) {
  182. condition = append(condition, "企业机构实名认证UP主")
  183. }
  184. if pfl, _ = s.profile(c, a.Mid); pfl != nil && pfl.Follower > 100000 {
  185. condition = append(condition, fmt.Sprintf("10万以上粉丝(%d个粉丝)", pfl.Follower))
  186. }
  187. if len(condition)+len(additionCondition) <= 0 {
  188. log.Info("sendMail aid(%d) mid(%d) is not signed uper & whith uper && shizheng uper && qiye uper && funs < 10W", a.ID, a.Mid)
  189. return
  190. }
  191. content = append(content, fmt.Sprintf("[审核状态]: %s", archive.StateMean[a.State]))
  192. fromVideo := v != nil
  193. if fromVideo {
  194. //视频审核操作
  195. videoOper, err = s.arc.LastVideoOper(c, v.ID)
  196. if err != nil || videoOper == nil || videoOper.VID <= 0 {
  197. log.Error("sendMail s.arc.LastVideoOper(vid(%d)) error(%v) or not found", v.ID, err)
  198. return
  199. }
  200. mngUID = videoOper.UID
  201. if len(videoOper.Content) != 0 {
  202. content = append(content, videoOper.Content)
  203. }
  204. remark = strings.TrimSpace(videoOper.Remark)
  205. if len(remark) != 0 {
  206. content = append(content, fmt.Sprintf("备注:%s", strings.Replace(remark, "\n", ",", -1)))
  207. }
  208. } else {
  209. //稿件审核操作
  210. if arcOper, err = s.arc.LastArcOper(c, a.ID); err != nil || arcOper == nil || arcOper.AID <= 0 {
  211. log.Error("sendMail s.arc.LastArcOper(aid(%d)) error(%v) or not found", a.ID, err)
  212. return
  213. }
  214. mngUID = arcOper.UID
  215. if len(arcOper.Content) != 0 {
  216. content = append(content, arcOper.Content)
  217. }
  218. remark = strings.TrimSpace(arcOper.Remark)
  219. if len(remark) != 0 {
  220. content = append(content, fmt.Sprintf("备注: %s", strings.Replace(remark, "\n", ",", -1)))
  221. }
  222. }
  223. //审核人员信息
  224. if mngUser, err = s.mng.User(c, mngUID); err != nil || mngUser == nil || mngUser.ID != mngUID {
  225. log.Error("s.mng.User(%d) error(%v) or not found(%d)", arcOper.UID, err, mngUser)
  226. return
  227. }
  228. if len(condition) > 0 {
  229. params := map[string]string{
  230. "aid": strconv.FormatInt(a.ID, 10),
  231. "title": a.Title,
  232. "upName": pfl.Profile.Name,
  233. "condition": strings.Join(condition, "/"),
  234. "change": strings.Join(content, " ,"),
  235. "uid": strconv.FormatInt(mngUser.ID, 10),
  236. "username": mngUser.Username,
  237. "department": mngUser.Department,
  238. "typeId": strconv.Itoa(int(s.topType(a.TypeID))),
  239. "fromVideo": strconv.FormatBool(fromVideo),
  240. }
  241. tpl := s.email.NotifyEmailTemplate(params)
  242. s.email.PushToRedis(c, tpl)
  243. }
  244. if len(additionCondition) > 0 {
  245. params := map[string]string{
  246. "aid": strconv.FormatInt(a.ID, 10),
  247. "title": a.Title,
  248. "upName": pfl.Profile.Name,
  249. "condition": strings.Join(additionCondition, "/"),
  250. "change": strings.Join(content, " ,"),
  251. "uid": strconv.FormatInt(mngUser.ID, 10),
  252. "username": mngUser.Username,
  253. "department": mngUser.Department,
  254. "typeId": additionType,
  255. "fromVideo": strconv.FormatBool(fromVideo),
  256. }
  257. tpl := s.email.NotifyEmailTemplate(params)
  258. s.email.PushToRedis(c, tpl)
  259. }
  260. return
  261. }
  262. func (s *Service) emailProc() {
  263. defer s.waiter.Done()
  264. for {
  265. if s.closed {
  266. return
  267. }
  268. s.email.Start(emailmdl.MailKey)
  269. time.Sleep(200 * time.Millisecond)
  270. }
  271. }
  272. func (s *Service) emailFastProc() {
  273. defer s.waiter.Done()
  274. var (
  275. err error
  276. )
  277. for {
  278. if s.closed {
  279. return
  280. }
  281. <-s.email.FastChan()
  282. log.Info("emailFastProc start to handle")
  283. for {
  284. if s.closed {
  285. return
  286. }
  287. err = s.email.Start(emailmdl.MailFastKey)
  288. if err == redis.ErrNil {
  289. log.Info("emailFastProc start to rest")
  290. break
  291. }
  292. time.Sleep(200 * time.Millisecond)
  293. }
  294. }
  295. }