2019-04-22 02:59:20 +00:00

225 lines
5.7 KiB
Go

package service
import (
"context"
"encoding/json"
"fmt"
"go-common/app/admin/main/aegis/model/business"
"go-common/app/admin/main/aegis/model/middleware"
"go-common/library/ecode"
"go-common/library/log"
)
// AddBusiness .
func (s *Service) AddBusiness(c context.Context, b *business.Business) (id int64, err error) {
if id, err = s.gorm.AddBusiness(c, b); err != nil {
log.Error("s.gorm.AddBusiness error(%v)", err)
}
return
}
// UpdateBusiness .
func (s *Service) UpdateBusiness(c context.Context, b *business.Business) (err error) {
if err = s.gorm.UpdateBusiness(c, b); err != nil {
log.Error("s.gorm.UpdateBusiness error(%v)", err)
}
return
}
// SetBusinessState .
func (s *Service) SetBusinessState(c context.Context, b *business.Business) (err error) {
if int8(b.State) == business.StateEnable {
if err = s.gorm.EnableBusiness(c, b.ID); err != nil {
log.Error("s.gorm.EnableBusiness error(%v)", err)
}
} else {
if err = s.gorm.DisableBusiness(c, b.ID); err != nil {
log.Error("s.gorm.EnableBusiness error(%v)", err)
}
}
return
}
// Business .
func (s *Service) Business(c context.Context, b *business.Business) (res *business.Business, err error) {
if res, err = s.gorm.Business(c, b.ID); err != nil {
log.Error("s.gorm.Business error(%v)", err)
}
return
}
// BusinessList .
func (s *Service) BusinessList(c context.Context, businessID []int64, onlyEnable bool) (res []*business.Business, err error) {
if res, err = s.gorm.BusinessList(c, 0, businessID, onlyEnable); err != nil {
log.Error("s.gorm.BusinessList error(%v) ids(%+v)", err, businessID)
}
s.mulIDtoName(c, res, s.transUnames, "UID", "UserName")
return
}
func (s *Service) transUnames(c context.Context, uids []int64) (unames map[int64][]interface{}, err error) {
unames = make(map[int64][]interface{})
uns, err := s.http.GetUnames(c, uids)
if err != nil {
return
}
for uid, uname := range uns {
unames[uid] = []interface{}{uname}
}
return
}
// AddBizCFG .
func (s *Service) AddBizCFG(c context.Context, b *business.BizCFG) (lastid int64, err error) {
return s.gorm.AddBizConfig(c, b)
}
// UpdateBizCFG .
func (s *Service) UpdateBizCFG(c context.Context, b *business.BizCFG) (err error) {
if err = s.gorm.EditBizConfig(c, b); err != nil {
log.Error("s.gorm.UpdateBizCFG error(%v)", err)
return
}
delete(s.bizCfgCache, fmt.Sprintf("%d_%d", b.BusinessID, b.TP))
delete(s.bizRoleCache, b.BusinessID)
delete(s.taskRoleCache, b.BusinessID)
delete(s.bizMiddlewareCache, b.BusinessID)
return
}
// ListBizCFGs .
func (s *Service) ListBizCFGs(c context.Context, bizid int64) (res []*business.BizCFG, err error) {
if res, err = s.gorm.GetConfigs(c, bizid); err != nil {
log.Error("s.gorm.ListBizCFGs error(%v)", err)
}
return
}
// ReserveCFG 保留字配置
func (s *Service) ReserveCFG(c context.Context, bizid int64) (rsvcfg map[string]interface{}, err error) {
var rsv string
if rsv = s.getConfig(c, bizid, business.TypeReverse); len(rsv) == 0 {
return
}
rsvcfg = make(map[string]interface{})
if err = json.Unmarshal([]byte(rsv), &rsvcfg); err != nil {
log.Error("json.Unmarshal error(%v)", err)
err = ecode.AegisReservedCfgErr
}
return
}
// AttributeCFG 属性位配置
func (s *Service) AttributeCFG(c context.Context, bizid int64) (attrcfg map[string]uint, err error) {
var attr string
if attr = s.getConfig(c, bizid, business.TypeAttribute); len(attr) == 0 {
return
}
attrcfg = make(map[string]uint)
if err = json.Unmarshal([]byte(attr), &attrcfg); err != nil {
log.Error("json.Unmarshal error(%v)", err)
}
return
}
func (s *Service) syncBizCache(c context.Context) (err error) {
var (
bizcfg []*business.BizCFG
)
if bizcfg, err = s.gorm.ActiveConfigs(c); err != nil {
return
}
bizTpMap := map[string]string{}
bizRoleMap := map[int64]map[string]int64{}
taskRoleMap := map[int64]map[int64][]int64{}
bizMiddleware := map[int64][]*middleware.Aggregate{}
for _, item := range bizcfg {
bizTpMap[fmt.Sprintf("%d_%d", item.BusinessID, item.TP)] = item.Config
biz, taskRole, err := item.FormatMngBID()
if err == nil && len(taskRole) > 0 {
taskRoleMap[biz] = taskRole
}
bizID, bizRoles, err := item.FormatBizBID()
if err == nil && len(bizRoles) > 0 {
bizRoleMap[bizID] = bizRoles
}
mws, err := item.FormatAggregate()
if err == nil && len(mws) > 0 {
bizMiddleware[item.BusinessID] = mws
}
}
s.bizCfgCache = bizTpMap
s.bizRoleCache = bizRoleMap
s.taskRoleCache = taskRoleMap
s.bizMiddlewareCache = bizMiddleware
return
}
func (s *Service) getConfig(c context.Context, bizid int64, tp int8) (cfg string) {
var ok bool
if cfg, ok = s.bizCfgCache[fmt.Sprintf("%d_%d", bizid, tp)]; ok {
return cfg
}
s.syncBizCache(c)
cfg = s.bizCfgCache[fmt.Sprintf("%d_%d", bizid, tp)]
return
}
func (s *Service) getTaskRole(c context.Context, bizid int64) (cfgs map[int64][]int64) {
var exist bool
if cfgs, exist = s.taskRoleCache[bizid]; exist {
return cfgs
}
s.syncBizCache(c)
cfgs = s.taskRoleCache[bizid]
return
}
func (s *Service) getTaskBiz(c context.Context, bids []int64) (bizs []int64, flows []int64) {
bizs = []int64{}
flows = []int64{}
s.syncBizCache(c)
for _, bid := range bids {
for biz, item := range s.taskRoleCache {
if v, exist := item[bid]; exist && len(v) > 0 {
bizs = append(bizs, biz)
flows = append(flows, v...)
}
}
}
return
}
func (s *Service) getBizRole(c context.Context, mngID int64) (bizRole map[string]int64, bizID int64) {
for biz, item := range s.bizRoleCache {
if item[business.BizBIDMngID] == mngID {
bizID = biz
bizRole = item
return
}
}
s.syncBizCache(c)
for biz, item := range s.bizRoleCache {
if item[business.BizBIDMngID] == mngID {
bizID = biz
bizRole = item
break
}
}
return
}