Create & Init Project...
This commit is contained in:
133
app/job/main/dm2/service/dm_special.go
Normal file
133
app/job/main/dm2/service/dm_special.go
Normal file
@ -0,0 +1,133 @@
|
||||
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
|
||||
}
|
Reference in New Issue
Block a user