Browse Source

增加拷贝阶段按钮

boweniac 2 months ago
parent
commit
7f5f307e3c

+ 8 - 0
desc/wechat/sop_stage.api

@@ -217,6 +217,10 @@ type (
         // 阶段名称
         Offset  *int `json:"offset,optional"`
     }
+    StageCopyReq {
+        // SopStage id | SopStage id
+        Id uint64 `json:"id"`
+    }
 )
 
 @server(
@@ -263,4 +267,8 @@ service Wechat {
     // Get sop stage move | 移动阶段顺序
     @handler moveSopStage
     post /sop_stage/move (SopStageMoveReq) returns (BaseMsgResp)
+
+    // stage copy | SopStage 复制
+    @handler sopStageCopy
+    post /sop_stage/copy (StageCopyReq) returns (BaseMsgResp)
 }

+ 5 - 0
internal/handler/routes.go

@@ -587,6 +587,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
 					Path:    "/sop_stage/move",
 					Handler: sop_stage.MoveSopStageHandler(serverCtx),
 				},
+				{
+					Method:  http.MethodPost,
+					Path:    "/sop_stage/copy",
+					Handler: sop_stage.SopStageCopyHandler(serverCtx),
+				},
 			}...,
 		),
 		rest.WithJwt(serverCtx.Config.Auth.AccessSecret),

+ 44 - 0
internal/handler/sop_stage/sop_stage_copy_handler.go

@@ -0,0 +1,44 @@
+package sop_stage
+
+import (
+	"net/http"
+
+	"github.com/zeromicro/go-zero/rest/httpx"
+
+	"wechat-api/internal/logic/sop_stage"
+	"wechat-api/internal/svc"
+	"wechat-api/internal/types"
+)
+
+// swagger:route post /sop_stage/copy sop_stage SopStageCopy
+//
+// stage copy | SopStage 复制
+//
+// stage copy | SopStage 复制
+//
+// Parameters:
+//  + name: body
+//    require: true
+//    in: body
+//    type: StageCopyReq
+//
+// Responses:
+//  200: BaseMsgResp
+
+func SopStageCopyHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.StageCopyReq
+		if err := httpx.Parse(r, &req, true); err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+			return
+		}
+
+		l := sop_stage.NewSopStageCopyLogic(r.Context(), svcCtx)
+		resp, err := l.SopStageCopy(&req)
+		if err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+		} else {
+			httpx.OkJsonCtx(r.Context(), w, resp)
+		}
+	}
+}

+ 106 - 0
internal/logic/sop_stage/sop_stage_copy_logic.go

@@ -0,0 +1,106 @@
+package sop_stage
+
+import (
+	"context"
+	"github.com/suyuan32/simple-admin-common/msg/errormsg"
+	"wechat-api/ent"
+	"wechat-api/ent/sopnode"
+	"wechat-api/ent/sopstage"
+	"wechat-api/internal/utils/dberrorhandler"
+
+	"wechat-api/internal/svc"
+	"wechat-api/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type SopStageCopyLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewSopStageCopyLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SopStageCopyLogic {
+	return &SopStageCopyLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx}
+}
+
+func (l *SopStageCopyLogic) SopStageCopy(req *types.StageCopyReq) (resp *types.BaseMsgResp, err error) {
+	//  查询任务及阶段
+	data, err := l.svcCtx.DB.SopStage.Query().
+		Where(sopstage.ID(req.Id)).
+		Only(l.ctx)
+	if err != nil {
+		return nil, dberrorhandler.DefaultEntError(l.Logger, err, req)
+	}
+
+	//  开始事务
+	tx, err := l.svcCtx.DB.Tx(context.Background())
+	if err != nil {
+		return nil, dberrorhandler.DefaultEntError(l.Logger, err, req)
+	}
+
+	//  创建新阶段
+	newStage, err := tx.SopStage.Create().
+		SetTaskID(data.TaskID).
+		SetName(data.Name).
+		SetConditionType(data.ConditionType).
+		SetConditionOperator(data.ConditionOperator).
+		SetConditionList(data.ConditionList).
+		SetNotNilActionMessage(data.ActionMessage).
+		SetNotNilActionLabelAdd(data.ActionLabelAdd).
+		SetNotNilActionLabelDel(data.ActionLabelDel).
+		SetNotNilActionForward(&data.ActionForward).
+		SetIndexSort(data.IndexSort).
+		Save(l.ctx)
+	if err != nil {
+		_ = tx.Rollback()
+		return nil, dberrorhandler.DefaultEntError(l.Logger, err, req)
+	}
+	err = CreateNodes(tx, data.ID, 0, newStage.ID, 0, l.ctx, l.Logger)
+	if err != nil {
+		_ = tx.Rollback()
+		return nil, dberrorhandler.DefaultEntError(l.Logger, err, req)
+	}
+
+	// 所有操作成功,提交事务
+	err = tx.Commit()
+	if err != nil {
+		return nil, dberrorhandler.DefaultEntError(l.Logger, err, req)
+	}
+
+	return &types.BaseMsgResp{Msg: errormsg.CreateSuccess}, nil
+}
+
+func CreateNodes(tx *ent.Tx, stageId uint64, parentId uint64, newStageId uint64, newParentId uint64, ctx context.Context, logger logx.Logger) (err error) {
+	data, err := tx.SopNode.Query().
+		Where(sopnode.StageID(stageId), sopnode.ParentID(parentId)).All(ctx)
+	if err != nil {
+		return nil
+	}
+
+	for _, n := range data {
+		newNode, err := tx.SopNode.Create().
+			SetStageID(newStageId).
+			SetParentID(newParentId).
+			SetName(n.Name).
+			SetConditionType(n.ConditionType).
+			SetConditionList(n.ConditionList).
+			SetNotNilNoReplyCondition(&n.NoReplyCondition).
+			SetNotNilActionMessage(n.ActionMessage).
+			SetNotNilActionLabelAdd(n.ActionLabelAdd).
+			SetNotNilActionLabelDel(n.ActionLabelDel).
+			SetNotNilActionForward(&n.ActionForward).
+			Save(ctx)
+		if err != nil {
+			return err
+		}
+		err = CreateNodes(tx, stageId, n.ID, newStageId, newNode.ID, ctx, logger)
+		if err != nil {
+			return err
+		}
+	}
+	return nil
+}

+ 6 - 0
internal/types/types.go

@@ -1451,6 +1451,12 @@ type SopStageMoveReq struct {
 	Offset *int `json:"offset,optional"`
 }
 
+// swagger:model StageCopyReq
+type StageCopyReq struct {
+	// SopStage id | SopStage id
+	Id uint64 `json:"id"`
+}
+
 // The response data of sop node list | SopNode列表数据
 // swagger:model SopNodeListResp
 type SopNodeListResp struct {