report.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663
  1. package service
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/json"
  6. "fmt"
  7. "math"
  8. "strconv"
  9. "sync"
  10. "time"
  11. "go-common/app/admin/main/dm/dao"
  12. "go-common/app/admin/main/dm/model"
  13. "go-common/app/service/main/archive/api"
  14. "go-common/app/service/main/archive/model/archive"
  15. "go-common/library/ecode"
  16. "go-common/library/log"
  17. "go-common/library/sync/errgroup"
  18. )
  19. const (
  20. _searchTimeFormat = "2006-01-02 15:04:05"
  21. )
  22. // ChangeReportStat set dm report status by mult dmid.
  23. func (s *Service) ChangeReportStat(c context.Context, cidDmids map[int64][]int64, state, reason, notice int8, adminID, block, blockReason, moral int64, remark, operator string) (affect int64, err error) {
  24. var (
  25. optDur int64
  26. dmids []int64
  27. dmidList = make([]int64, 0)
  28. nowTime = time.Now()
  29. dmLogMap = make(map[int64][]*model.ReportLog)
  30. rptsMap = make(map[int64]*model.Report)
  31. uptRpts = make([]*model.UptSearchReport, 0)
  32. )
  33. for _, dmids2 := range cidDmids {
  34. dmids = append(dmids, dmids2...)
  35. }
  36. if state == model.StatFirstInit || state == model.StatSecondInit || state == model.StatJudgeInit {
  37. if rptsMap, err = s.reports(c, dmids); err != nil {
  38. log.Error("s.reports(cidDmids:%v) error(%v)", cidDmids, err)
  39. return
  40. }
  41. } else {
  42. if rptsMap, err = s.reportsDetail(c, dmids); err != nil {
  43. log.Error("s.reportsDetail(cidDmids:%v) error(%v)", cidDmids, err)
  44. return
  45. }
  46. }
  47. for cid, dmids := range cidDmids {
  48. if state == model.StatSecondIgnore || state == model.StatFirstIgnore {
  49. if err = s.dao.IgnoreReport(c, cid, dmids, state); err != nil {
  50. log.Error("s.dao.IgnoreReport(cid:%d, dmid:%v) error(%v)", cid, dmids, err)
  51. return 0, err
  52. }
  53. } else {
  54. if err = s.dao.ChangeReportStat(c, cid, dmids, state); err != nil {
  55. log.Error("s.dao.ChangeReportStat(cid:%d, dmid:%v) error(%v)", cid, dmids, err)
  56. return 0, err
  57. }
  58. }
  59. var rpts []*model.Report
  60. if rpts, err = s.dao.Reports(c, cid, dmids); err != nil {
  61. log.Error("s.dao.Reports(cid:%d, dmids:%v) error(%v)", cid, dmids, err)
  62. err = nil
  63. } else {
  64. for _, rpt := range rpts {
  65. var ctime, mtime time.Time
  66. ctime, err = time.Parse(time.RFC3339, rpt.Ctime)
  67. if err != nil {
  68. log.Error("strconv.RarseInt(%s) error(%v)", rpt.Ctime, err)
  69. err = nil
  70. continue
  71. }
  72. mtime, err = time.Parse(time.RFC3339, rpt.Mtime)
  73. if err != nil {
  74. log.Error("strconv.RarseInt(%s) error(%v)", rpt.Mtime, err)
  75. err = nil
  76. continue
  77. }
  78. uptRpt := &model.UptSearchReport{
  79. DMid: rpt.Did,
  80. Ctime: ctime.Format("2006-01-02 15:04:05"),
  81. Mtime: mtime.Format("2006-01-02 15:04:05"),
  82. State: state,
  83. }
  84. uptRpts = append(uptRpts, uptRpt)
  85. }
  86. }
  87. for _, dmid := range dmids {
  88. rpt, ok := rptsMap[dmid]
  89. if !ok {
  90. err = fmt.Errorf("get report detail empty,dmid:%d", dmid)
  91. log.Error("s.ReportsDetail(cid:%d, dmid:%v) error(%v)", cid, dmid, err)
  92. continue
  93. }
  94. if isDeleteOperation(state) {
  95. s.addRptDelAction(rpt)
  96. }
  97. rpt.State = state
  98. var mtime time.Time
  99. if mtime, err = time.ParseInLocation("2006-01-02 15:04:05", rpt.Mtime, time.Local); err == nil {
  100. optDur = int64(time.Since(mtime).Seconds())
  101. }
  102. lg := &model.ReportLog{
  103. Did: dmid,
  104. AdminID: adminID,
  105. Reason: reason,
  106. Result: state,
  107. Remark: remark,
  108. Elapsed: optDur,
  109. Ctime: nowTime,
  110. Mtime: nowTime,
  111. }
  112. dmLogMap[dao.LogTable(rpt.Did)] = append(dmLogMap[dao.LogTable(rpt.Did)], lg)
  113. dmidList = append(dmidList, rpt.Did)
  114. // if moral > 0 {
  115. // s.reduceMoral(c, rpt.UID, moral, reason, uname, fmt.Sprintf("%s, cid:%d, dmid:%d", model.CheckStateBelong(state), cid, dmid))
  116. // }
  117. if block != 0 {
  118. s.blockUser(c, rpt, block, blockReason, moral, operator)
  119. }
  120. if notice == model.NoticeReporter || notice == model.NoticeAll { // 发送邮件给举报方
  121. if len(rpt.RptUsers) > 0 {
  122. s.sendMsgToReporter(c, rpt, block, blockReason, int64(reason))
  123. }
  124. }
  125. if notice == model.NoticePoster || notice == model.NoticeAll {
  126. if len(rpt.RptUsers) > 0 {
  127. s.sendMsgToPoster(c, rpt, block, blockReason, int64(reason))
  128. }
  129. }
  130. }
  131. // if delete or recover this danmu
  132. if isDeleteOperation(state) {
  133. tmpRemark := model.AdminRptReason[reason] + "," + model.BlockReason[int8(blockReason)]
  134. if len(remark) >= 0 {
  135. tmpRemark = remark + "," + tmpRemark
  136. }
  137. // s.dao.SetStateByIDs(c, model.SubTypeVideo, cid, dmids, model.StateReportDelete)
  138. // s.OpLog(c, cid, adminID, 1, dmids, "status", "", fmt.Sprint(model.StateReportDelete), tmpRemark, oplog.SourceManager, oplog.OperatorAdmin)
  139. s.editDmState(c, model.SubTypeVideo, model.StateReportDelete, cid, reason, dmids, float64(moral), adminID, operator, tmpRemark)
  140. }
  141. }
  142. if isDeleteOperation(state) {
  143. // search update ignore error
  144. s.uptSearchDmState(c, model.SubTypeVideo, model.StateReportDelete, cidDmids)
  145. }
  146. if !(state == model.StatSecondInit || state == model.StatFirstInit) {
  147. if err = s.ChangeReportUserStat(c, dmidList); err != nil {
  148. log.Error("s.ChangeReportUserStat(%v) error(%v)", dmidList, err)
  149. }
  150. }
  151. if len(uptRpts) > 0 {
  152. if err = s.dao.UptSearchReport(c, uptRpts); err != nil {
  153. log.Error("s.dao.UpSearchReport(%v) error(%v)", uptRpts, err)
  154. err = nil
  155. }
  156. }
  157. for k, v := range dmLogMap {
  158. if len(v) <= 0 {
  159. continue
  160. }
  161. if err = s.dao.AddReportLog(c, k, v); err != nil {
  162. log.Error("s.dao.AddReportLog(%v) error(%v)", v, err)
  163. return
  164. }
  165. }
  166. return
  167. }
  168. func isDeleteOperation(state int8) bool {
  169. if state == model.StatSecondDelete || state == model.StatFirstDelete || state == model.StatSecondAutoDelete || state == model.StatJudgeDelete {
  170. return true
  171. }
  172. return false
  173. }
  174. func (s *Service) dmState(c context.Context, cidDmids map[int64][]int64) (stateMap map[int64]int64, err error) {
  175. var (
  176. idxMap map[int64]*model.DM
  177. tp = int32(1)
  178. )
  179. stateMap = make(map[int64]int64)
  180. for oid, dmids := range cidDmids {
  181. if idxMap, _, err = s.dao.IndexsByID(c, tp, oid, dmids); err != nil {
  182. log.Error("s.dmState(oid:%v,dmids:%v) err(%v)", oid, dmids, err)
  183. return
  184. }
  185. for dmid, dm := range idxMap {
  186. stateMap[dmid] = int64(dm.State)
  187. }
  188. }
  189. return
  190. }
  191. // ReportList2 .
  192. func (s *Service) ReportList2(c context.Context, params *model.ReportListParams) (rtList *model.ReportList, err error) {
  193. var (
  194. aidMap = make(map[int64]bool)
  195. aids []int64
  196. cidDmids = make(map[int64][]int64)
  197. stateMap = make(map[int64]int64)
  198. )
  199. if params.Start == "" {
  200. now := time.Now()
  201. params.Start = time.Date(now.Year(), now.Month(), now.Day()-3, 0, 0, 0, 0, now.Location()).Format(_searchTimeFormat)
  202. }
  203. if params.End == "" {
  204. now := time.Now()
  205. params.End = time.Date(now.Year(), now.Month(), now.Day()+1, 0, 0, 0, 0, now.Location()).Format(_searchTimeFormat)
  206. }
  207. rptSearch, err := s.dao.SearchReport2(c, params)
  208. if err != nil {
  209. log.Error("s.dao.SearchReport2(params:%+v) error(%v)", params, err)
  210. return
  211. }
  212. for _, v := range rptSearch.Result {
  213. aidMap[v.Aid] = true
  214. cidDmids[v.Cid] = append(cidDmids[v.Cid], v.Did)
  215. }
  216. for aid := range aidMap {
  217. aids = append(aids, aid)
  218. }
  219. archives, err := s.archiveInfos(c, aids)
  220. if err != nil {
  221. log.Error("s.archives(%v) error(%v)", aids, err)
  222. return
  223. }
  224. if stateMap, err = s.dmState(c, cidDmids); err != nil {
  225. return
  226. }
  227. for _, v := range rptSearch.Result {
  228. v.DidStr = strconv.FormatInt(v.Did, 10)
  229. if arc, ok := archives[v.Aid]; ok {
  230. v.Title = arc.Title
  231. }
  232. if state, ok := stateMap[v.Did]; ok {
  233. v.Deleted = state
  234. }
  235. }
  236. rtList = &model.ReportList{
  237. Code: rptSearch.Code,
  238. Order: rptSearch.Order,
  239. Page: rptSearch.Page.Num,
  240. PageSize: rptSearch.Page.Size,
  241. PageCount: (rptSearch.Page.Total-1)/rptSearch.Page.Size + 1,
  242. Total: rptSearch.Page.Total,
  243. Result: rptSearch.Result,
  244. }
  245. return
  246. }
  247. // ReportList get report list from search
  248. func (s *Service) ReportList(c context.Context, page, size int64, start, end, order, sort, keyword string, tid, rpID, state, upOp []int64, rt *model.Report) (rtList *model.ReportList, err error) {
  249. var (
  250. aidMap = make(map[int64]bool)
  251. aids []int64
  252. cidDmids = make(map[int64][]int64)
  253. stateMap = make(map[int64]int64)
  254. )
  255. rptSearch, err := s.dao.SearchReport(c, page, size, start, end, order, sort, keyword, tid, rpID, state, upOp, rt)
  256. if err != nil {
  257. log.Error("s.dao.SearchReport() error(%v)", err)
  258. return
  259. }
  260. for _, v := range rptSearch.Result {
  261. aidMap[v.Aid] = true
  262. cidDmids[v.Cid] = append(cidDmids[v.Cid], v.Did)
  263. }
  264. for aid := range aidMap {
  265. aids = append(aids, aid)
  266. }
  267. archives, err := s.archiveInfos(c, aids)
  268. if err != nil {
  269. log.Error("s.archives(%v) error(%v)", aids, err)
  270. return
  271. }
  272. if stateMap, err = s.dmState(c, cidDmids); err != nil {
  273. return
  274. }
  275. for _, v := range rptSearch.Result {
  276. v.DidStr = strconv.FormatInt(v.Did, 10)
  277. if arc, ok := archives[v.Aid]; ok {
  278. v.Title = arc.Title
  279. }
  280. if state, ok := stateMap[v.Did]; ok {
  281. v.Deleted = state
  282. }
  283. }
  284. rtList = &model.ReportList{
  285. Code: rptSearch.Code,
  286. Order: rptSearch.Order,
  287. Page: rptSearch.Page.Num,
  288. PageSize: rptSearch.Page.Size,
  289. PageCount: (rptSearch.Page.Total-1)/rptSearch.Page.Size + 1,
  290. Total: rptSearch.Page.Total,
  291. Result: rptSearch.Result,
  292. }
  293. return
  294. }
  295. func (s *Service) archiveInfos(c context.Context, aids []int64) (archives map[int64]*api.Arc, err error) {
  296. var (
  297. g errgroup.Group
  298. mu sync.Mutex
  299. l = len(aids)
  300. pagesize = 50
  301. pagenum = int(math.Ceil(float64(l) / float64(pagesize)))
  302. )
  303. archives = make(map[int64]*api.Arc)
  304. for i := 0; i < pagenum; i++ {
  305. start := i * pagesize
  306. end := (i + 1) * pagesize
  307. if end > l {
  308. end = l
  309. }
  310. g.Go(func() (err error) {
  311. arg := &archive.ArgAids2{Aids: aids[start:end]}
  312. res, err := s.arcRPC.Archives3(c, arg)
  313. if err != nil {
  314. log.Error("s.arcRPC.Archives3(%v) error(%v)", arg, err)
  315. return
  316. }
  317. for aid, info := range res {
  318. mu.Lock()
  319. archives[aid] = info
  320. mu.Unlock()
  321. }
  322. return
  323. })
  324. }
  325. err = g.Wait()
  326. return
  327. }
  328. // reportUsers get mult reports users
  329. func (s *Service) reportUsers(c context.Context, dmids []int64) (rptUsers map[int64][]*model.ReportUser, err error) {
  330. var (
  331. g errgroup.Group
  332. mu sync.Mutex
  333. dmidsMap = map[int64][]int64{}
  334. )
  335. for _, dmid := range dmids {
  336. dmidsMap[dao.UserTable(dmid)] = append(dmidsMap[dao.UserTable(dmid)], dmid)
  337. }
  338. rptUsers = make(map[int64][]*model.ReportUser)
  339. for tableID, dmids := range dmidsMap {
  340. key, value := tableID, dmids
  341. g.Go(func() (err error) {
  342. userTmp, err := s.dao.ReportUsers(c, key, value, model.NoticeUnsend)
  343. if err != nil {
  344. return
  345. }
  346. for dmid, users := range userTmp {
  347. mu.Lock()
  348. rptUsers[dmid] = users
  349. mu.Unlock()
  350. }
  351. return
  352. })
  353. }
  354. err = g.Wait()
  355. return
  356. }
  357. // reportsDetail get report list from search and get user list、archive list、dm list.
  358. func (s *Service) reportsDetail(c context.Context, dmids []int64) (res map[int64]*model.Report, err error) {
  359. var (
  360. aidMap = make(map[int64]bool)
  361. aids, dmids2 []int64
  362. )
  363. reports, err := s.reports(c, dmids)
  364. if err != nil {
  365. return
  366. }
  367. for dmid, rpt := range reports {
  368. if _, ok := aidMap[rpt.Aid]; !ok {
  369. aidMap[rpt.Aid] = true
  370. aids = append(aids, rpt.Aid)
  371. }
  372. dmids2 = append(dmids2, dmid)
  373. }
  374. archives, err := s.archiveInfos(c, aids)
  375. if err != nil {
  376. log.Error("s.archives(%v) error(%v)", aids, err)
  377. return nil, err
  378. }
  379. rptUsers, err := s.reportUsers(c, dmids2)
  380. if err != nil {
  381. log.Error("s.rptUsers(%v) error(%v)", dmids2, err)
  382. return nil, err
  383. }
  384. res = make(map[int64]*model.Report)
  385. for dmid, rpt := range reports {
  386. if arc, ok := archives[rpt.Aid]; ok {
  387. rpt.Title = arc.Title
  388. }
  389. if users, ok := rptUsers[dmid]; ok {
  390. rpt.RptUsers = users
  391. } else {
  392. rpt.RptUsers = make([]*model.ReportUser, 0)
  393. }
  394. res[dmid] = rpt
  395. }
  396. return
  397. }
  398. // reports get report list by cid and dmids from search.
  399. func (s *Service) reports(c context.Context, dmids []int64) (res map[int64]*model.Report, err error) {
  400. rptSearchList, err := s.dao.SearchReportByID(c, dmids)
  401. if err != nil || len(rptSearchList.Result) <= 0 {
  402. log.Error("dao.SearchReportByID(ids:%v) error(%v)", dmids, err)
  403. return
  404. }
  405. res = make(map[int64]*model.Report)
  406. for _, rpt := range rptSearchList.Result {
  407. res[rpt.Did] = rpt
  408. }
  409. return
  410. }
  411. // ReportLog get report log by dmid.
  412. func (s *Service) ReportLog(c context.Context, dmid int64) (res []*model.ReportLog, err error) {
  413. if res, err = s.dao.ReportLog(c, dmid); err != nil {
  414. log.Error("s.dao.ReportLog(dmid:%d) error(%v)", dmid, err)
  415. }
  416. return
  417. }
  418. // ChangeReportUserStat change report_user data
  419. func (s *Service) ChangeReportUserStat(c context.Context, dmids []int64) (err error) {
  420. var (
  421. dmidMap = map[int64][]int64{}
  422. )
  423. for _, v := range dmids {
  424. dmidMap[dao.UserTable(v)] = append(dmidMap[dao.UserTable(v)], v)
  425. }
  426. for k, v := range dmidMap {
  427. if _, err = s.dao.UpReportUserState(c, k, v, model.NoticeSend); err != nil {
  428. log.Error("s.dao.UpReportUserState(dmids:%v) error(%v)", v, err)
  429. }
  430. }
  431. return
  432. }
  433. func (s *Service) sendMsgToReporter(c context.Context, rpt *model.Report, block, blockReason, rptReason int64) {
  434. var (
  435. buf bytes.Buffer
  436. )
  437. for _, user := range rpt.RptUsers {
  438. buf.WriteString(fmt.Sprintf("%d,", user.UID))
  439. }
  440. buf.Truncate(buf.Len() - 1)
  441. m := &model.ReportMsg{
  442. Aid: rpt.Aid,
  443. Did: rpt.Did,
  444. Title: rpt.Title,
  445. Msg: rpt.Msg,
  446. RptReason: int8(rptReason),
  447. Uids: buf.String(),
  448. State: rpt.State,
  449. Block: block,
  450. BlockReason: int8(blockReason),
  451. }
  452. select {
  453. case s.msgReporterChan <- m:
  454. default:
  455. log.Error("s.msgReporterChan err, channel full(msg:%v)", m)
  456. }
  457. }
  458. func (s *Service) sendMsgToPoster(c context.Context, rpt *model.Report, block, blockReason, rptReason int64) {
  459. m := &model.ReportMsg{
  460. Aid: rpt.Aid,
  461. Did: rpt.Did,
  462. Title: rpt.Title,
  463. Msg: rpt.Msg,
  464. RptReason: int8(rptReason),
  465. Uids: fmt.Sprint(rpt.UID),
  466. Block: block,
  467. BlockReason: int8(blockReason),
  468. }
  469. select {
  470. case s.msgPosterChan <- m:
  471. default:
  472. log.Error("s.msgPosterChan err, channel full(msg:%v)", m)
  473. }
  474. }
  475. func (s *Service) reduceMoral(c context.Context, uid, moral int64, reason int8, operator, remark string) {
  476. m := &model.ReduceMoral{
  477. UID: uid,
  478. Moral: moral,
  479. Origin: 2,
  480. Reason: reason,
  481. ReasonType: 1,
  482. Operator: operator,
  483. IsNotify: 0,
  484. Remark: remark,
  485. }
  486. select {
  487. case s.reduceMoralChan <- m:
  488. default:
  489. log.Error("s.reduceMoral err, channel full(msg:%v)", m)
  490. }
  491. }
  492. func (s *Service) blockUser(c context.Context, rpt *model.Report, block, blockReason, moral int64, uname string) {
  493. var (
  494. blockEver int64
  495. blockLength int64
  496. )
  497. if block == -1 {
  498. blockEver = 1
  499. } else {
  500. blockLength = block
  501. }
  502. m := &model.BlockUser{
  503. UID: rpt.UID,
  504. BlockForever: blockEver,
  505. BlockTimeLength: blockLength,
  506. BlockRemark: fmt.Sprintf("%s, cid:%d, dmid:%d", model.CheckStateBelong(rpt.State), rpt.Cid, rpt.Did),
  507. Operator: uname,
  508. OriginType: 2,
  509. Moral: moral,
  510. ReasonType: blockReason,
  511. OriginTitle: rpt.Title,
  512. OriginContent: rpt.Msg,
  513. OriginURL: fmt.Sprintf("http://www.bilibili.com/av%d", rpt.Aid),
  514. IsNotify: 0,
  515. }
  516. select {
  517. case s.blockUserChan <- m:
  518. default:
  519. log.Error("s.blockUserChan err, channel full(msg:%v)", m)
  520. }
  521. }
  522. // DMReportJudge send report judge
  523. func (s *Service) DMReportJudge(c context.Context, cidDmids map[int64][]int64, uid int64, uname string) (err error) {
  524. var (
  525. aids []int64
  526. dmids []int64
  527. rptJudges []*model.ReportJudge
  528. )
  529. for _, dmids2 := range cidDmids {
  530. dmids = append(dmids, dmids2...)
  531. }
  532. rpts, err := s.reportsDetail(c, dmids) // get report detail by multi dmids
  533. if len(rpts) == 0 {
  534. log.Error("dmjudge error! id:%v not exist in search", dmids)
  535. return
  536. }
  537. for _, rpt := range rpts {
  538. aids = append(aids, rpt.Aid)
  539. }
  540. arg := &archive.ArgAids2{Aids: aids}
  541. archs, err := s.arcRPC.Archives3(c, arg) // get archive info
  542. if err != nil {
  543. log.Error("s.arcSvc.Archives3(aids:%v) err(%v)", aids, err)
  544. return
  545. }
  546. if len(archs) == 0 {
  547. log.Error("dmjudge error! id:%v not exist in archive rpc", aids)
  548. err = ecode.ArchiveNotExist
  549. return
  550. }
  551. for _, rpt := range rpts {
  552. j := &model.ReportJudge{}
  553. arc, ok := archs[rpt.Aid]
  554. if !ok {
  555. continue
  556. }
  557. arg := &archive.ArgVideo2{
  558. Aid: rpt.Aid,
  559. Cid: rpt.Cid,
  560. }
  561. var vInfo *api.Page
  562. if vInfo, err = s.arcRPC.Video3(c, arg); err != nil {
  563. log.Error("s.arcSvc.Video3(arg:%v) err(%v)", arg, err)
  564. j.Page = 1
  565. } else {
  566. j.Page = int64(vInfo.Page)
  567. }
  568. j.MID = rpt.UID
  569. j.Operator = uname
  570. j.OperID = uid
  571. j.OContent = rpt.Msg
  572. j.OTitle = arc.Title
  573. j.OType = 2
  574. j.OURL = fmt.Sprintf("http://www.bilibili.com/av%d", rpt.Aid)
  575. j.ReasonType = int64(model.RpReasonToJudgeReason(int8(rpt.RpType)))
  576. j.AID = rpt.Aid
  577. j.OID = rpt.Cid
  578. j.RPID = rpt.Did
  579. sendTime, _ := time.Parse("2006-01-02 15:04:05", rpt.SendTime)
  580. j.BTime = sendTime.Unix()
  581. rptJudges = append(rptJudges, j)
  582. }
  583. if len(rptJudges) <= 0 {
  584. return
  585. }
  586. if err = s.dao.SendJudgement(c, rptJudges); err != nil {
  587. log.Error("s.dao.SendJudgement(data:%v) err (%v)", rptJudges, err)
  588. }
  589. _, err = s.ChangeReportStat(c, cidDmids, model.StatJudgeInit, 0, 0, uid, 0, 0, 0, "转风纪委", uname)
  590. if err != nil {
  591. log.Error("s.ChangeReportStat(id:%v) err(%v)", cidDmids, err)
  592. return
  593. }
  594. return
  595. }
  596. // JudgeResult receive judge result
  597. func (s *Service) JudgeResult(c context.Context, cid, dmid, result int64) (err error) {
  598. var (
  599. state int8
  600. remark string
  601. )
  602. res, err := s.dao.Reports(c, cid, []int64{dmid})
  603. if err != nil {
  604. log.Error("s.dao.Reports(cid:%d,dmid:%d) err(%v)", cid, dmid, err)
  605. return
  606. }
  607. if len(res) <= 0 {
  608. log.Error("dmJudge: cid:%d,dmid:%d not found", cid, dmid)
  609. err = ecode.RequestErr
  610. return
  611. }
  612. m := map[int64][]int64{
  613. res[0].Cid: {res[0].Did},
  614. }
  615. if result == 0 {
  616. state = model.StatJudgeIgnore
  617. remark = "风纪委处理:忽略"
  618. } else {
  619. state = model.StatJudgeDelete
  620. remark = "风纪委处理:删除"
  621. }
  622. _, err = s.ChangeReportStat(c, m, state, int8(res[0].RpType), 0, 0, 0, 0, 0, remark, "")
  623. if err != nil {
  624. log.Error("s.ChangeReportStat(cid:%d,dmid:%d) err(%v)", cid, dmid, err)
  625. return
  626. }
  627. return
  628. }
  629. func (s *Service) addRptDelAction(rpt *model.Report) (err error) {
  630. data, err := json.Marshal(rpt)
  631. if err != nil {
  632. log.Error("json.Marshal(%v) error(%v)", rpt, err)
  633. return
  634. }
  635. action := &model.Action{
  636. Oid: rpt.Cid,
  637. Action: model.ActReportDel,
  638. Data: data,
  639. }
  640. s.addAction(action)
  641. return
  642. }