blocked.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  1. package service
  2. import (
  3. "context"
  4. "strconv"
  5. "time"
  6. "go-common/app/interface/main/credit/model"
  7. acmdl "go-common/app/service/main/account/api"
  8. blkmdl "go-common/app/service/main/member/model/block"
  9. xsql "go-common/library/database/sql"
  10. "go-common/library/ecode"
  11. "go-common/library/log"
  12. xtime "go-common/library/time"
  13. "github.com/pkg/errors"
  14. )
  15. var (
  16. _emptyAnnounce = []*model.BlockedAnnouncement{}
  17. _emptyBlockInfo = []*model.BlockedInfo{}
  18. )
  19. // BlockedUserCard get user blocked card info.
  20. func (s *Service) BlockedUserCard(c context.Context, mid int64) (card *model.BlockedUserCard, err error) {
  21. var (
  22. count int
  23. profile *acmdl.ProfileReply
  24. )
  25. accArg := &acmdl.MidReq{Mid: mid}
  26. if profile, err = s.accountClient.Profile3(c, accArg); err != nil {
  27. err = errors.Wrap(err, "accountClient.Profile3")
  28. return
  29. }
  30. card = &model.BlockedUserCard{UID: mid, Uname: profile.Profile.Name, Face: profile.Profile.Face}
  31. if count, err = s.dao.BlockedCount(c, mid); err != nil {
  32. return
  33. }
  34. card.BlockedSum = count
  35. bms, err := s.memRPC.BlockInfo(c, &blkmdl.RPCArgInfo{MID: mid})
  36. if err != nil {
  37. return
  38. }
  39. card.BlockedStatus = int(bms.BlockStatus)
  40. status := int8(bms.BlockStatus)
  41. if status == model.BlockStatusForever || status == model.BlockStatusOn {
  42. card.BlockedStatus = 1
  43. // TODO nothing record in credit.
  44. if count <= 0 {
  45. card.BlockedSum = 1
  46. }
  47. }
  48. if status == model.BlockStatusForever {
  49. card.BlockedForever = model.BlockedStateForever
  50. }
  51. card.BlockedEndTime = bms.EndTime
  52. card.MoralNum = int(profile.Profile.Moral)
  53. if status != 0 {
  54. delta := time.Until(time.Unix(bms.EndTime, 0))
  55. if int(delta) > 0 {
  56. card.BlockedRestDay = int64(delta / (time.Hour * 24))
  57. if delta%(time.Hour*24) > 0 {
  58. card.BlockedRestDay++
  59. }
  60. }
  61. if card.AnsWerStatus, err = s.dao.AnswerStatus(c, mid, time.Unix(bms.StartTime, 0)); err != nil {
  62. return
  63. }
  64. }
  65. return
  66. }
  67. // BlockedUserList get user blocked info list
  68. func (s *Service) BlockedUserList(c context.Context, mid int64) (r []*model.BlockedInfo, err error) {
  69. var mc = true
  70. if r, err = s.dao.BlockedUserListCache(c, mid); err != nil {
  71. err = nil
  72. mc = false
  73. }
  74. if len(r) > 0 {
  75. return
  76. }
  77. if r, err = s.dao.BlockedUserList(c, mid); err != nil {
  78. return
  79. }
  80. if mc && len(r) > 0 {
  81. s.addCache(func() {
  82. s.dao.SetBlockedUserListCache(context.TODO(), mid, r)
  83. })
  84. }
  85. return
  86. }
  87. // BlockedInfo blocked info
  88. func (s *Service) BlockedInfo(c context.Context, id int64) (info *model.BlockedInfo, err error) {
  89. var mc = true
  90. if info, err = s.dao.BlockedInfoCache(c, id); err != nil {
  91. err = nil
  92. mc = false
  93. }
  94. if info != nil {
  95. if int8(info.PublishStatus) == model.PublishStatusClose {
  96. err = ecode.NothingFound
  97. }
  98. return
  99. }
  100. if info, err = s.dao.BlockedInfoByID(c, id); err != nil {
  101. err = errors.Wrapf(err, "BlockedInfoByID(%d)", id)
  102. return
  103. }
  104. if info == nil || (int8(info.PublishStatus) == model.PublishStatusClose) {
  105. err = ecode.NothingFound
  106. return
  107. }
  108. if mc {
  109. s.addBlockedCache(c, info)
  110. }
  111. return
  112. }
  113. // BlockedInfoAppeal get blocked info for appeal .
  114. func (s *Service) BlockedInfoAppeal(c context.Context, id, mid int64) (info *model.BlockedInfo, err error) {
  115. defer func() {
  116. if err == nil && info != nil && info.ID != 0 {
  117. if mid != info.UID {
  118. err = ecode.NothingFound
  119. }
  120. }
  121. }()
  122. var mc = true
  123. if info, err = s.dao.BlockedInfoCache(c, id); err != nil {
  124. err = nil
  125. mc = false
  126. }
  127. if info != nil {
  128. return
  129. }
  130. if info, err = s.dao.BlockedInfoByID(c, id); err != nil {
  131. err = errors.Wrapf(err, "BlockedInfoByID(%d)", id)
  132. return
  133. }
  134. if info == nil {
  135. err = ecode.NothingFound
  136. return
  137. }
  138. if mc {
  139. s.addBlockedCache(c, info)
  140. }
  141. return
  142. }
  143. func (s *Service) addBlockedCache(c context.Context, info *model.BlockedInfo) {
  144. var card *acmdl.CardReply
  145. if card, _ = s.userInfo(c, info.UID); card != nil {
  146. info.Uname = card.Card.Name
  147. info.Face = card.Card.Face
  148. }
  149. info.Build()
  150. s.addCache(func() {
  151. s.dao.SetBlockedInfoCache(context.TODO(), info.ID, info)
  152. })
  153. }
  154. // BlockedList blocked info list, public default.
  155. func (s *Service) BlockedList(c context.Context, oType, bType int8, pn, ps int) (res []*model.BlockedInfo, err error) {
  156. var (
  157. start = (pn - 1) * ps
  158. end = pn * ps
  159. ok bool
  160. ids []int64
  161. missed []int64
  162. cache = true
  163. )
  164. if ok, err = s.dao.ExpireBlockedIdx(c, oType, bType); ok && err == nil {
  165. if ids, err = s.dao.BlockedIdxCache(c, oType, bType, start, end-1); err != nil {
  166. return
  167. }
  168. } else {
  169. var ls, tmpls []*model.BlockedInfo
  170. if ls, err = s.dao.BlockedList(c, oType, bType); err != nil {
  171. return
  172. }
  173. switch {
  174. case len(ls) <= int(start):
  175. tmpls = _emptyBlockInfo
  176. case len(ls) <= int(end):
  177. tmpls = ls[start:]
  178. default:
  179. tmpls = ls[start:end]
  180. }
  181. s.addCache(func() {
  182. s.dao.LoadBlockedIdx(context.TODO(), oType, bType, ls)
  183. })
  184. for _, id := range tmpls {
  185. ids = append(ids, id.ID)
  186. }
  187. }
  188. if res, missed, err = s.dao.BlockedInfosCache(c, ids); err != nil {
  189. err = nil
  190. cache = false
  191. missed = ids
  192. }
  193. var missInfos []*model.BlockedInfo
  194. if len(missed) != 0 {
  195. missInfos, err = s.dao.BlockedInfos(c, missed)
  196. if err != nil {
  197. return
  198. }
  199. res = append(res, missInfos...)
  200. }
  201. var (
  202. mids []int64
  203. oids []int64
  204. )
  205. for _, i := range res {
  206. mids = append(mids, i.UID)
  207. oids = append(oids, i.ID)
  208. }
  209. arg := &acmdl.MidsReq{
  210. Mids: mids,
  211. }
  212. cards, err := s.accountClient.Infos3(c, arg)
  213. if err != nil {
  214. err = errors.Wrap(err, "Infos")
  215. return
  216. }
  217. reply, _ := s.dao.ReplysCount(c, oids)
  218. for _, i := range res {
  219. if card, ok := cards.Infos[i.UID]; ok {
  220. i.Uname = card.Name
  221. i.Face = card.Face
  222. }
  223. i.CommentSum = reply[strconv.FormatInt(i.ID, 10)]
  224. i.Build()
  225. }
  226. if cache {
  227. s.addCache(func() {
  228. s.dao.SetBlockedInfosCache(context.TODO(), missInfos)
  229. })
  230. }
  231. return
  232. }
  233. // AnnouncementInfo get announcement detail.
  234. func (s *Service) AnnouncementInfo(c context.Context, aid int64) (res *model.BlockedAnnouncement, err error) {
  235. var ok bool
  236. if res, ok = s.announcement.amap[aid]; !ok {
  237. err = ecode.NothingFound
  238. }
  239. return
  240. }
  241. // AnnouncementList get announcement list.
  242. func (s *Service) AnnouncementList(c context.Context, tp int8, pn, ps int64) (resp *model.AnnounceList, err error) {
  243. var (
  244. ok bool
  245. start = (pn - 1) * ps
  246. end = pn * ps
  247. alist []*model.BlockedAnnouncement
  248. count int64
  249. )
  250. resp = &model.AnnounceList{
  251. List: _emptyAnnounce,
  252. }
  253. if tp == model.PublishTypedef {
  254. resp.List = s.announcement.def
  255. resp.Count = int64(len(s.announcement.def))
  256. return
  257. }
  258. if alist, ok = s.announcement.alist[tp]; !ok {
  259. return
  260. }
  261. count = int64(len(alist))
  262. resp.Count = count
  263. switch {
  264. case count < start:
  265. case end >= count:
  266. resp.List = alist[start:]
  267. default:
  268. resp.List = alist[start:end]
  269. }
  270. return
  271. }
  272. // LoadAnnouncement load AnnouncementList.
  273. func (s *Service) LoadAnnouncement(c context.Context) {
  274. res, err := s.dao.AnnouncementList(c)
  275. if err != nil {
  276. return
  277. }
  278. var (
  279. def []*model.BlockedAnnouncement
  280. new = make([]*model.BlockedAnnouncement, 0, model.PublishInitLen)
  281. top = make([]*model.BlockedAnnouncement, 0, model.PublishInitLen)
  282. alist = make(map[int8][]*model.BlockedAnnouncement)
  283. topList = make(map[int8][]*model.BlockedAnnouncement)
  284. amap = make(map[int64]*model.BlockedAnnouncement)
  285. )
  286. for _, ann := range res {
  287. if ann.StickStatus == 1 {
  288. top = append(top, ann)
  289. topList[ann.Ptype] = append(topList[ann.Ptype], ann)
  290. } else if len(new) < model.PublishInitLen {
  291. new = append(new, ann)
  292. }
  293. if ann.StickStatus != 1 {
  294. alist[ann.Ptype] = append(alist[ann.Ptype], ann)
  295. }
  296. amap[ann.ID] = ann
  297. }
  298. for t, p := range alist {
  299. alist[t] = append(topList[t], p...)
  300. }
  301. if len(top) < model.PublishInitLen {
  302. lack := model.PublishInitLen - len(top)
  303. if lack > len(new) {
  304. def = append(top, new...)
  305. } else {
  306. def = append(top, new[:lack]...)
  307. }
  308. } else {
  309. def = top[:model.PublishInitLen]
  310. }
  311. if len(def) == 0 {
  312. def = _emptyAnnounce
  313. }
  314. s.announcement.def = def
  315. s.announcement.alist = alist
  316. s.announcement.amap = amap
  317. }
  318. // BlockedNumUser get blocked user number.
  319. func (s *Service) BlockedNumUser(c context.Context, mid int64) (blockedSum *model.ResBlockedNumUser, err error) {
  320. blockedSum = &model.ResBlockedNumUser{}
  321. blockedSum.BlockedSum, err = s.dao.BlockedNumUser(c, mid)
  322. return
  323. }
  324. // BatchPublishs get publish info list.
  325. func (s *Service) BatchPublishs(c context.Context, ids []int64) (res map[int64]*model.BlockedAnnouncement, err error) {
  326. res, err = s.dao.BatchPublishs(c, ids)
  327. return
  328. }
  329. // AddBlockedInfo add blocked info.
  330. func (s *Service) AddBlockedInfo(c context.Context, argJB *model.ArgJudgeBlocked) (err error) {
  331. if argJB.OID == 0 && argJB.OPName == "" {
  332. log.Error("origin_type(%d) oper_id(%d) && operator_name(%s) not both empty!", argJB.OType, argJB.OID, argJB.OPName)
  333. err = ecode.RequestErr
  334. return
  335. }
  336. if argJB.OID == 0 && argJB.OPName != "" {
  337. argJB.OID = s.managers[argJB.OPName]
  338. }
  339. if (argJB.PType == model.PunishTypeForever && argJB.BForever != model.InBlockedForever) ||
  340. (argJB.BForever == model.InBlockedForever && argJB.PType != model.PunishTypeForever) {
  341. argJB.PType = model.PunishTypeForever
  342. argJB.BForever = model.InBlockedForever
  343. }
  344. if argJB.PType == model.PunishTypeForever && argJB.BForever == model.InBlockedForever {
  345. argJB.BDays = 0
  346. }
  347. bi := &model.BlockedInfo{
  348. UID: argJB.MID,
  349. OID: argJB.OID,
  350. BlockedDays: int64(argJB.BDays),
  351. BlockedForever: int64(argJB.BForever),
  352. BlockedRemark: argJB.BRemark,
  353. MoralNum: int64(argJB.MoralNum),
  354. OriginContent: argJB.OContent,
  355. OriginTitle: argJB.OTitle,
  356. OriginType: int64(argJB.OType),
  357. OriginURL: argJB.OURL,
  358. PunishTime: xtime.Time(time.Now().Unix()),
  359. PunishType: int64(argJB.PType),
  360. ReasonType: int64(argJB.RType),
  361. BlockedType: int64(model.PunishBlock),
  362. OperatorName: argJB.OPName,
  363. }
  364. return s.dao.AddBlockedInfo(c, bi)
  365. }
  366. // AddBatchBlockedInfo add batch blocked info.
  367. func (s *Service) AddBatchBlockedInfo(c context.Context, argJBs *model.ArgJudgeBatchBlocked) (err error) {
  368. if argJBs.OID == 0 && argJBs.OPName == "" {
  369. log.Error("origin_type(%d) oper_id(%d) && operator_name(%s) not both empty!", argJBs.OType, argJBs.OID, argJBs.OPName)
  370. err = ecode.RequestErr
  371. return
  372. }
  373. if argJBs.OID == 0 && argJBs.OPName != "" {
  374. argJBs.OID = s.managers[argJBs.OPName]
  375. }
  376. if (argJBs.PType == model.PunishTypeForever && argJBs.BForever != model.InBlockedForever) ||
  377. (argJBs.BForever == model.InBlockedForever && argJBs.PType != model.PunishTypeForever) {
  378. argJBs.PType = model.PunishTypeForever
  379. argJBs.BForever = model.InBlockedForever
  380. }
  381. if argJBs.PType == model.PunishTypeForever && argJBs.BForever == model.InBlockedForever {
  382. argJBs.BDays = 0
  383. }
  384. var bis []*model.BlockedInfo
  385. for _, mid := range argJBs.MID {
  386. bi := &model.BlockedInfo{
  387. UID: mid,
  388. OID: argJBs.OID,
  389. BlockedDays: int64(argJBs.BDays),
  390. BlockedForever: int64(argJBs.BForever),
  391. BlockedRemark: argJBs.BRemark,
  392. MoralNum: int64(argJBs.MoralNum),
  393. OriginContent: argJBs.OContent,
  394. OriginTitle: argJBs.OTitle,
  395. OriginType: int64(argJBs.OType),
  396. OriginURL: argJBs.OURL,
  397. PunishTime: xtime.Time(argJBs.PTime),
  398. PunishType: int64(argJBs.PType),
  399. ReasonType: int64(argJBs.RType),
  400. BlockedType: int64(model.PunishBlock),
  401. OperatorName: argJBs.OPName,
  402. }
  403. bis = append(bis, bi)
  404. }
  405. // begin tran
  406. var tx *xsql.Tx
  407. if tx, err = s.dao.BeginTran(c); err != nil {
  408. err = errors.Wrap(err, "s.dao.BeginTran()")
  409. return
  410. }
  411. defer func() {
  412. if err != nil {
  413. tx.Rollback()
  414. } else {
  415. tx.Commit()
  416. }
  417. }()
  418. err = s.dao.TxAddBlockedInfo(tx, bis)
  419. return
  420. }
  421. // BLKHistorys get blocked historys list.
  422. func (s *Service) BLKHistorys(c context.Context, ah *model.ArgHistory) (rhs *model.ResBLKHistorys, err error) {
  423. count, err := s.dao.BLKHistoryCount(c, ah)
  424. if err != nil {
  425. err = errors.Wrap(err, "s.dao.BLKHistoryCount")
  426. return
  427. }
  428. rhs = &model.ResBLKHistorys{
  429. TotalCount: count,
  430. PN: ah.PN,
  431. PS: ah.PS,
  432. Items: _emptyBlockInfo,
  433. }
  434. if count == 0 {
  435. return
  436. }
  437. rhs.Items, err = s.dao.BLKHistorys(c, ah)
  438. if err != nil {
  439. err = errors.Wrap(err, "s.dao.BLKHistorys")
  440. return
  441. }
  442. var uids []int64
  443. for _, item := range rhs.Items {
  444. uids = append(uids, item.UID)
  445. }
  446. infoMap, err := s.infoMap(c, uids)
  447. if err != nil {
  448. err = errors.Wrap(err, "s.infoMap")
  449. return
  450. }
  451. for _, item := range rhs.Items {
  452. if info, ok := infoMap[item.UID]; ok {
  453. item.Uname = info.Name
  454. item.Face = info.Face
  455. }
  456. item.Build()
  457. }
  458. return
  459. }
  460. // BatchBLKInfos mutli get blocked info by ids.
  461. func (s *Service) BatchBLKInfos(c context.Context, ids []int64) (items map[int64]*model.BlockedInfo, err error) {
  462. items, err = s.dao.BlockedInfoIDs(c, ids)
  463. if err != nil {
  464. err = errors.Wrap(err, "s.dao.BLKHistorys")
  465. return
  466. }
  467. var uids []int64
  468. for _, item := range items {
  469. uids = append(uids, item.UID)
  470. }
  471. infoMap, err := s.infoMap(c, uids)
  472. if err != nil {
  473. err = errors.Wrap(err, "s.infoMap")
  474. return
  475. }
  476. for _, item := range items {
  477. if info, ok := infoMap[item.UID]; ok {
  478. item.Uname = info.Name
  479. item.Face = info.Face
  480. }
  481. item.Build()
  482. }
  483. return
  484. }