/* Copyright (c) [2023] [pcm] [pcm-coordinator] is licensed under Mulan PSL v2. You can use this software according to the terms and conditions of the Mulan PSL v2. You may obtain a copy of Mulan PSL v2 at: http://license.coscl.org.cn/MulanPSL2 THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPaRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. See the Mulan PSL v2 for more details. */ package participantservicelogic import ( "context" "github.com/pkg/errors" models2 "gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/models" "gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/utils" "gorm.io/gorm" "time" "gitlink.org.cn/jcce-pcm/pcm-coordinator/rpc/internal/svc" "gitlink.org.cn/jcce-pcm/pcm-coordinator/rpc/pcmCore" "github.com/zeromicro/go-zero/core/logx" ) type RegisterParticipantLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger } func NewRegisterParticipantLogic(ctx context.Context, svcCtx *svc.ServiceContext) *RegisterParticipantLogic { return &RegisterParticipantLogic{ ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx), } } // RegisterParticipant Participant注册接口 func (l *RegisterParticipantLogic) RegisterParticipant(in *pcmCore.ParticipantPhyReq) (*pcmCore.ParticipantPhyResp, error) { //判断ParticipantId是否存在 db := l.svcCtx.DbEngin.Begin() // 执行回滚或者提交操作 defer func() { if p := recover(); p != nil { db.Rollback() logx.Error(p) } else if db.Error != nil { logx.Info("rollback") db.Rollback() } else { db = db.Commit() logx.Info("commit success") } }() participantInfo := &models2.ScParticipantPhyInfo{} utils.Convert(in, participantInfo) if in.ParticipantId == 0 { participantInfo.Id = utils.GenSnowflakeID() } else { participantInfo.Id = in.ParticipantId } //保存participant静态信息 result := db.Save(&participantInfo) //保存节点信息 nodeList := make([]*models2.ScNodePhyInfo, 0) for _, info := range in.NodeInfo { nodeInfo := &models2.ScNodePhyInfo{} utils.Convert(info, nodeInfo) nodeInfo.CreatedTime = time.Now() nodeInfo.ParticipantId = participantInfo.Id //查询节点name与ParticipantId是否存在 nodeErr := db.Where(&models2.ScNodePhyInfo{NodeName: nodeInfo.NodeName, ParticipantId: in.ParticipantId}).Take(nodeInfo) if errors.Is(nodeErr.Error, gorm.ErrRecordNotFound) { nodeInfo.Id = utils.GenSnowflakeID() } nodeList = append(nodeList, nodeInfo) } result = db.Save(&nodeList) //保存队列信息 queueList := make([]*models2.ScQueuePhyInfo, 0) for _, info := range in.QueueInfo { queueInfo := &models2.ScQueuePhyInfo{} utils.Convert(info, queueInfo) queueInfo.ParticipantId = participantInfo.Id //查询队列name与ParticipantId是否存在 queueErr := db.Where(&models2.ScQueuePhyInfo{QueueName: queueInfo.QueueName, ParticipantId: in.ParticipantId}).Take(queueInfo) if errors.Is(queueErr.Error, gorm.ErrRecordNotFound) { queueInfo.Id = utils.GenSnowflakeID() } queueList = append(queueList, queueInfo) } result = db.Save(&queueList) //保存标签信息 labelList := make([]*models2.ScParticipantLabelInfo, 0) for _, label := range in.LabelInfo { labelInfo := &models2.ScParticipantLabelInfo{} utils.Convert(label, labelInfo) labelInfo.CreatedTime = time.Now() labelInfo.ParticipantId = participantInfo.Id //查询标签key value与ParticipantId是否存在 labelErr := db.Where(&models2.ScParticipantLabelInfo{Key: labelInfo.Key, Value: labelInfo.Value, ParticipantId: in.ParticipantId}).Take(labelInfo) if errors.Is(labelErr.Error, gorm.ErrRecordNotFound) { labelInfo.Id = utils.GenSnowflakeID() } labelList = append(labelList, labelInfo) } result = db.Save(&labelList) if result.Error != nil { logx.Errorf("orm err:", result.Error) return &pcmCore.ParticipantPhyResp{}, nil } return &pcmCore.ParticipantPhyResp{ Code: 200, Msg: "ok", ParticipantId: participantInfo.Id, }, nil }