Files
go-common/app/admin/main/workflow/service/business.go
2019-04-22 18:49:16 +08:00

212 lines
5.9 KiB
Go

package service
import (
"context"
"sort"
"strings"
"time"
"go-common/app/admin/main/workflow/model"
"go-common/app/admin/main/workflow/model/param"
"go-common/library/ecode"
"go-common/library/log"
)
const (
_lenShortCut = 8
)
// 0: 有效 1: 无效 2: 流转 3: 众裁 4: 批量有效 5: 批量无效 6: 批量流转 7: 批量移交众裁
var btnName = map[uint]string{
0: "有效",
1: "无效",
2: "流转",
3: "众裁",
4: "批量有效",
5: "批量无效",
6: "批量流转",
7: "批量移交众裁",
}
var btnInitShortCut = map[uint]string{
0: "A",
1: "S",
2: "D",
3: "F",
4: "J",
5: "K",
6: "H",
7: "L",
}
// ListMeta will list business meta inforamtion from DAO
func (s *Service) ListMeta(c context.Context, itemType string) (metaList []*model.Meta, err error) {
allMetas := s.dao.AllMetas(c)
if err != nil {
log.Error("Failed to fetch all metas from database: %v", err)
return
}
metaList = make([]*model.Meta, 0, len(allMetas))
for _, m := range allMetas {
if itemType != "" && m.ItemType != itemType {
continue
}
//sort rounds field asc by id
sort.Sort(model.RoundSlice(m.Rounds))
metaList = append(metaList, m)
}
//sort meta asc by business
sort.Sort(model.MetaSlice(metaList))
return
}
// ListBusAttr list business attr info
func (s *Service) ListBusAttr(ctx context.Context) (busAttr []*model.BusinessAttr, err error) {
busAttr = make([]*model.BusinessAttr, 0)
if err = s.dao.ORM.Table("workflow_business_attr").Find(&busAttr).Error; err != nil {
return
}
return
}
// ListBusAttrV3 .
func (s *Service) ListBusAttrV3(ctx context.Context) (busAttr []*model.BusinessAttr, err error) {
log.Info("start ListBusAttrV3")
t := time.Now()
busAttr = make([]*model.BusinessAttr, 0)
if err = s.dao.ORM.Table("workflow_business_attr").Find(&busAttr).Error; err != nil {
log.Info("query table workflow_business_attr error(%v)", err)
return
}
for _, attr := range busAttr {
btnShortCut := strings.Split(attr.ButtonKey, ",")
if len(btnShortCut) != _lenShortCut {
log.Warn("button short cut length not 8, load initial value")
btnShortCut = []string{"A", "S", "D", "F", "J", "K", "H", "L"}
}
for i := uint(0); i < _lenShortCut; i++ {
state := false
mask := uint8(1 << i)
if attr.Button&mask > 0 {
state = true
}
if btnShortCut[i] == "" {
btnShortCut[i] = btnInitShortCut[i]
}
attr.Buttons = append(attr.Buttons, &model.Button{
Index: int(i),
Name: btnName[i],
State: state,
Key: btnShortCut[i],
})
}
}
log.Info("end ListBusAttrV3 time(%v)", time.Since(t).String())
return
}
// AddOrUpdateBusAttr add or update business attr info
func (s *Service) AddOrUpdateBusAttr(ctx context.Context, abap *param.AddBusAttrParam) (err error) {
busAttr := &model.BusinessAttr{
ID: abap.ID,
}
attr := map[string]interface{}{
"bid": abap.Bid,
"name": abap.Name,
"deal_type": abap.DealType,
"expire_time": abap.ExpireTime,
"assign_type": abap.AssignType,
"assign_max": abap.AssignMax,
"group_type": abap.GroupType,
"business_name": abap.BusinessName,
}
if err = s.dao.ORM.Table("workflow_business_attr").
Where("id=?", abap.ID).
Assign(attr).FirstOrCreate(busAttr).Error; err != nil {
log.Error("Failed to create business_attr(%+v): %v", busAttr, err)
return
}
s.loadBusAttrs()
return
}
// SetSwitch .
func (s *Service) SetSwitch(ctx context.Context, bs *param.BusAttrButtonSwitch) (err error) {
attr := new(model.BusinessAttr)
if err = s.dao.ORM.Table("workflow_business_attr").Where("bid = ?", bs.Bid).Find(attr).Error; err != nil {
log.Error("Failed to find business_attr where bid = %d : %v", bs.Bid, err)
return
}
oldBut := attr.Button
mask := uint8(^(1 << bs.Index))
oldBut = oldBut & mask
newBut := oldBut + (bs.Switch << bs.Index)
if err = s.dao.ORM.Table("workflow_business_attr").Where("bid = ?", bs.Bid).Update("button", newBut).Error; err != nil {
log.Error("Failed to update business_attr button field where bid = %d, button = %d : %v", bs.Bid, newBut, err)
}
return
}
// SetShortCut .
func (s *Service) SetShortCut(ctx context.Context, sc *param.BusAttrButtonShortCut) (err error) {
attr := new(model.BusinessAttr)
if err = s.dao.ORM.Table("workflow_business_attr").Where("bid = ?", sc.Bid).Find(attr).Error; err != nil {
log.Error("Failed to find business_attr where bid = %d : %v", sc.Bid, err)
return
}
oldShortCut := strings.Split(attr.ButtonKey, ",")
if len(oldShortCut) != 8 {
oldShortCut = make([]string, 8)
}
oldShortCut[sc.Index] = sc.ShortCut
newShortCut := strings.Join(oldShortCut, ",")
if err = s.dao.ORM.Table("workflow_business_attr").Where("bid = ?", sc.Bid).Update("button_key", newShortCut).Error; err != nil {
log.Error("Failed to update business_attr button_key field where bid = %d, button_key = %d : %v", sc.Bid, newShortCut, err)
}
return
}
// ManagerTag .
func (s *Service) ManagerTag(ctx context.Context) (map[int8]map[int64]*model.TagMeta, error) {
return s.tagListCache, nil
}
// UserBlockInfo .
// http://info.bilibili.co/pages/viewpage.action?pageId=5417571
// http://info.bilibili.co/pages/viewpage.action?pageId=7559616
func (s *Service) UserBlockInfo(ctx context.Context, bi *param.BlockInfo) (resp model.BlockInfoResp, err error) {
var sum int64
if sum, err = s.dao.BlockNum(ctx, bi.Mid); err != nil {
log.Error("s.dao.BlockNum(%d) error(%v)", bi.Mid, err)
return
}
if resp, err = s.dao.BlockInfo(ctx, bi.Mid); err != nil {
log.Error("s.dao.BlockInfo(%d) error(%v)", bi.Mid, err)
return
}
resp.Data.BlockedSum = sum
return
}
// SourceList .
func (s *Service) SourceList(ctx context.Context, src *param.Source) (data map[string]interface{}, err error) {
// check if has external uri
if _, ok := s.callbackCache[src.Bid]; !ok {
err = ecode.WkfBusinessCallbackConfigNotFound
return
}
uri := ""
if uri = s.callbackCache[src.Bid].SourceAPI; uri == "" {
return
}
return s.dao.SourceInfo(ctx, uri)
}