123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340 |
- package card
- import (
- "context"
- "strconv"
- "time"
- "go-common/app/interface/main/app-card/model/card/operate"
- "go-common/app/interface/main/app-show/conf"
- "go-common/app/interface/main/app-show/model"
- "go-common/app/interface/main/app-show/model/card"
- "go-common/library/cache/memcache"
- "go-common/library/database/sql"
- "go-common/library/log"
- )
- const (
- // daily_selection
- _appColumnSQL = "SELECT id,tab,resource_id,tpl,name,plat_ver FROM app_column WHERE state=1"
- _appPosRecSQL = "SELECT p.id,p.tab,p.resource_id,p.type,p.title,p.cover,p.re_type,p.re_value,p.plat_ver,p.desc,p.tag_id FROM app_pos_rec AS p WHERE p.stime<? AND p.etime>? AND p.state=1 ORDER BY p.weight ASC"
- _appContentRSQL = "SELECT c.id,c.module,c.rec_id,c.ctype,c.cvalue,c.ctitle,c.tag_id FROM app_content AS c, app_pos_rec AS r WHERE c.rec_id=r.id AND r.state=1 AND r.stime<? AND r.etime>? AND c.module=1"
- _appColumnNperSQL = "SELECT n.id,n.column_id,n.name,n.desc,n.nper,n.nper_time,n.cover,n.plat_ver,n.title,n.re_type,n.re_value FROM app_column_nper AS n WHERE n.cron_time<? AND n.state=1 ORDER BY n.nper DESC"
- _appContentNSQL = "SELECT c.id,c.module,c.rec_id,c.ctype,c.cvalue,c.ctitle,c.tag_id FROM app_content AS c, app_column_nper AS n WHERE c.rec_id=n.id AND n.state=1 AND n.cron_time<? AND c.module=2"
- _appColumnList = "SELECT c.id,c.name,cn.id,cn.title,cn.plat_ver FROM app_column AS c,app_column_nper AS cn WHERE c.id=cn.column_id AND c.state=1 AND cn.state=1 AND cn.cron_time<? ORDER BY cn.nper DESC"
- // hot card
- _cardSQL = `SELECT c.id,c.title,c.card_type,c.card_value,c.recommand_reason,c.recommand_state,c.priority FROM popular_card AS c
- WHERE c.stime<? AND c.etime>? AND c.check=2 AND c.is_delete=0 ORDER BY c.priority ASC`
- _cardPlatSQL = `SELECT card_id,plat,conditions,build FROM popular_card_plat WHERE is_delete=0`
- _cardSetSQL = `SELECT c.id,c.type,c.value,c.title,c.long_title,c.content FROM card_set AS c WHERE c.deleted=0`
- _eventTopicSQL = `SELECT c.id,c.title,c.desc,c.cover,c.re_type,c.re_value,c.corner FROM event_topic AS c WHERE c.deleted=0`
- )
- // Dao is card dao.
- type Dao struct {
- db *sql.DB
- column *sql.Stmt
- posRec *sql.Stmt
- recContent *sql.Stmt
- nperContent *sql.Stmt
- columnNper *sql.Stmt
- columnList *sql.Stmt
- // memcache
- mc *memcache.Pool
- expire int32
- }
- func New(c *conf.Config) *Dao {
- d := &Dao{
- db: sql.NewMySQL(c.MySQL.Show),
- // memcache
- mc: memcache.NewPool(c.Memcache.Cards.Config),
- expire: int32(time.Duration(c.Memcache.Cards.Expire) / time.Second),
- }
- d.column = d.db.Prepared(_appColumnSQL)
- d.posRec = d.db.Prepared(_appPosRecSQL)
- d.recContent = d.db.Prepared(_appContentRSQL)
- d.nperContent = d.db.Prepared(_appContentNSQL)
- d.columnNper = d.db.Prepared(_appColumnNperSQL)
- d.columnList = d.db.Prepared(_appColumnList)
- return d
- }
- // Columns
- func (d *Dao) Columns(ctx context.Context) (res map[int8][]*card.Column, err error) {
- res = map[int8][]*card.Column{}
- rows, err := d.column.Query(ctx)
- if err != nil {
- log.Error("query error(%v)", err)
- return
- }
- defer rows.Close()
- for rows.Next() {
- c := &card.Column{}
- if err = rows.Scan(&c.ID, &c.Tab, &c.RegionID, &c.Tpl, &c.Name, &c.PlatVer); err != nil {
- log.Error("rows.Scan error(%v)", err)
- res = nil
- return
- }
- for _, limit := range c.ColumnPlatChange() {
- tmpc := &card.Column{}
- *tmpc = *c
- tmpc.Plat = limit.Plat
- tmpc.Build = limit.Build
- tmpc.Condition = limit.Condition
- tmpc.PlatVer = ""
- tmpc.ColumnGotoChannge()
- res[tmpc.Plat] = append(res[tmpc.Plat], tmpc)
- }
- }
- return
- }
- // PosRecs
- func (d *Dao) PosRecs(ctx context.Context, now time.Time) (res map[int8]map[int][]*card.Card, err error) {
- res = map[int8]map[int][]*card.Card{}
- rows, err := d.posRec.Query(ctx, now, now)
- if err != nil {
- log.Error("query error(%v)", err)
- return
- }
- defer rows.Close()
- for rows.Next() {
- c := &card.Card{}
- if err = rows.Scan(&c.ID, &c.Tab, &c.RegionID, &c.Type, &c.Title, &c.Cover, &c.Rtype, &c.Rvalue, &c.PlatVer, &c.Desc, &c.TagID); err != nil {
- log.Error("rows.Scan error(%v)", err)
- res = nil
- return
- }
- for _, limit := range c.CardPlatChange() {
- tmpc := &card.Card{}
- *tmpc = *c
- tmpc.Plat = limit.Plat
- tmpc.Build = limit.Build
- tmpc.Condition = limit.Condition
- tmpc.PlatVer = ""
- tmpc.CardGotoChannge()
- if cards, ok := res[tmpc.Plat]; ok {
- cards[tmpc.RegionID] = append(cards[tmpc.RegionID], tmpc)
- } else {
- res[tmpc.Plat] = map[int][]*card.Card{
- tmpc.RegionID: []*card.Card{tmpc},
- }
- }
- }
- }
- return
- }
- // RecContents
- func (d *Dao) RecContents(ctx context.Context, now time.Time) (res map[int][]*card.Content, aids map[int][]int64, err error) {
- res = map[int][]*card.Content{}
- aids = map[int][]int64{}
- rows, err := d.recContent.Query(ctx, now, now)
- if err != nil {
- log.Error("query error(%v)", err)
- return
- }
- defer rows.Close()
- for rows.Next() {
- c := &card.Content{}
- if err = rows.Scan(&c.ID, &c.Module, &c.RecID, &c.Type, &c.Value, &c.Title, &c.TagID); err != nil {
- log.Error("rows.Scan error(%v)", err)
- res = nil
- return
- }
- res[c.RecID] = append(res[c.RecID], c)
- if c.Type == model.CardGotoAv {
- aidInt, _ := strconv.ParseInt(c.Value, 10, 64)
- aids[c.RecID] = append(aids[c.RecID], aidInt)
- }
- }
- return
- }
- // NperContents
- func (d *Dao) NperContents(ctx context.Context, now time.Time) (res map[int][]*card.Content, aids map[int][]int64, err error) {
- res = map[int][]*card.Content{}
- aids = map[int][]int64{}
- rows, err := d.nperContent.Query(ctx, now)
- if err != nil {
- log.Error("query error(%v)", err)
- return
- }
- defer rows.Close()
- for rows.Next() {
- c := &card.Content{}
- if err = rows.Scan(&c.ID, &c.Module, &c.RecID, &c.Type, &c.Value, &c.Title, &c.TagID); err != nil {
- log.Error("rows.Scan error(%v)", err)
- res = nil
- return
- }
- res[c.RecID] = append(res[c.RecID], c)
- if c.Type == model.CardGotoAv {
- aidInt, _ := strconv.ParseInt(c.Value, 10, 64)
- aids[c.RecID] = append(aids[c.RecID], aidInt)
- }
- }
- return
- }
- // ColumnNpers
- func (d *Dao) ColumnNpers(ctx context.Context, now time.Time) (res map[int8][]*card.ColumnNper, err error) {
- res = map[int8][]*card.ColumnNper{}
- rows, err := d.columnNper.Query(ctx, now)
- if err != nil {
- log.Error("query error(%v)", err)
- return
- }
- defer rows.Close()
- for rows.Next() {
- c := &card.ColumnNper{}
- if err = rows.Scan(&c.ID, &c.ColumnID, &c.Name, &c.Desc, &c.Nper, &c.NperTime, &c.Cover, &c.PlatVer, &c.Title, &c.Rtype, &c.Rvalue); err != nil {
- log.Error("rows.Scan error(%v)", err)
- res = nil
- return
- }
- for _, limit := range c.ColumnNperPlatChange() {
- tmpc := &card.ColumnNper{}
- *tmpc = *c
- tmpc.Plat = limit.Plat
- tmpc.Build = limit.Build
- tmpc.Condition = limit.Condition
- tmpc.PlatVer = ""
- tmpc.ColumnNperGotoChange()
- res[tmpc.Plat] = append(res[tmpc.Plat], tmpc)
- }
- }
- return
- }
- // ColumnList
- func (d *Dao) ColumnPlatList(ctx context.Context, now time.Time) (res map[int8][]*card.ColumnList, err error) {
- res = map[int8][]*card.ColumnList{}
- rows, err := d.columnList.Query(ctx, now)
- if err != nil {
- log.Error("query error(%v)", err)
- return
- }
- for rows.Next() {
- c := &card.ColumnList{}
- if err = rows.Scan(&c.Ceid, &c.Cname, &c.Cid, &c.Name, &c.PlatVer); err != nil {
- log.Error("rows.Scan error(%v)", err)
- res = nil
- return
- }
- for _, limit := range c.ColumnListPlatChange() {
- tmpc := &card.ColumnList{}
- *tmpc = *c
- tmpc.Plat = limit.Plat
- tmpc.Build = limit.Build
- tmpc.Condition = limit.Condition
- tmpc.PlatVer = ""
- res[tmpc.Plat] = append(res[tmpc.Plat], tmpc)
- }
- }
- return
- }
- // ColumnList
- func (d *Dao) ColumnList(ctx context.Context, now time.Time) (res []*card.ColumnList, err error) {
- res = []*card.ColumnList{}
- rows, err := d.columnList.Query(ctx, now)
- if err != nil {
- log.Error("query error(%v)", err)
- return
- }
- for rows.Next() {
- c := &card.ColumnList{}
- if err = rows.Scan(&c.Ceid, &c.Cname, &c.Cid, &c.Name, &c.PlatVer); err != nil {
- log.Error("rows.Scan error(%v)", err)
- res = nil
- return
- }
- res = append(res, c)
- }
- return
- }
- // Card channel card
- func (d *Dao) Card(ctx context.Context, now time.Time) (res []*card.PopularCard, err error) {
- rows, err := d.db.Query(ctx, _cardSQL, now, now)
- if err != nil {
- return
- }
- defer rows.Close()
- for rows.Next() {
- c := &card.PopularCard{}
- var valueStr string
- if err = rows.Scan(&c.ID, &c.Title, &c.Type, &valueStr, &c.Reason, &c.ReasonType, &c.Pos); err != nil {
- return
- }
- c.Value, _ = strconv.ParseInt(valueStr, 10, 64)
- res = append(res, c)
- }
- return
- }
- // CardPlat channel card plat
- func (d *Dao) CardPlat(ctx context.Context) (res map[int64]map[int8][]*card.PopularCardPlat, err error) {
- res = map[int64]map[int8][]*card.PopularCardPlat{}
- rows, err := d.db.Query(ctx, _cardPlatSQL)
- if err != nil {
- return
- }
- defer rows.Close()
- for rows.Next() {
- c := &card.PopularCardPlat{}
- if err = rows.Scan(&c.CardID, &c.Plat, &c.Condition, &c.Build); err != nil {
- return
- }
- if r, ok := res[c.CardID]; !ok {
- res[c.CardID] = map[int8][]*card.PopularCardPlat{
- c.Plat: []*card.PopularCardPlat{c},
- }
- } else {
- r[c.Plat] = append(r[c.Plat], c)
- }
- }
- return
- }
- // CardSet card set
- func (d *Dao) CardSet(ctx context.Context) (res map[int64]*operate.CardSet, err error) {
- var rows *sql.Rows
- if rows, err = d.db.Query(ctx, _cardSetSQL); err != nil {
- return
- }
- defer rows.Close()
- res = make(map[int64]*operate.CardSet)
- for rows.Next() {
- var (
- c = &operate.CardSet{}
- value string
- )
- if err = rows.Scan(&c.ID, &c.Type, &value, &c.Title, &c.LongTitle, &c.Content); err != nil {
- return
- }
- c.Value, _ = strconv.ParseInt(value, 10, 64)
- res[c.ID] = c
- }
- return
- }
- // EventTopic event_topic all
- func (d *Dao) EventTopic(ctx context.Context) (res map[int64]*operate.EventTopic, err error) {
- var rows *sql.Rows
- if rows, err = d.db.Query(ctx, _eventTopicSQL); err != nil {
- return
- }
- defer rows.Close()
- res = make(map[int64]*operate.EventTopic)
- for rows.Next() {
- c := &operate.EventTopic{}
- if err = rows.Scan(&c.ID, &c.Title, &c.Desc, &c.Cover, &c.ReType, &c.ReValue, &c.Corner); err != nil {
- return
- }
- res[c.ID] = c
- }
- return
- }
|