212 lines
5.9 KiB
Go
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)
|
|
}
|