You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
3.0 KiB
133 lines
3.0 KiB
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 |
|
}
|
|
|