archive.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545
  1. package service
  2. import (
  3. "context"
  4. "encoding/json"
  5. "strings"
  6. "time"
  7. "fmt"
  8. "go-common/app/job/main/videoup-report/model/archive"
  9. "go-common/library/database/sql"
  10. "go-common/library/log"
  11. )
  12. // hdlArchiveMessage deal with archive action
  13. func (s *Service) hdlArchiveMessage(action string, nwMsg []byte, oldMsg []byte) {
  14. var (
  15. err error
  16. arc = &archive.Archive{}
  17. oldArc = &archive.Archive{}
  18. )
  19. if action != _updateAct {
  20. return
  21. }
  22. if err = json.Unmarshal(nwMsg, arc); err != nil {
  23. log.Error("json.Unmarshal(%s) error(%v)", nwMsg, err)
  24. return
  25. }
  26. if err = json.Unmarshal(oldMsg, oldArc); err != nil {
  27. log.Error("json.Unmarshal(%s) error(%v)", oldMsg, err)
  28. return
  29. }
  30. if arc.TypeID != oldArc.TypeID {
  31. s.hdlMoveType(arc, oldArc)
  32. }
  33. if arc.Round != oldArc.Round {
  34. s.hdlRoundFlow(arc, oldArc)
  35. }
  36. if arc.State != oldArc.State && arc.State == archive.StateForbidUpDelete {
  37. s.arc.DelDispatchByAid(context.TODO(), arc.ID)
  38. }
  39. }
  40. // hdlMoveType deal with archive move typeid
  41. func (s *Service) hdlMoveType(arc *archive.Archive, oldArc *archive.Archive) {
  42. if _, ok := archive.ReportArchiveRound[arc.Round]; !ok {
  43. return
  44. }
  45. s.arcMoveTypeCache.Lock()
  46. defer s.arcMoveTypeCache.Unlock()
  47. if _, ok := s.arcMoveTypeCache.Data[arc.Round]; !ok {
  48. s.arcMoveTypeCache.Data[arc.Round] = make(map[int16]map[string]int)
  49. }
  50. if _, ok := s.arcMoveTypeCache.Data[arc.Round][oldArc.TypeID]; !ok {
  51. s.arcMoveTypeCache.Data[arc.Round][oldArc.TypeID] = make(map[string]int)
  52. }
  53. if _, ok := s.arcMoveTypeCache.Data[arc.Round][arc.TypeID]; !ok {
  54. s.arcMoveTypeCache.Data[arc.Round][arc.TypeID] = make(map[string]int)
  55. }
  56. s.arcMoveTypeCache.Data[arc.Round][oldArc.TypeID]["out"]++
  57. s.arcMoveTypeCache.Data[arc.Round][arc.TypeID]["in"]++
  58. }
  59. // hdlRoundFlow deal with archive round flow
  60. func (s *Service) hdlRoundFlow(arc *archive.Archive, oldArc *archive.Archive) {
  61. var (
  62. oper *archive.Oper
  63. newOper *archive.Oper
  64. err error
  65. )
  66. if _, ok := archive.ReportArchiveRound[oldArc.Round]; !ok {
  67. return
  68. }
  69. if oper, err = s.arc.LastRoundOper(context.TODO(), oldArc.ID, oldArc.Round); err != nil {
  70. log.Error("s.LastRoundOper(%d,%d) 获取archive_oper记录失败 error(%v)", oldArc.ID, oldArc.Round, err)
  71. return
  72. }
  73. if newOper, err = s.arc.NextRoundOper(context.TODO(), oper.ID, oldArc.ID, oldArc.Round); err != nil {
  74. log.Error("s.NextRoundOper(%d,%d,%d) 获取archive_oper记录失败 error(%v)", oper.ID, oldArc.ID, oldArc.Round, err)
  75. return
  76. }
  77. s.arcRoundFlowCache.Lock()
  78. defer s.arcRoundFlowCache.Unlock()
  79. if _, ok := s.arcRoundFlowCache.Data[oldArc.Round]; !ok {
  80. s.arcRoundFlowCache.Data[oldArc.Round] = make(map[int64]map[string]int)
  81. }
  82. if _, ok := s.arcRoundFlowCache.Data[oldArc.Round][oldArc.ID]; !ok {
  83. s.arcRoundFlowCache.Data[oldArc.Round][oldArc.ID] = make(map[string]int)
  84. }
  85. s.arcRoundFlowCache.Data[oldArc.Round][oldArc.ID]["take_time"] = int(newOper.MTime.Unix() - oper.MTime.Unix())
  86. s.arcRoundFlowCache.Data[oldArc.Round][oldArc.ID]["uid"] = int(newOper.UID)
  87. log.Info("s.arcRoundFlowCache.Data: %v", s.arcRoundFlowCache.Data)
  88. }
  89. // hdlMoveTypeCount check and write archive move type stats to db
  90. func (s *Service) hdlMoveTypeCount() {
  91. var (
  92. report *archive.Report
  93. err error
  94. bs []byte
  95. ctime = time.Now()
  96. mtime = ctime
  97. )
  98. s.arcMoveTypeCache.Lock()
  99. defer s.arcMoveTypeCache.Unlock()
  100. if len(s.arcMoveTypeCache.Data) < 1 {
  101. log.Info("s.hdlMoveTypeCount() 统计内容为空,忽略:%v", s.arcMoveTypeCache.Data)
  102. return
  103. }
  104. if report, err = s.arc.ReportLast(context.TODO(), archive.ReportTypeArcMoveType); err != nil {
  105. log.Error("s.arc.ReportLast(%d) error(%v)", archive.ReportTypeArcMoveType, err)
  106. return
  107. }
  108. if report != nil && time.Now().Unix()-report.CTime.Unix() < 5*60 {
  109. log.Info("s.arc.ReportLast(%d) 距离上一次写入还没过5分钟!", archive.ReportTypeArcMoveType)
  110. return
  111. }
  112. if bs, err = json.Marshal(s.arcMoveTypeCache.Data); err != nil {
  113. log.Error("json.Marshal(%v) error(%v)", s.arcMoveTypeCache.Data, err)
  114. return
  115. }
  116. if _, err = s.arc.ReportAdd(context.TODO(), archive.ReportTypeArcMoveType, string(bs), ctime, mtime); err != nil {
  117. log.Error("s.arc.ReportAdd(%d,%s,%v,%v) error(%v)", archive.ReportTypeArcMoveType, string(bs), ctime, mtime, err)
  118. return
  119. }
  120. s.arcMoveTypeCache.Data = make(map[int8]map[int16]map[string]int)
  121. }
  122. // hdlRoundFlowCount check and write archive round flow stats to db
  123. func (s *Service) hdlRoundFlowCount() {
  124. var (
  125. report *archive.Report
  126. err error
  127. bs []byte
  128. ctime = time.Now()
  129. mtime = ctime
  130. )
  131. s.arcRoundFlowCache.Lock()
  132. defer s.arcRoundFlowCache.Unlock()
  133. if len(s.arcRoundFlowCache.Data) < 1 {
  134. log.Info("s.hdlRoundFlowCount() 统计内容为空,忽略:%v", s.arcRoundFlowCache.Data)
  135. return
  136. }
  137. if report, err = s.arc.ReportLast(context.TODO(), archive.ReportTypeArcRoundFlow); err != nil {
  138. log.Error("s.arc.ReportLast(%d) error(%v)", archive.ReportTypeArcRoundFlow, err)
  139. return
  140. }
  141. if report != nil && time.Now().Unix()-report.CTime.Unix() < 5*60 {
  142. log.Info("s.arc.ReportLast(%d) 距离上一次写入还没过5分钟!", archive.ReportTypeArcRoundFlow)
  143. return
  144. }
  145. if bs, err = json.Marshal(s.arcRoundFlowCache.Data); err != nil {
  146. log.Error("json.Marshal(%v) error(%v)", s.arcRoundFlowCache.Data, err)
  147. return
  148. }
  149. if _, err = s.arc.ReportAdd(context.TODO(), archive.ReportTypeArcRoundFlow, string(bs), ctime, mtime); err != nil {
  150. log.Error("s.arc.ReportAdd(%d,%s,%v,%v) error(%v)", archive.ReportTypeArcRoundFlow, string(bs), ctime, mtime, err)
  151. return
  152. }
  153. s.arcRoundFlowCache.Data = make(map[int8]map[int64]map[string]int)
  154. }
  155. // MoveType get archive move type stats by typeid
  156. func (s *Service) MoveType(c context.Context, stime, etime time.Time) (reports []*archive.Report, err error) {
  157. if reports, err = s.arc.Reports(c, archive.ReportTypeArcMoveType, stime, etime); err != nil {
  158. log.Error("s.arc.Reports(%d) err(%v)", archive.ReportTypeArcMoveType, err)
  159. return
  160. }
  161. return
  162. }
  163. // RoundFlow get archive round flow take time records
  164. func (s *Service) RoundFlow(c context.Context, stime, etime time.Time) (reports []*archive.Report, err error) {
  165. if reports, err = s.arc.Reports(c, archive.ReportTypeArcRoundFlow, stime, etime); err != nil {
  166. log.Error("s.arc.Reports(%d) err(%v)", archive.ReportTypeArcRoundFlow, err)
  167. return
  168. }
  169. return
  170. }
  171. func (s *Service) arcUpdateproc(k int) {
  172. defer s.waiter.Done()
  173. for {
  174. var (
  175. upInfo *archive.UpInfo
  176. ok bool
  177. )
  178. if upInfo, ok = <-s.arcUpChs[k]; !ok {
  179. log.Info("s.arcUpChs[k] closed", k)
  180. return
  181. }
  182. go s.hdlExcitation(upInfo.Nw, upInfo.Old)
  183. go s.hdlMonitorArc(upInfo.Nw, upInfo.Old)
  184. s.trackArchive(upInfo.Nw, upInfo.Old)
  185. go s.arcStateChange(upInfo.Nw, upInfo.Old, true)
  186. }
  187. }
  188. func (s *Service) putArcChan(action string, nwMsg []byte, oldMsg []byte) {
  189. var (
  190. err error
  191. chanSize = int64(s.c.ChanSize)
  192. )
  193. nw := &archive.Archive{}
  194. if err = json.Unmarshal(nwMsg, nw); err != nil {
  195. log.Error("json.Unmarshal(%s) error(%v)", nwMsg, err)
  196. return
  197. }
  198. switch action {
  199. case _insertAct:
  200. s.arcUpChs[nw.ID%chanSize] <- &archive.UpInfo{Nw: nw, Old: nil}
  201. case _updateAct:
  202. old := &archive.Archive{}
  203. if err = json.Unmarshal(oldMsg, old); err != nil {
  204. log.Error("json.Unmarshal(%s) error(%v)", oldMsg, err)
  205. return
  206. }
  207. s.arcUpChs[nw.ID%chanSize] <- &archive.UpInfo{Nw: nw, Old: old}
  208. }
  209. }
  210. // secondRound 接收到databus的second_round消息。
  211. func (s *Service) secondRound(c context.Context, m *archive.VideoupMsg) (err error) {
  212. var (
  213. a *archive.Archive
  214. )
  215. if a, err = s.arc.ArchiveByAid(c, m.Aid); err != nil || a.ID <= 0 {
  216. log.Error("secondRound s.arc.ArchiveByAid error(%v)/not found aid(%d)", err, m.Aid)
  217. return
  218. }
  219. s.dealFromList(c, m)
  220. s.dealMissionTag(c, m, a)
  221. //开评论逻辑判断
  222. s.arcStateChange(a, nil, true)
  223. if archive.NormalState(a.State) {
  224. s.adminBindTag(c, a.Mid, a.ID, a.Tag, a.TypeID)
  225. }
  226. //邮件发送开关
  227. if m.SendEmail {
  228. if m.AdminChange && !s.isPGC(a.ID) {
  229. s.sendMail(c, a, nil)
  230. }
  231. s.sendArchivePrivateEmail(c, a)
  232. }
  233. return
  234. }
  235. // dealFromList 处理from list流程
  236. func (s *Service) dealFromList(c context.Context, m *archive.VideoupMsg) (err error) {
  237. defer func() {
  238. if pErr := recover(); pErr != nil {
  239. log.Error("s.dealFromList panic(%v)", pErr)
  240. }
  241. }()
  242. switch m.FromList {
  243. case archive.FromListHotReview: //热门回查
  244. var (
  245. has = false
  246. state = archive.RecheckStateWait
  247. )
  248. //查询flow_design中是否存在禁止
  249. if has, err = s.arc.HasFlowGroup(c, archive.FlowPoolRecheck, archive.FlowGroupIDHot, m.Aid); err != nil {
  250. log.Error("s.updateRecheckState(%d,%d,%d,%d) error(%v)", archive.TypeHotRecheck, archive.FlowPoolRecheck, archive.FlowGroupIDHot, m.Aid, err)
  251. return
  252. }
  253. if has {
  254. state = archive.RecheckStateForbid
  255. } else {
  256. state = archive.RecheckStateNoForbid
  257. }
  258. s.updateRecheckState(c, archive.TypeHotRecheck, m.Aid, state)
  259. case archive.FromListExcitation: //激励回查
  260. s.updateRecheckState(c, archive.TypeExcitationRecheck, m.Aid, archive.RecheckStateNoForbid)
  261. default:
  262. log.Warn("Unknown message from_list (%s)", m.FromList)
  263. }
  264. return
  265. }
  266. // dealMissionTag 处理活动tag
  267. func (s *Service) dealMissionTag(c context.Context, m *archive.VideoupMsg, a *archive.Archive) (err error) {
  268. defer func() {
  269. if pErr := recover(); pErr != nil {
  270. log.Error("s.dealMissionTag panic(%v)", pErr)
  271. }
  272. }()
  273. if m.MissionID != 0 { //消息里的mission_id是修改之前的
  274. addit, err := s.arc.Addit(c, m.Aid)
  275. if err != nil {
  276. log.Error("s.arc.Addit(%d) error(%v)", m.Aid, err)
  277. } else if addit == nil {
  278. log.Warn("s.arc.Addit(%d) warn(addit is nil)", m.Aid)
  279. } else if addit.MissionID == 0 {
  280. //取消活动资格,去掉活动tag
  281. tags, err := s.removeMissionTags(c, a)
  282. if err == nil {
  283. a.Tag = strings.Join(tags, ",")
  284. }
  285. }
  286. }
  287. return
  288. }
  289. // updateRecheckState 回查提交时的事件
  290. func (s *Service) updateRecheckState(c context.Context, tp int, aid int64, state int8) (err error) {
  291. //修改archive_recheck的state
  292. if err = s.arc.UpdateRecheckState(c, tp, aid, state); err != nil {
  293. return
  294. }
  295. a, err := s.arc.ArchiveByAid(c, aid)
  296. if err != nil {
  297. log.Error("s.arc.ArchiveByAid error(%v)", err)
  298. err = nil
  299. return
  300. }
  301. tpStr := archive.RecheckType(tp)
  302. if tpStr != "" {
  303. s.arc.AddArchiveOper(c, aid, a.Attribute, a.TypeID, a.State, a.Round, 0, "", "已"+tpStr)
  304. }
  305. return
  306. }
  307. // addHotRecheck get hot archive from data api, and insert to archive_recheck table
  308. func (s *Service) addHotRecheck() (err error) {
  309. var (
  310. c = context.TODO()
  311. aids []int64
  312. )
  313. if aids, err = s.dataDao.HotArchive(c); err != nil {
  314. log.Error("s.addHotRecheck() s.dataDao.HotArchive() error(%v)", err)
  315. return
  316. }
  317. if err = s.arc.AddRecheckAids(c, archive.TypeHotRecheck, aids, true); err != nil {
  318. log.Error("s.addHotRecheck() s.arc.AddRecheckAids error(%v)", err)
  319. return
  320. }
  321. return
  322. }
  323. func (s *Service) addArchive(c context.Context, m *archive.VideoupMsg) (err error) {
  324. var (
  325. a *archive.Archive
  326. addit *archive.Addit
  327. tx *sql.Tx
  328. channelDiff, operRemark string
  329. operConts []string
  330. )
  331. if a, err = s.arc.ArchiveByAid(c, m.Aid); err != nil || a.ID <= 0 {
  332. log.Error("addArchive s.arc.ArchiveByAid error(%v)/not found aid(%d)", err, m.Aid)
  333. return
  334. }
  335. //同步到tag服务方,以便在前台显示
  336. if err = s.upBindTag(c, a.Mid, m.Aid, a.Tag, a.TypeID); err != nil {
  337. return
  338. }
  339. if addit, err = s.arc.Addit(c, m.Aid); err != nil {
  340. log.Error("modifyArchive s.arc.Addit error(%v) aid(%d)", err, m.Aid)
  341. return
  342. }
  343. if tx, err = s.arc.BeginTran(c); err != nil {
  344. log.Error("addArchive s.arc.BeginTran error(%v)", err)
  345. return
  346. }
  347. //非活动的ugc稿件
  348. if addit == nil || (!addit.IsPGC() && addit.MissionID <= 0) {
  349. if channelDiff, operRemark, err = s.txAddChannelReview(c, tx, m.Aid); err != nil {
  350. log.Error("addArchive s.txAddChannelReview(%d) error(%v)", m.Aid, err)
  351. tx.Rollback()
  352. return
  353. }
  354. if channelDiff != "" {
  355. operConts = append(operConts, channelDiff)
  356. }
  357. }
  358. if err = tx.Commit(); err != nil {
  359. log.Error("addArchive tx.Commit() error(%v) aid(%d)", err, m.Aid)
  360. return
  361. }
  362. if len(operConts) > 0 && operRemark != "" {
  363. s.arc.AddArchiveOper(c, m.Aid, a.Attribute, a.TypeID, a.State, a.Round, 0, strings.Join(operConts, ","), operRemark)
  364. }
  365. return
  366. }
  367. func (s *Service) modifyArchive(c context.Context, m *archive.VideoupMsg) (err error) {
  368. var (
  369. a *archive.Archive
  370. addit *archive.Addit
  371. tx *sql.Tx
  372. channelDiff, operRemark string
  373. operConts []string
  374. )
  375. if a, err = s.arc.ArchiveByAid(c, m.Aid); err != nil || a.ID <= 0 {
  376. log.Error("modifyArchive s.arc.ArchiveByAid error(%v)/not found aid(%d)", err, m.Aid)
  377. return
  378. }
  379. //tag修改或分区修改时,同步到tag服务方,以便在前台显示,即使失败也不影响后续
  380. if m.TagChange || m.ChangeTypeID {
  381. s.upBindTag(c, a.Mid, m.Aid, a.Tag, a.TypeID)
  382. }
  383. if addit, err = s.arc.Addit(c, m.Aid); err != nil {
  384. log.Error("modifyArchive s.arc.Addit error(%v) aid(%d)", err, m.Aid)
  385. return
  386. }
  387. if tx, err = s.arc.BeginTran(c); err != nil {
  388. log.Error("modifyArchive s.arc.BeginTran error(%v)", err)
  389. return
  390. }
  391. //新增视频 且 非活动的ugc稿件
  392. if m.AddVideos && (addit == nil || (!addit.IsPGC() && addit.MissionID <= 0)) {
  393. log.Info("begin to check channel review aid(%d)", m.Aid)
  394. if channelDiff, operRemark, err = s.txAddChannelReview(c, tx, m.Aid); err != nil {
  395. log.Error("modifyArchive s.txAddChannelReview(%d) error(%v)", m.Aid, err)
  396. tx.Rollback()
  397. return
  398. }
  399. if channelDiff != "" {
  400. operConts = append(operConts, channelDiff)
  401. }
  402. }
  403. if err = tx.Commit(); err != nil {
  404. log.Error("modifyArchive tx.Commit() error(%v) aid(%d)", err, m.Aid)
  405. return
  406. }
  407. if len(operConts) > 0 && operRemark != "" {
  408. s.arc.AddArchiveOper(c, m.Aid, a.Attribute, a.TypeID, a.State, a.Round, 0, strings.Join(operConts, ","), operRemark)
  409. }
  410. return
  411. }
  412. func (s *Service) autoOpen(c context.Context, m *archive.VideoupMsg) (err error) {
  413. var (
  414. a *archive.Archive
  415. )
  416. if a, err = s.arc.ArchiveByAid(c, m.Aid); err != nil || a.ID <= 0 {
  417. log.Error("autoOpen s.arc.ArchiveByAid error(%v)/not found aid(%d)", err, m.Aid)
  418. return
  419. }
  420. s.adminBindTag(c, a.Mid, a.ID, a.Tag, a.TypeID)
  421. return
  422. }
  423. func (s *Service) delayOpen(c context.Context, m *archive.VideoupMsg) (err error) {
  424. var (
  425. a *archive.Archive
  426. )
  427. if a, err = s.arc.ArchiveByAid(c, m.Aid); err != nil || a.ID <= 0 {
  428. log.Error("autoOpen s.arc.ArchiveByAid error(%v)/not found aid(%d)", err, m.Aid)
  429. return
  430. }
  431. s.adminBindTag(c, a.Mid, a.ID, a.Tag, a.TypeID)
  432. return
  433. }
  434. func (s *Service) postFirstRound(c context.Context, m *archive.VideoupMsg) (err error) {
  435. var (
  436. v *archive.Video
  437. a *archive.Archive
  438. )
  439. if v, err = s.arc.NewVideo(c, m.Filename); err != nil || v == nil {
  440. log.Error("postFirstRound s.arc.NewVideo error(%v)/not found filename(%d)", err, m.Filename)
  441. return
  442. }
  443. if a, err = s.arc.ArchiveByAid(c, m.Aid); err != nil || a.ID <= 0 {
  444. log.Error("postFirstRound s.arc.ArchiveByAid error(%v)/not found aid(%d)", err, m.Aid)
  445. return
  446. }
  447. if a.State == archive.StateForbidUpDelete {
  448. log.Warn("postFirstRound archive(%d) filename(%s) state(%d) is deleted", a.ID, v.Filename, a.State)
  449. return
  450. }
  451. if m.AdminChange && !s.isPGC(a.ID) {
  452. s.sendMail(c, a, v)
  453. }
  454. s.sendVideoPrivateEmail(c, a, v)
  455. return
  456. }
  457. func (s *Service) isPGC(aid int64) (is bool) {
  458. is = false
  459. if ad, _ := s.arc.Addit(context.TODO(), aid); ad != nil && ad.IsPGC() {
  460. is = true
  461. }
  462. return
  463. }
  464. func (s *Service) arcStateChange(nw *archive.Archive, old *archive.Archive, canOpen bool) (err error) {
  465. defer func() {
  466. if pErr := recover(); pErr != nil {
  467. log.Error("s.arcStateChange panic(%v)", pErr)
  468. }
  469. }()
  470. if nw == nil {
  471. return
  472. }
  473. oldValue := 0
  474. if old != nil {
  475. oldValue = isOpenReplyState(old.State)
  476. }
  477. switchVal := isOpenReplyState(nw.State) - oldValue
  478. //关评论
  479. if switchVal < 0 && !canOpen {
  480. s.arcReply(context.TODO(), nw, archive.ReplyOff)
  481. }
  482. //开评论
  483. if switchVal > 0 && canOpen {
  484. s.arcReply(context.TODO(), nw, archive.ReplyOn)
  485. }
  486. return
  487. }
  488. //removeMissionTags 删除活动tag
  489. func (s *Service) removeMissionTags(c context.Context, a *archive.Archive) (tags []string, err error) {
  490. tags = strings.Split(a.Tag, ",")
  491. for i := 0; i < len(tags); i++ {
  492. if _, ok := s.missTagsCache[tags[i]]; ok {
  493. tags = append(tags[:i], tags[i+1:]...)
  494. i--
  495. continue
  496. }
  497. }
  498. tagStr := strings.Join(tags, ",")
  499. if err = s.adminBindTag(c, a.Mid, a.ID, tagStr, a.TypeID); err != nil {
  500. log.Error("removeMissionTags(%v) s.adminBindTag() error(%v)", a, err)
  501. return
  502. }
  503. if _, err = s.arc.UpTag(c, a.ID, tagStr); err != nil {
  504. log.Error("s.arc.UpTag(%d,%s) error(%v)", a.ID, tagStr, err)
  505. err = nil
  506. }
  507. if _, err = s.arc.AddArchiveOper(c, a.ID, a.Attribute, a.TypeID, a.State, a.Round, 0, fmt.Sprintf("[Tag]从[%s]设为[%s]", a.Tag, tagStr), "因被取消活动资格"); err != nil {
  508. log.Error("s.arc.AddArchiveOper() archive(%v) error(%v)", a, err)
  509. err = nil
  510. }
  511. return
  512. }