go-common/app/admin/main/aegis/service/transition.go
2019-04-22 18:49:16 +08:00

337 lines
8.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package service
import (
"context"
"fmt"
"time"
"go-common/app/admin/main/aegis/model"
"go-common/app/admin/main/aegis/model/net"
"go-common/library/ecode"
"go-common/library/log"
"github.com/jinzhu/gorm"
)
func (s *Service) prepareBeforeTrigger(c context.Context, rids []int64, flowID, bizid int64) (err error) {
var (
enableDir []*net.Direction
tids []int64
transition []*net.Transition
)
//以flow为起点的有向线
if enableDir, err = s.fetchFlowNextEnableDirs(c, flowID); err != nil {
log.Error("prepareBeforeTrigger s.fetchFlowNextEnableDirs error(%v) flowid(%d) rids(%v)", err, flowID, rids)
return
}
//flow下游没有变迁属于正常情况
if len(enableDir) == 0 {
return
}
//所有可用有向线的变迁限制
tids = []int64{}
for _, dir := range enableDir {
tids = append(tids, dir.TransitionID)
}
if transition, err = s.transitions(c, tids, true); err != nil {
log.Error("prepareBeforeTrigger s.transitions(%+v) error(%v) flowid(%d) rids(%v)", tids, err, flowID, rids)
return
}
for _, item := range transition {
if item.Trigger != net.TriggerManual || item.Limit <= 0 {
continue
}
for _, rid := range rids {
s.sendCreateTaskMsg(c, rid, flowID, item.Limit, bizid)
}
}
return
}
//ShowTransition .
func (s *Service) ShowTransition(c context.Context, id int64) (r *net.ShowTransitionResult, err error) {
var (
t *net.Transition
tks map[int64][]*net.TokenBind
)
if t, err = s.gorm.TransitionByID(c, id); err != nil {
return
}
if tks, err = s.gorm.TokenBindByElement(c, []int64{id}, net.BindTranType, true); err != nil {
return
}
r = &net.ShowTransitionResult{
Transition: t,
Tokens: tks[id],
}
return
}
//GetTranByNet .
func (s *Service) GetTranByNet(c context.Context, netID int64) (result map[int64]string, err error) {
var (
trans []*net.Transition
)
result = map[int64]string{}
if trans, err = s.gorm.TranByNet(c, netID, true); err != nil {
log.Error("GetTranByNet s.gorm.TranByNet(%d) error(%v)", netID, err)
return
}
for _, item := range trans {
result[item.ID] = item.ChName
}
return
}
//GetTransitionList .
func (s *Service) GetTransitionList(c context.Context, pm *net.ListNetElementParam) (result *net.ListTransitionRes, err error) {
var (
transitionID []int64
tks map[int64][]*net.TokenBind
uid = []int64{}
unames map[int64]string
)
if result, err = s.gorm.TransitionList(c, pm); err != nil {
return
}
if len(result.Result) == 0 {
return
}
for _, item := range result.Result {
transitionID = append(transitionID, item.ID)
uid = append(uid, item.UID)
}
if tks, err = s.gorm.TokenBindByElement(c, transitionID, net.BindTranType, true); err != nil {
return
}
if unames, err = s.http.GetUnames(c, uid); err != nil {
log.Error("GetTransitionList s.http.GetUnames error(%v)", err)
err = nil
}
for _, item := range result.Result {
item.Username = unames[item.UID]
for _, bd := range tks[item.ID] {
item.Tokens = append(item.Tokens, bd.ChName)
}
}
return
}
func (s *Service) checkTransitionUnique(c context.Context, netID int64, name string) (err error, msg string) {
var exist *net.Transition
if exist, err = s.gorm.TransitionByUnique(c, netID, name); err != nil {
log.Error("checkTransitionUnique s.gorm.TransitionByUnique(%d,%s) error(%v)", netID, name, err)
return
}
if exist != nil {
err = ecode.AegisUniqueAlreadyExist
msg = fmt.Sprintf(ecode.AegisUniqueAlreadyExist.Message(), "变化", name)
}
return
}
//AddTransition .
func (s *Service) AddTransition(c context.Context, uid int64, f *net.TransitionEditParam) (id int64, err error, msg string) {
var (
tx *gorm.DB
diff = []string{}
diffBind string
)
if err, msg = s.checkTransitionUnique(c, f.NetID, f.Name); err != nil {
return
}
tran := &net.Transition{
NetID: f.NetID,
Trigger: f.Trigger,
Limit: f.Limit,
Name: f.Name,
ChName: f.ChName,
Description: f.Description,
UID: uid,
}
//db update
tx, err = s.gorm.BeginTx(c)
if err != nil {
log.Error("AddTransition s.gorm.BeginTx error(%v)", err)
return
}
if err = s.gorm.AddItem(c, tx, tran); err != nil {
tx.Rollback()
return
}
if diffBind, _, err, msg = s.compareTranBind(c, tx, tran.ID, f.TokenList, false); err != nil {
log.Error("AddTransition s.compareTranBind error(%v) params(%+v)", err, f)
tx.Rollback()
return
}
if diffBind != "" {
diff = append(diff, diffBind)
}
if err = tx.Commit().Error; err != nil {
log.Error("AddTransition tx.Commit error(%v)", err)
return
}
id = tran.ID
//日志
diff = append(diff, model.LogFieldTemp(model.LogFieldChName, f.ChName, "", false))
diff = append(diff, model.LogFieldTemp(model.LogFieldName, f.Name, "", false))
diff = append(diff, model.LogFieldTemp(model.LogFieldLimit, f.Limit, "", false))
diff = append(diff, model.LogFieldTemp(model.LogFieldTrigger, net.TriggerDesc[f.Trigger], "", false))
oper := &model.NetConfOper{
OID: tran.ID,
Action: model.LogNetActionNew,
UID: tran.UID,
NetID: tran.NetID,
ChName: tran.ChName,
TranID: tran.ID,
Diff: diff,
}
s.sendNetConfLog(c, model.LogTypeTranConf, oper)
return
}
//UpdateTransition .
func (s *Service) UpdateTransition(c context.Context, uid int64, f *net.TransitionEditParam) (err error, msg string) {
var (
old *net.Transition
updates = map[string]interface{}{}
tx *gorm.DB
diff = []string{}
diffBind string
changedBind []int64
)
if old, err = s.gorm.TransitionByID(c, f.ID); err != nil {
log.Error("UpdateTransition s.gorm.TransitionByID(%d) error(%v)", f.ID, err)
return
}
if f.Name != old.Name {
if err, msg = s.checkTransitionUnique(c, f.NetID, f.Name); err != nil {
return
}
diff = append(diff, model.LogFieldTemp(model.LogFieldName, f.Name, old.Name, true))
old.Name = f.Name
updates["name"] = f.Name
}
if f.ChName != old.ChName {
diff = append(diff, model.LogFieldTemp(model.LogFieldChName, f.ChName, old.ChName, true))
old.ChName = f.ChName
updates["ch_name"] = f.ChName
}
if f.Description != old.Description {
old.Description = f.Description
updates["description"] = f.Description
}
if f.Limit != old.Limit {
diff = append(diff, model.LogFieldTemp(model.LogFieldLimit, f.Limit, old.Limit, true))
old.Limit = f.Limit
updates["limit"] = f.Limit
}
if f.Trigger != old.Trigger {
diff = append(diff, model.LogFieldTemp(model.LogFieldTrigger, net.TriggerDesc[f.Trigger], net.TriggerDesc[old.Trigger], true))
old.Trigger = f.Trigger
updates["trigger"] = f.Trigger
}
//db update
tx, err = s.gorm.BeginTx(c)
if err != nil {
log.Error("UpdateTransition s.gorm.BeginTx error(%v)", err)
return
}
if len(updates) > 0 {
if err = s.gorm.UpdateFields(c, tx, net.TableTransition, old.ID, updates); err != nil {
tx.Rollback()
return
}
}
if diffBind, changedBind, err, msg = s.compareTranBind(c, tx, old.ID, f.TokenList, true); err != nil {
log.Error("UpdateTransition s.compareTranBind error(%v) params(%+v)", err, f)
tx.Rollback()
return
}
if diffBind != "" {
diff = append(diff, diffBind)
}
if err = tx.Commit().Error; err != nil {
log.Error("UpdateTransition tx.Commit error(%v)", err)
return
}
s.delTranCache(c, old, changedBind)
//日志
if len(diff) == 0 {
return
}
oper := &model.NetConfOper{
OID: old.ID,
Action: model.LogNetActionUpdate,
UID: uid,
NetID: old.NetID,
ChName: old.ChName,
TranID: old.ID,
Diff: diff,
}
s.sendNetConfLog(c, model.LogTypeTranConf, oper)
return
}
//SwitchTransition .
func (s *Service) SwitchTransition(c context.Context, id int64, needDisable bool) (err error) {
var (
old *net.Transition
dirs []*net.Direction
action string
)
if old, err = s.gorm.TransitionByID(c, id); err != nil {
log.Error("SwitchTransition s.gorm.TransitionByID(%d) error(%v) needDisable(%v)", id, err, needDisable)
return
}
available := old.IsAvailable()
if available == !needDisable {
return
}
if needDisable {
if dirs, err = s.gorm.DirectionByTransitionID(c, []int64{id}, 0, true); err != nil {
log.Error("SwitchTransition s.gorm.DirectionByTransitionID(%d) error(%v)", id, err)
return
}
if len(dirs) > 0 {
log.Error("SwitchTransition dir by transition(%d) founded", id)
err = ecode.AegisTranBinded
return
}
old.DisableTime = time.Now()
action = model.LogNetActionDisable
} else {
old.DisableTime = net.Recovered
action = model.LogNetActionAvailable
}
if err = s.gorm.UpdateFields(c, nil, net.TableTransition, id, map[string]interface{}{"disable_time": old.DisableTime}); err != nil {
return
}
s.delTranCache(c, old, nil)
//日志
oper := &model.NetConfOper{
OID: old.ID,
Action: action,
UID: old.UID,
NetID: old.NetID,
ChName: old.ChName,
TranID: old.ID,
}
s.sendNetConfLog(c, model.LogTypeTranConf, oper)
return
}