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.
211 lines
5.9 KiB
211 lines
5.9 KiB
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) |
|
}
|
|
|