up_info.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885
  1. package service
  2. import (
  3. "bytes"
  4. "context"
  5. "fmt"
  6. "strconv"
  7. "strings"
  8. "time"
  9. "go-common/app/admin/main/growup/model"
  10. "go-common/library/database/sql"
  11. "go-common/library/ecode"
  12. "go-common/library/log"
  13. xtime "go-common/library/time"
  14. "go-common/library/xstr"
  15. )
  16. const (
  17. _video = 0
  18. _column = 2
  19. _bgm = 3
  20. _passTitle = "创作激励计划(%s)申请成功"
  21. _rejectTitle = "创作激励计划(%s)申请未通过"
  22. _passContent = "恭喜,您的创作激励计划(%s)申请已通过!"
  23. _rejectContent = "您的创作激励计划(%s)申请被驳回,驳回原因:%s。如有任何疑问,请参看帮助中心说明。"
  24. )
  25. func getUpTable(typ int) (table string, err error) {
  26. switch typ {
  27. case _video:
  28. table = "up_info_video"
  29. case _column:
  30. table = "up_info_column"
  31. case _bgm:
  32. table = "up_info_bgm"
  33. default:
  34. err = fmt.Errorf("up type error")
  35. }
  36. return
  37. }
  38. func text(typ int, base string) (text string, err error) {
  39. switch typ {
  40. case _video:
  41. text = fmt.Sprintf(base, "视频")
  42. case _column:
  43. text = fmt.Sprintf(base, "专栏")
  44. case _bgm:
  45. text = fmt.Sprintf(base, "素材")
  46. default:
  47. err = fmt.Errorf("up type error")
  48. }
  49. return
  50. }
  51. // AddUp add user to creative pgc不区分业务,所有的都加入pgc
  52. func (s *Service) AddUp(c context.Context, mid int64, accType int) (err error) {
  53. id, err := s.dao.Blocked(c, mid)
  54. if err != nil {
  55. return
  56. }
  57. if id != 0 { // blocked == true
  58. return ecode.GrowupDisabled
  59. }
  60. nickname, category, err := s.dao.CategoryInfo(c, mid)
  61. if err != nil {
  62. return
  63. }
  64. fans, oac, err := s.dao.Stat(c, mid)
  65. if err != nil {
  66. return
  67. }
  68. err = s.addUpVideo(c, mid, nickname, accType, category, fans, oac)
  69. if err != nil {
  70. log.Error("s.addUpVideo mid(%d), error(%v)", mid, err)
  71. return
  72. }
  73. err = s.addUpColumn(c, mid, nickname, accType, category, fans)
  74. if err != nil {
  75. log.Error("s.addUpColumn mid(%d), error(%v)", mid, err)
  76. }
  77. err = s.addUpBgm(c, mid, nickname, accType, category, fans)
  78. if err != nil {
  79. log.Error("s.addUpBgm mid(%d), error(%v)", mid, err)
  80. }
  81. return
  82. }
  83. func (s *Service) addUpVideo(c context.Context, mid int64, nickname string, accType, category, fans, oac int) (err error) {
  84. ups, err := s.dao.UpsVideoInfo(c, fmt.Sprintf("mid = %d and is_deleted = 0", mid))
  85. if err != nil {
  86. log.Error("s.dao.UpsInfo mid(%d), error(%v)", mid, err)
  87. return
  88. }
  89. if len(ups) == 1 {
  90. if ups[0].AccountType == accType {
  91. return
  92. }
  93. }
  94. up := &model.UpInfo{
  95. MID: mid,
  96. Nickname: nickname,
  97. MainCategory: category,
  98. Fans: fans,
  99. AccountType: accType,
  100. OriginalArchiveCount: oac,
  101. }
  102. if accType == 2 { // if account_type is pgc, sign_type update to first publish
  103. up.SignType = 2
  104. up.AccountState = 1
  105. }
  106. _, err = s.dao.InsertUpVideo(c, up)
  107. return
  108. }
  109. func (s *Service) addUpColumn(c context.Context, mid int64, nickname string, accType, category, fans int) (err error) {
  110. ups, err := s.dao.UpsColumnInfo(c, fmt.Sprintf("mid = %d and is_deleted = 0", mid))
  111. if err != nil {
  112. log.Error("s.dao.UpsColumnInfo mids(%d), error(%v)", mid, err)
  113. return
  114. }
  115. if len(ups) == 1 {
  116. if ups[0].AccountType == accType {
  117. return
  118. }
  119. }
  120. up := &model.UpInfo{
  121. MID: mid,
  122. Nickname: nickname,
  123. MainCategory: category,
  124. Fans: fans,
  125. AccountType: accType,
  126. }
  127. if accType == 2 { // if account_type is pgc, sign_type update to first publish
  128. up.SignType = 2
  129. up.AccountState = 1
  130. }
  131. _, err = s.dao.InsertUpColumn(c, up)
  132. return
  133. }
  134. func (s *Service) addUpBgm(c context.Context, mid int64, nickname string, accType, category, fans int) (err error) {
  135. ups, err := s.dao.UpsBgmInfo(c, fmt.Sprintf("mid=%d AND is_deleted=0", mid))
  136. if err != nil {
  137. return
  138. }
  139. if len(ups) == 1 {
  140. if ups[0].AccountType == accType {
  141. return
  142. }
  143. }
  144. count, err := s.dao.BGMCount(c, mid)
  145. if err != nil {
  146. return
  147. }
  148. up := &model.UpInfo{
  149. MID: mid,
  150. Nickname: nickname,
  151. Fans: fans,
  152. AccountType: accType,
  153. BGMs: count,
  154. }
  155. if accType == 2 {
  156. up.SignType = 2
  157. up.AccountState = 1
  158. }
  159. _, err = s.dao.InsertBgmUpInfo(c, up)
  160. return
  161. }
  162. func (s *Service) getBusinessType(c context.Context, mids []int64, state int) (business map[int64][]int, err error) {
  163. business = make(map[int64][]int)
  164. // video
  165. video, err := s.dao.GetUpInfoByState(c, "up_info_video", mids, state)
  166. if err != nil {
  167. log.Error("s.dao.GetUpInfoSigned error(%v)", err)
  168. return
  169. }
  170. // column
  171. column, err := s.dao.GetUpInfoByState(c, "up_info_column", mids, state)
  172. if err != nil {
  173. log.Error("s.dao.GetUpInfoSigned error(%v)", err)
  174. return
  175. }
  176. // bgm
  177. bgm, err := s.dao.GetUpInfoByState(c, "up_info_bgm", mids, state)
  178. if err != nil {
  179. log.Error("s.dao.GetUpInfoSigned error(%v)", err)
  180. return
  181. }
  182. for _, mid := range mids {
  183. business[mid] = make([]int, 0)
  184. if _, ok := video[mid]; ok {
  185. business[mid] = append(business[mid], 0)
  186. }
  187. if _, ok := column[mid]; ok {
  188. business[mid] = append(business[mid], 2)
  189. }
  190. if _, ok := bgm[mid]; ok {
  191. business[mid] = append(business[mid], 3)
  192. }
  193. }
  194. return
  195. }
  196. // QueryFromUpInfo query up-info in growup plan
  197. func (s *Service) QueryFromUpInfo(c context.Context, busType int, accType int, states []int64, mid int64, category int, signType int, nickname string, lower int, upper int, from int, limit int, sort string) (ups []*model.UpInfo, total int, err error) {
  198. table, err := getUpTable(busType)
  199. if err != nil {
  200. return
  201. }
  202. query := upsInfoStmt(accType, states, mid, category, signType, nickname, lower, upper)
  203. total, err = s.dao.UpsCount(c, table, query)
  204. if err != nil {
  205. return
  206. }
  207. sb := sortBy(sort)
  208. if len(sb) != 0 {
  209. query += " " + sb
  210. }
  211. query += fmt.Sprintf(" LIMIT %d, %d", from, limit)
  212. switch busType {
  213. case _video:
  214. ups, err = s.dao.UpsVideoInfo(c, query)
  215. if err != nil {
  216. log.Error("s.dao.UpsInfo mids(%+d), state(%d) error(%v)", mid, states, err)
  217. return
  218. }
  219. case _column:
  220. ups, err = s.dao.UpsColumnInfo(c, query)
  221. if err != nil {
  222. log.Error("s.dao.UpsColumnInfo mids(%+d), state(%d) error(%v)", mid, states, err)
  223. return
  224. }
  225. case _bgm:
  226. ups, err = s.dao.UpsBgmInfo(c, query)
  227. if err != nil {
  228. log.Error("s.dao.UpsBgmInfo mids(%+d), state(%d) error(%v)", mid, states, err)
  229. return
  230. }
  231. }
  232. if ups == nil {
  233. ups = make([]*model.UpInfo, 0)
  234. }
  235. if len(ups) == 0 {
  236. return
  237. }
  238. mids := make([]int64, 0)
  239. for _, up := range ups {
  240. mids = append(mids, up.MID)
  241. }
  242. signedType, err := s.getBusinessType(c, mids, 3)
  243. if err != nil {
  244. log.Error("s.getBusinessType error(%v)", err)
  245. return
  246. }
  247. // credit scores
  248. scores, err := s.dao.CreditScores(c, mids)
  249. if err != nil {
  250. return
  251. }
  252. for _, up := range ups {
  253. up.SignedType = signedType[up.MID]
  254. up.CreditScore = scores[up.MID]
  255. }
  256. if len(states) == 1 {
  257. var other map[int64][]int
  258. other, err = s.getBusinessType(c, mids, int(states[0]))
  259. if err != nil {
  260. log.Error("s.getBusinessType error(%v)", err)
  261. return
  262. }
  263. for _, up := range ups {
  264. up.OtherType = other[up.MID]
  265. }
  266. }
  267. return
  268. }
  269. func sortBy(name string) (sort string) {
  270. if len(name) == 0 {
  271. return
  272. }
  273. if strings.HasPrefix(name, "-") {
  274. name = strings.TrimPrefix(name, "-")
  275. name += " DESC"
  276. }
  277. sort = " ORDER BY " + name
  278. return
  279. }
  280. func upsInfoStmt(accountType int, states []int64, mid int64, category int, signType int, nickname string, lower, upper int) (query string) {
  281. if accountType > 0 {
  282. query += "account_type = " + strconv.Itoa(accountType)
  283. query += " AND "
  284. }
  285. if len(states) > 0 {
  286. query += fmt.Sprintf("account_state IN (%s)", xstr.JoinInts(states))
  287. query += " AND "
  288. }
  289. if mid > 0 {
  290. query += "mid = " + strconv.FormatInt(mid, 10)
  291. query += " AND "
  292. }
  293. if category != 0 {
  294. query += "category_id = " + strconv.Itoa(category)
  295. query += " AND "
  296. }
  297. if signType > 0 {
  298. query += "sign_type = " + strconv.Itoa(signType)
  299. query += " AND "
  300. }
  301. if nickname != "" {
  302. query += "nickname = " + "\"" + nickname + "\""
  303. query += " AND "
  304. }
  305. query += "fans >= " + strconv.Itoa(lower)
  306. query += " AND "
  307. if upper > 0 {
  308. query += "fans <=" + strconv.Itoa(upper)
  309. query += " AND "
  310. }
  311. query += "is_deleted = 0"
  312. return
  313. }
  314. // Reject update account state to 4(reject)
  315. func (s *Service) Reject(c context.Context, typ int, mids []int64, reason string, days int) (err error) {
  316. table, err := getUpTable(typ)
  317. if err != nil {
  318. return
  319. }
  320. now := time.Now().Unix()
  321. _, err = s.dao.Reject(c, table, 4, reason, xtime.Time(now), xtime.Time(now+int64(86400*days)), mids)
  322. if err != nil {
  323. return
  324. }
  325. title, err := text(typ, _rejectTitle)
  326. if err != nil {
  327. return
  328. }
  329. var content string
  330. switch typ {
  331. case _video:
  332. content = fmt.Sprintf(_rejectContent, "视频", reason)
  333. case _column:
  334. content = fmt.Sprintf(_rejectContent, "专栏", reason)
  335. case _bgm:
  336. content = fmt.Sprintf(_rejectContent, "素材", reason)
  337. }
  338. pushErr := s.msg.Send(c, "1_14_2", title, content, mids, now)
  339. if pushErr != nil {
  340. log.Error("reject push error(%v)", pushErr)
  341. }
  342. return
  343. }
  344. // Pass update account state to 3(signed) type 0.video 1.audio 2.column 3.bgm,
  345. func (s *Service) Pass(c context.Context, mids []int64, typ int) (err error) {
  346. if len(mids) == 0 {
  347. return
  348. }
  349. table, err := getUpTable(typ)
  350. if err != nil {
  351. return
  352. }
  353. ms, err := s.dao.Pendings(c, mids, table)
  354. if err != nil {
  355. return
  356. }
  357. if len(ms) == 0 {
  358. return
  359. }
  360. upM := make(map[int64]struct{})
  361. for _, m := range ms {
  362. upM[m] = struct{}{}
  363. }
  364. // check other two business
  365. if typ != _video {
  366. err = s.removeUnusualUps(c, "up_info_video", upM, ms)
  367. if err != nil {
  368. log.Error("s.removeUnusualUps error(%v)", err)
  369. return
  370. }
  371. }
  372. if typ != _column {
  373. err = s.removeUnusualUps(c, "up_info_column", upM, ms)
  374. if err != nil {
  375. log.Error("s.removeUnusualUps error(%v)", err)
  376. return
  377. }
  378. }
  379. if typ != _bgm {
  380. err = s.removeUnusualUps(c, "up_info_bgm", upM, ms)
  381. if err != nil {
  382. log.Error("s.removeUnusualUps error(%v)", err)
  383. return
  384. }
  385. }
  386. if len(upM) == 0 {
  387. return
  388. }
  389. ms = make([]int64, 0)
  390. for mid := range upM {
  391. ms = append(ms, mid)
  392. }
  393. _, err = s.dao.Pass(c, table, 3, xtime.Time(time.Now().Unix()), ms)
  394. if err != nil {
  395. return
  396. }
  397. _, err = s.dao.InsertCreditScore(c, midValues(mids))
  398. if err != nil {
  399. return
  400. }
  401. title, err := text(typ, _passTitle)
  402. if err != nil {
  403. return
  404. }
  405. msg, err := text(typ, _passContent)
  406. if err != nil {
  407. return
  408. }
  409. pushErr := s.msg.Send(c, "1_14_1", title, msg, ms, time.Now().Unix())
  410. if pushErr != nil {
  411. log.Error("pass push error(%v)", pushErr)
  412. }
  413. // add creative task notify
  414. s.msg.NotifyTask(c, mids)
  415. return
  416. }
  417. func (s *Service) removeUnusualUps(c context.Context, table string, upM map[int64]struct{}, ms []int64) (err error) {
  418. mids, err := s.dao.UnusualUps(c, ms, table)
  419. if err != nil {
  420. return
  421. }
  422. for _, mid := range mids {
  423. if _, ok := upM[mid]; ok {
  424. delete(upM, mid)
  425. }
  426. }
  427. return
  428. }
  429. func midValues(mids []int64) (values string) {
  430. var buf bytes.Buffer
  431. for _, mid := range mids {
  432. buf.WriteString("(")
  433. buf.WriteString(strconv.FormatInt(mid, 10))
  434. buf.WriteString(")")
  435. buf.WriteByte(',')
  436. }
  437. if buf.Len() > 0 {
  438. buf.Truncate(buf.Len() - 1)
  439. }
  440. values = buf.String()
  441. buf.Reset()
  442. return
  443. }
  444. // Dismiss update account state to 6
  445. func (s *Service) Dismiss(c context.Context, operator string, typ, oldState int, mid int64, reason string) (err error) {
  446. var (
  447. tx *sql.Tx
  448. now = xtime.Time(time.Now().Unix())
  449. current int
  450. drows int64
  451. crows int64
  452. )
  453. if tx, err = s.dao.BeginTran(c); err != nil {
  454. return
  455. }
  456. if current, err = s.dao.CreditScore(c, mid); err != nil {
  457. tx.Rollback()
  458. return
  459. }
  460. // deduct credit score 10
  461. var drows1, drows2, drows3 int64
  462. if drows1, err = s.dao.TxDismiss(tx, "up_info_video", 6, oldState, reason, now, now, mid); err != nil {
  463. tx.Rollback()
  464. return
  465. }
  466. if drows2, err = s.dao.TxDismiss(tx, "up_info_column", 6, oldState, reason, now, now, mid); err != nil {
  467. tx.Rollback()
  468. return
  469. }
  470. if drows3, err = s.dao.TxDismiss(tx, "up_info_bgm", 6, oldState, reason, now, now, mid); err != nil {
  471. tx.Rollback()
  472. return
  473. }
  474. switch typ {
  475. case _video:
  476. drows = drows1
  477. case _column:
  478. drows = drows2
  479. case _bgm:
  480. drows = drows3
  481. }
  482. if crows, err = s.txInsertCreditRecord(tx, mid, operator, 6, 10, current-10); err != nil {
  483. tx.Rollback()
  484. return
  485. }
  486. if drows != crows {
  487. tx.Rollback()
  488. return
  489. }
  490. if typ == _video {
  491. if _, err = s.dao.TxUpdateUpSpyState(tx, 6, mid); err != nil {
  492. tx.Rollback()
  493. return
  494. }
  495. if _, err = s.dao.DelCheatUp(c, mid); err != nil {
  496. tx.Rollback()
  497. return
  498. }
  499. }
  500. _, err = s.dao.TxUpdateCreditScore(tx, mid, current-10)
  501. if err != nil {
  502. return
  503. }
  504. if err = tx.Commit(); err != nil {
  505. log.Error("tx.Commit error(%v)", err)
  506. return
  507. }
  508. pushErr := s.msg.Send(c, "1_14_4", "您的创作激励计划参与资格已被取消", fmt.Sprintf(`您好,根据创作激励计划规则,您因%s,已被永久取消参与创作激励计划的资格。如有任何疑问,请联系客服。`, reason), []int64{mid}, time.Now().Unix())
  509. if pushErr != nil {
  510. log.Error("dismiss push error(%v)", pushErr)
  511. }
  512. return
  513. }
  514. func (s *Service) txInsertCreditRecord(tx *sql.Tx, mid int64, operator string, state, deducted, remaining int) (rows int64, err error) {
  515. // insert to credit record
  516. cr := &model.CreditRecord{
  517. MID: mid,
  518. OperateAt: xtime.Time(time.Now().Unix()),
  519. Operator: operator,
  520. Reason: state,
  521. Deducted: deducted,
  522. Remaining: remaining,
  523. }
  524. return s.dao.TxInsertCreditRecord(tx, cr)
  525. }
  526. // Forbid update account state to 7 and add a n days CD
  527. func (s *Service) Forbid(c context.Context, operator string, typ, oldState int, mid int64, reason string, days, second int) (err error) {
  528. var (
  529. tx *sql.Tx
  530. now = time.Now().Unix()
  531. expiredIn = xtime.Time(now + int64(second))
  532. current int
  533. frows int64
  534. crows int64
  535. )
  536. if tx, err = s.dao.BeginTran(c); err != nil {
  537. return
  538. }
  539. if current, err = s.dao.CreditScore(c, mid); err != nil {
  540. tx.Rollback()
  541. return
  542. }
  543. var frows1, frows2, frows3 int64
  544. // deduct credit score 5
  545. if frows1, err = s.dao.TxForbid(tx, "up_info_video", 7, oldState, reason, xtime.Time(now), expiredIn, mid); err != nil {
  546. tx.Rollback()
  547. return
  548. }
  549. if frows2, err = s.dao.TxForbid(tx, "up_info_column", 7, oldState, reason, xtime.Time(now), expiredIn, mid); err != nil {
  550. tx.Rollback()
  551. return
  552. }
  553. if frows3, err = s.dao.TxForbid(tx, "up_info_bgm", 7, oldState, reason, xtime.Time(now), expiredIn, mid); err != nil {
  554. tx.Rollback()
  555. return
  556. }
  557. switch typ {
  558. case _video:
  559. frows = frows1
  560. case _column:
  561. frows = frows2
  562. case _bgm:
  563. frows = frows3
  564. }
  565. // insert credit record
  566. if crows, err = s.txInsertCreditRecord(tx, mid, operator, 7, 5, current-5); err != nil {
  567. tx.Rollback()
  568. return
  569. }
  570. if frows != crows {
  571. tx.Rollback()
  572. return
  573. }
  574. if typ == _video {
  575. // update up spy state
  576. if _, err = s.dao.TxUpdateUpSpyState(tx, 7, mid); err != nil {
  577. tx.Rollback()
  578. return
  579. }
  580. // del up from cheat fans list
  581. if _, err = s.dao.DelCheatUp(c, mid); err != nil {
  582. tx.Rollback()
  583. return
  584. }
  585. }
  586. _, err = s.dao.TxUpdateCreditScore(tx, mid, current-5)
  587. if err != nil {
  588. return
  589. }
  590. if err = tx.Commit(); err != nil {
  591. log.Error("tx.Commit error(%v)", err)
  592. return
  593. }
  594. pushErr := s.msg.Send(c, "1_14_3", "您已被暂停参加创作激励计划", fmt.Sprintf(`根据创作激励计划规则,您因为%s原因被停止参与计划%d天,%d年%d月%d日恢复,如有疑问,请联系客服。`, reason, days, expiredIn.Time().Year(), expiredIn.Time().Month(), expiredIn.Time().Day()), []int64{mid}, time.Now().Unix())
  595. if pushErr != nil {
  596. log.Error("forbid push error(%v)", pushErr)
  597. }
  598. return
  599. }
  600. // Recovery update (video/column) account state to 3(signed)
  601. func (s *Service) Recovery(c context.Context, mid int64) (err error) {
  602. err = s.UpdateUpAccountState(c, "up_info_video", mid, 3)
  603. if err != nil {
  604. log.Error("s.UpdateUpAccountState(video) error(%v)", err)
  605. return
  606. }
  607. err = s.UpdateUpAccountState(c, "up_info_column", mid, 3)
  608. if err != nil {
  609. log.Error("s.UpdateUpAccountState(column) error(%v)", err)
  610. return
  611. }
  612. err = s.UpdateUpAccountState(c, "up_info_bgm", mid, 3)
  613. if err != nil {
  614. log.Error("s.UpdateUpAccountState(bgm) error(%v)", err)
  615. }
  616. return
  617. }
  618. // UpdateUpAccountState update video up account state
  619. func (s *Service) UpdateUpAccountState(c context.Context, table string, mid int64, state int) (err error) {
  620. _, err = s.dao.UpdateAccountState(c, table, state, mid)
  621. return
  622. }
  623. // DeleteUp delete up from up_info (update is_deleted = 1)
  624. func (s *Service) DeleteUp(c context.Context, mid int64) (err error) {
  625. _, err = s.dao.DelUpInfo(c, "up_info_video", mid)
  626. if err != nil {
  627. return
  628. }
  629. _, err = s.dao.DelUpInfo(c, "up_info_column", mid)
  630. if err != nil {
  631. return
  632. }
  633. _, err = s.dao.DelUpInfo(c, "up_info_bgm", mid)
  634. return
  635. }
  636. // Block add to blacklist
  637. func (s *Service) Block(c context.Context, mid int64) (err error) {
  638. nickname, categoryID, err := s.dao.CategoryInfo(c, mid)
  639. if err != nil {
  640. return
  641. }
  642. fans, oac, err := s.dao.Stat(c, mid)
  643. if err != nil {
  644. return
  645. }
  646. applyAt, err := s.dao.ApplyAt(c, mid)
  647. if err != nil {
  648. return
  649. }
  650. b := &model.Blocked{
  651. MID: mid,
  652. Nickname: nickname,
  653. OriginalArchiveCount: oac,
  654. MainCategory: categoryID,
  655. Fans: fans,
  656. ApplyAt: applyAt,
  657. }
  658. _, err = s.dao.InsertBlocked(c, b)
  659. if err != nil {
  660. return
  661. }
  662. // if up in table up_info_video, delete
  663. _, err = s.dao.DelUpInfo(c, "up_info_video", mid)
  664. if err != nil {
  665. return
  666. }
  667. _, err = s.dao.DelUpInfo(c, "up_info_column", mid)
  668. if err != nil {
  669. return
  670. }
  671. _, err = s.dao.DelUpInfo(c, "up_info_bgm", mid)
  672. return
  673. }
  674. // QueryFromBlocked query up-info in black list of growup plan
  675. func (s *Service) QueryFromBlocked(c context.Context, mid int64, category int, nickname string, lower, upper, from, limit int, sort string) (ups []*model.Blocked, total int, err error) {
  676. query := queryBlockStmt(mid, category, nickname, lower, upper)
  677. total, err = s.dao.BlockCount(c, query)
  678. if err != nil {
  679. return
  680. }
  681. sb := sortBy(sort)
  682. if len(sb) != 0 {
  683. query += " " + sb
  684. }
  685. query += fmt.Sprintf(" LIMIT %d, %d", from, limit)
  686. ups, err = s.dao.QueryFromBlocked(c, query)
  687. if err != nil {
  688. log.Error("s.dao.QueryFromBlocked error(%v)", err)
  689. return
  690. }
  691. if ups == nil {
  692. ups = make([]*model.Blocked, 0)
  693. }
  694. return
  695. }
  696. func queryBlockStmt(mid int64, categoryID int, nickname string, lower int, upper int) (query string) {
  697. if mid > 0 {
  698. query += "mid = " + strconv.FormatInt(mid, 10)
  699. query += " AND "
  700. }
  701. if categoryID != 0 {
  702. query += "category_id = " + strconv.Itoa(categoryID)
  703. query += " AND "
  704. }
  705. if nickname != "" {
  706. query += "nickname = " + "\"" + nickname + "\""
  707. query += " AND "
  708. }
  709. query += "fans >= " + strconv.Itoa(lower)
  710. query += " AND "
  711. query += "is_deleted = 0"
  712. if upper > 0 {
  713. query += " AND "
  714. query += "fans <=" + strconv.Itoa(upper)
  715. }
  716. return
  717. }
  718. // DeleteFromBlocked del blocked and recover up info of video
  719. func (s *Service) DeleteFromBlocked(c context.Context, mid int64) (err error) {
  720. _, err = s.dao.DelFromBlocked(c, mid)
  721. if err != nil {
  722. return
  723. }
  724. _, err = s.dao.RecUpInfo(c, "up_info_video", mid)
  725. if err != nil {
  726. return
  727. }
  728. _, err = s.dao.RecUpInfo(c, "up_info_column", mid)
  729. if err != nil {
  730. return
  731. }
  732. _, err = s.dao.RecUpInfo(c, "up_info_bgm", mid)
  733. return
  734. }
  735. // DelUpAccount del mid from up_account
  736. func (s *Service) DelUpAccount(c context.Context, mid int64) (err error) {
  737. _, err = s.dao.DelUpAccount(c, mid)
  738. return
  739. }
  740. // UpdateUpAccount update up_account
  741. func (s *Service) UpdateUpAccount(c context.Context, mid int64, isDeleted int, withdrawDate string) (err error) {
  742. _, err = s.dao.UpdateUpAccount(c, mid, isDeleted, withdrawDate)
  743. return
  744. }
  745. // CreditRecords get credit records by mid
  746. func (s *Service) CreditRecords(c context.Context, mid int64) (crs []*model.CreditRecord, err error) {
  747. return s.dao.CreditRecords(c, mid)
  748. }
  749. // RecoverCreditScore recover credit score
  750. func (s *Service) RecoverCreditScore(c context.Context, typ int, id, mid int64) (err error) {
  751. var (
  752. tx *sql.Tx
  753. deducted int
  754. drows int64
  755. urows int64
  756. )
  757. if tx, err = s.dao.BeginTran(c); err != nil {
  758. return
  759. }
  760. if deducted, err = s.dao.DeductedScore(c, id); err != nil {
  761. tx.Rollback()
  762. return
  763. }
  764. // del detucted record by id
  765. if drows, err = s.dao.TxDelCreditRecord(tx, id); err != nil {
  766. tx.Rollback()
  767. return
  768. }
  769. // recover credit score
  770. if urows, err = s.dao.TxRecoverCreditScore(tx, deducted, mid); err != nil {
  771. return
  772. }
  773. if drows != urows {
  774. tx.Rollback()
  775. return
  776. }
  777. if err = tx.Commit(); err != nil {
  778. log.Error("tx.Commit error(%v)", err)
  779. return
  780. }
  781. return
  782. }
  783. // ExportUps export ups by query
  784. func (s *Service) ExportUps(c context.Context, busType, accType int, states []int64, mid int64, category int, signType int, nickname string, lower int, upper int, from int, limit int, sort string) (res []byte, err error) {
  785. ups, _, err := s.QueryFromUpInfo(c, busType, accType, states, mid, category, signType, nickname, lower, upper, from, limit, sort)
  786. if err != nil {
  787. log.Error("s.QueryFromUpInfo error(%v)", err)
  788. return
  789. }
  790. records := formatUpInfo(ups, states, busType)
  791. res, err = FormatCSV(records)
  792. if err != nil {
  793. log.Error("FormatCSV error(%v)", err)
  794. }
  795. return
  796. }
  797. // UpState get up state
  798. func (s *Service) UpState(c context.Context, mid int64, typ int) (data interface{}, err error) {
  799. table, err := getUpTable(typ)
  800. if err != nil {
  801. return
  802. }
  803. state, err := s.dao.GetUpState(c, table, mid)
  804. if err != nil {
  805. return
  806. }
  807. data = map[string]interface{}{
  808. "mid": mid,
  809. "state": state,
  810. }
  811. return
  812. }