123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- package service
- import (
- "context"
- "encoding/json"
- "fmt"
- "sort"
- "go-common/app/job/main/dm2/model"
- )
- const (
- _bfsMaxSize = 16 * 1024 * 1024 // size MediumText
- _specialJSONItemSize = 20 + 1 // {"id":,"content":""},
- _specialJSONAtLeastSize = 2 // []
- )
- // buildSpeicalDms build when db is no record
- func (s *Service) speicalDms(c context.Context, tp int32, oid int64) (dms []*model.DM, err error) {
- var (
- dmids []int64
- spContentMap map[int64]*model.ContentSpecial
- contentMap map[int64]*model.Content
- )
- if dms, dmids, err = s.dao.IndexsByPool(c, tp, oid, model.PoolSpecial); err != nil {
- return
- }
- if len(dmids) == 0 {
- return
- }
- if contentMap, err = s.dao.Contents(c, oid, dmids); err != nil {
- return
- }
- if spContentMap, err = s.dao.ContentsSpecial(c, dmids); err != nil {
- return
- }
- for _, dm := range dms {
- if v, ok := contentMap[dm.ID]; ok {
- dm.Content = v
- }
- if v, ok := spContentMap[dm.ID]; ok {
- dm.ContentSpe = v
- }
- }
- sort.Slice(dms, func(i, j int) bool {
- return dms[i].Progress < dms[j].Progress
- })
- return
- }
- func (s *Service) buildSpecialDms(c context.Context, dms []*model.DM) (bss [][]byte, err error) {
- var (
- dmSpecialContents []*model.DmSpecialContent
- bs []byte
- length int
- )
- if len(dms) == 0 {
- return
- }
- dmSpecialContents = make([]*model.DmSpecialContent, 0, len(dms))
- length = _specialJSONAtLeastSize
- for _, dm := range dms {
- if len(dm.GetSpecialSeg()) == 0 {
- continue
- }
- itemSize := len(fmt.Sprint(dm.ID)) + len(dm.GetSpecialSeg()) + _specialJSONItemSize
- if length+itemSize > _bfsMaxSize {
- if bs, err = json.Marshal(dmSpecialContents); err != nil {
- return
- }
- bss = append(bss, bs)
- dmSpecialContents = make([]*model.DmSpecialContent, 0, len(dms))
- length = _specialJSONAtLeastSize
- }
- length += itemSize
- dmSpecialContents = append(dmSpecialContents, &model.DmSpecialContent{
- ID: dm.ID,
- Content: dm.GetSpecialSeg(),
- })
- }
- if len(dmSpecialContents) > 0 {
- if bs, err = json.Marshal(dmSpecialContents); err != nil {
- return
- }
- bss = append(bss, bs)
- }
- return
- }
- func (s *Service) updateSpecualDms(c context.Context, tp int32, oid int64, bss [][]byte) (err error) {
- var (
- location string
- locations []string
- ds *model.DmSpecial
- )
- for _, bs := range bss {
- if len(bs) == 0 {
- continue
- }
- if location, err = s.dao.BfsDmUpload(c, "", bs); err != nil {
- return
- }
- locations = append(locations, location)
- }
- ds = &model.DmSpecial{
- Type: tp,
- Oid: oid,
- }
- ds.Join(locations)
- if err = s.dao.UpsertDmSpecialLocation(c, ds.Type, ds.Oid, ds.Locations); err != nil {
- return
- }
- return
- }
- func (s *Service) specialLocationUpdate(c context.Context, tp int32, oid int64) (err error) {
- var (
- dms []*model.DM
- bss [][]byte
- )
- if dms, err = s.speicalDms(c, tp, oid); err != nil {
- return
- }
- if bss, err = s.buildSpecialDms(c, dms); err != nil {
- return
- }
- if err = s.updateSpecualDms(c, tp, oid, bss); err != nil {
- return
- }
- return
- }
|