123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336 |
- 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
- }
|