diff --git a/server/api/v1/wk_process.go b/server/api/v1/wk_process.go index fd53f7c0722befbc5b622ee954673cbffbfb9432..329910854ddc187b9eaf16d9a2e7bf8492511835 100644 --- a/server/api/v1/wk_process.go +++ b/server/api/v1/wk_process.go @@ -167,6 +167,25 @@ func StartWorkflow(c *gin.Context) { response.OkWithMessage("启动成功", c) } +// @Tags WorkflowProcess +// @Summary 提交工作流 +// @Security ApiKeyAuth +// @accept application/json +// @Produce application/json +// @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}" +// @Router /workflowProcess/completeWorkflowMove [post] +func CompleteWorkflowMove(c *gin.Context) { + business := c.Query("businessType") + wfInfo := model.WorkflowBusinessStruct[business]() + c.ShouldBindJSON(wfInfo) + err := service.CompleteWorkflowMove(wfInfo) + if err != nil { + response.FailWithMessage(err.Error(), c) + return + } + response.OkWithMessage("启动成功", c) +} + // @Tags WorkflowProcess // @Summary 我发起的工作流 // @Security ApiKeyAuth diff --git a/server/cmd/datas/apis.go b/server/cmd/datas/apis.go index d9a2c71a9ac1355653a4441ac757ebdce2c2ae2e..ee98d3ef7864d66a3fe7cf89b7b47f190ff707c5 100644 --- a/server/cmd/datas/apis.go +++ b/server/cmd/datas/apis.go @@ -88,6 +88,7 @@ var Apis = []model.SysApi{ {global.GVA_MODEL{ID: 76, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/workflowProcess/getMyStated", "获取我发起的工作流", "workflowProcess", "GET"}, {global.GVA_MODEL{ID: 77, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/workflowProcess/getMyNeed", "获取我的待办", "workflowProcess", "GET"}, {global.GVA_MODEL{ID: 78, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/workflowProcess/getWorkflowMoveByID", "根据id获取当前节点详情和历史", "workflowProcess", "GET"}, + {global.GVA_MODEL{ID: 79, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/workflowProcess/completeWorkflowMove", "提交工作流", "workflowProcess", "POST"}, } func InitSysApi(db *gorm.DB) { diff --git a/server/cmd/datas/casbins.go b/server/cmd/datas/casbins.go index 292939227ebe0b3f20d6cf7787be25c97dd5a428..5a710f09b6fb8a89e1573c7482d9b74a648fe52a 100644 --- a/server/cmd/datas/casbins.go +++ b/server/cmd/datas/casbins.go @@ -83,6 +83,7 @@ var Carbines = []gormadapter.CasbinRule{ {PType: "p", V0: "888", V1: "/workflowProcess/getWorkflowProcessList", V2: "GET"}, {PType: "p", V0: "888", V1: "/workflowProcess/findWorkflowStep", V2: "GET"}, {PType: "p", V0: "888", V1: "/workflowProcess/startWorkflow", V2: "POST"}, + {PType: "p", V0: "888", V1: "/workflowProcess/completeWorkflowMove", V2: "POST"}, {PType: "p", V0: "888", V1: "/workflowProcess/getMyStated", V2: "GET"}, {PType: "p", V0: "888", V1: "/workflowProcess/getMyNeed", V2: "GET"}, {PType: "p", V0: "888", V1: "/workflowProcess/getWorkflowMoveByID", V2: "GET"}, diff --git a/server/model/wf_process.go b/server/model/wf_process.go index 60edaa6e6aeb9bdd762814a84cb3702048fdd06b..86c9f760603c1c7a1057d6e3985df800676ceb93 100644 --- a/server/model/wf_process.go +++ b/server/model/wf_process.go @@ -12,24 +12,29 @@ var WorkflowBusinessTable map[string]func() interface{} type GVA_Workflow interface { CreateWorkflowMove() *WorkflowMove GetBusinessType() string + GetBusinessID() uint GetWorkflowBase() WorkflowBase } type WorkflowBase struct { - BusinessID uint `gorm:"<-:false;column:id"` // 业务对应ID(businessID)的返回 + WorkflowMoveID uint `json:"workflowMoveID" gorm:"-"` + BusinessID uint `json:"businessID" gorm:"<-:false;column:id"` // 业务对应ID(businessID)的返回 BusinessType string `json:"businessType" gorm:"-"` PromoterID uint `json:"promoterID" gorm:"-"` OperatorID uint `json:"operatorID" gorm:"-"` WorkflowProcessID string `json:"workflowProcessID" gorm:"-"` WorkflowNodeID string `json:"workflowNodeID" gorm:"-"` + Param string `json:"param" gorm:"-"` Action string `json:"action" gorm:"-"` } func (w WorkflowBase) CreateWorkflowMove() (businessModel *WorkflowMove) { return &WorkflowMove{ + GVA_MODEL: global.GVA_MODEL{ID: w.WorkflowMoveID}, BusinessType: w.BusinessType, PromoterID: w.PromoterID, OperatorID: w.OperatorID, + Param: w.Param, WorkflowProcessID: w.WorkflowProcessID, WorkflowNodeID: w.WorkflowNodeID, BusinessID: w.BusinessID, @@ -42,6 +47,10 @@ func (w WorkflowBase) GetBusinessType() (businessType string) { return w.BusinessType } +func (w WorkflowBase) GetBusinessID() (businessID uint) { + return w.BusinessID +} + func (w WorkflowBase) GetWorkflowBase() (workflowBase WorkflowBase) { return w } diff --git a/server/router/wk_process.go b/server/router/wk_process.go index 0dea39fb2d7d694e1c8a42f7df37ffbb6c00f6ac..280c2577b8d49d6096ea2f33a1eb6f663a214cdc 100644 --- a/server/router/wk_process.go +++ b/server/router/wk_process.go @@ -17,6 +17,7 @@ func InitWorkflowProcessRouter(Router *gin.RouterGroup) { WorkflowProcessRouter.GET("findWorkflowStep", v1.FindWorkflowStep) // 根据ID获取工作流步骤 WorkflowProcessRouter.GET("getWorkflowProcessList", v1.GetWorkflowProcessList) // 获取WorkflowProcess列表 WorkflowProcessRouter.POST("startWorkflow", v1.StartWorkflow) // 开启工作流 + WorkflowProcessRouter.POST("completeWorkflowMove", v1.CompleteWorkflowMove) // 提交工作流 WorkflowProcessRouter.GET("getMyStated", v1.GetMyStated) // 获取我发起的工作流 WorkflowProcessRouter.GET("getMyNeed", v1.GetMyNeed) // 获取我的待办 WorkflowProcessRouter.GET("getWorkflowMoveByID", v1.GetWorkflowMoveByID) // 获取我的待办 diff --git a/server/service/wk_process.go b/server/service/wk_process.go index 5d1bcb4e43ded49c41aa41083ce3bae2acbb098f..b773997891211c556a7a9705313c622eb8b7e740 100644 --- a/server/service/wk_process.go +++ b/server/service/wk_process.go @@ -190,19 +190,33 @@ func StartWorkflow(wfInterface model.GVA_Workflow) (err error) { return err } -//func CompleteWorkflowNode(wfInterface model.GVA_Workflow)(err error){ -// -//} +func CompleteWorkflowMove(wfInterface model.GVA_Workflow) (err error) { + err = global.GVA_DB.Transaction(func(tx *gorm.DB) error { + var txErr error + tableName := getTable(wfInterface.GetBusinessType()).(schema.Tabler).TableName() + txErr = tx.Table(tableName).Where("id = ?", wfInterface.GetBusinessID()).Updates(wfInterface).Error + if txErr != nil { + return txErr + } + nowWorkflowMove := wfInterface.CreateWorkflowMove() + txErr = complete(tx, nowWorkflowMove) + if txErr != nil { + return txErr + } + return nil + }) + return err +} func complete(tx *gorm.DB, wfm *model.WorkflowMove) (err error) { var returnWfm model.WorkflowMove var nodeInfo model.WorkflowNode var Edges []model.WorkflowEdge - txErr := tx.First(&returnWfm, "business_type = ? and business_id = ? and workflow_process_id = ? and workflow_node_id = ? and is_active = ?", wfm.BusinessType, wfm.BusinessID, wfm.WorkflowProcessID, wfm.WorkflowNodeID, true).Error + txErr := tx.First(&returnWfm, "id = ? AND is_active = ?", wfm.ID, true).Error if txErr != nil { return txErr } - txErr = tx.First(&nodeInfo, "ID = ?", wfm.WorkflowNodeID).Error + txErr = tx.First(&nodeInfo, "id = ?", wfm.WorkflowNodeID).Error if txErr != nil { return txErr } @@ -216,20 +230,7 @@ func complete(tx *gorm.DB, wfm *model.WorkflowMove) (err error) { return errors.New("不存在当前节点为起点的后续流程") } if len(Edges) == 1 { - //当前节点为初始节点时候 - if nodeInfo.Clazz == model.START { - txErr = tx.Where("id = ?", returnWfm.ID).First(&model.WorkflowMove{}).Update("is_active", false).Update("operator_id", wfm.OperatorID).Error - if txErr != nil { - return txErr - } - } - //当前节点为流转节点时候 - if nodeInfo.Clazz == model.USER_TASK { - txErr = tx.Where("id = ?", returnWfm.ID).First(&model.WorkflowMove{}).Update("action", "complete").Update("is_active", false).Update("operator_id", wfm.OperatorID).Error - if txErr != nil { - return txErr - } - } + txErr = tx.Model(&returnWfm).Update("param", wfm.Param).Update("is_active", false).Update("action", wfm.Action).Update("operator_id", wfm.OperatorID).Error newWfm := createNewWorkflowMove(&returnWfm, Edges[0].Target) txErr = tx.Create(newWfm).Error @@ -240,16 +241,20 @@ func complete(tx *gorm.DB, wfm *model.WorkflowMove) (err error) { } if len(Edges) > 1 { var needUseTargetNodeID string - txErr = tx.Where("id = ?", returnWfm.ID).First(&model.WorkflowMove{}).Update("action", "complete").Update("is_active", false).Update("operator_id", wfm.OperatorID).Error if txErr != nil { return txErr } + txErr = tx.Model(&returnWfm).Update("param", wfm.Param).Update("is_active", false).Update("action", wfm.Action).Update("operator_id", wfm.OperatorID).Error + for _, v := range Edges { if v.ConditionExpression == wfm.Param { needUseTargetNodeID = v.Target break } } + if needUseTargetNodeID == "" { + return errors.New("未发现流转参数,流转失败") + } newWfm := createNewWorkflowMove(&returnWfm, needUseTargetNodeID) txErr = tx.Create(newWfm).Error if txErr != nil { @@ -270,6 +275,7 @@ func complete(tx *gorm.DB, wfm *model.WorkflowMove) (err error) { } func createNewWorkflowMove(oldWfm *model.WorkflowMove, targetNodeID string) (newWfm *model.WorkflowMove) { + return &model.WorkflowMove{ BusinessID: oldWfm.BusinessID, BusinessType: oldWfm.BusinessType, @@ -277,6 +283,7 @@ func createNewWorkflowMove(oldWfm *model.WorkflowMove, targetNodeID string) (new OperatorID: 0, WorkflowNodeID: targetNodeID, WorkflowProcessID: oldWfm.WorkflowProcessID, + Param: "", Action: "", IsActive: true, } diff --git a/web/src/view/exa_wf_leave/exa_wf_leaveFrom.vue b/web/src/view/exa_wf_leave/exa_wf_leaveFrom.vue index c0e5a638b4f80b2831b5a6daa35768e354d0523f..f528d5939f9f6df239277532d376e3cf18e66b3f 100644 --- a/web/src/view/exa_wf_leave/exa_wf_leaveFrom.vue +++ b/web/src/view/exa_wf_leave/exa_wf_leaveFrom.vue @@ -27,8 +27,29 @@ > - 启动 - 返回 + 启动 + 同意 + 拒绝 + 返回 @@ -37,9 +58,11 @@ diff --git a/web/src/view/workflow/userList/need.vue b/web/src/view/workflow/userList/need.vue index e4fa533987f921ca566a1688c4f56d99477b8a6d..054e561979254007923ebbcc7c90a6a645827a49 100644 --- a/web/src/view/workflow/userList/need.vue +++ b/web/src/view/workflow/userList/need.vue @@ -70,7 +70,7 @@ export default { this.$router.push({ name: "workflowUse", query: { - wfmId: row.ID + workflowMoveID: row.ID } }) } diff --git a/web/src/view/workflow/userList/started.vue b/web/src/view/workflow/userList/started.vue index 39a2adc4aded8cd156c3669d0c1a27cfca077042..988ae4508cde99ded9648f9809a1b8a3184235c2 100644 --- a/web/src/view/workflow/userList/started.vue +++ b/web/src/view/workflow/userList/started.vue @@ -77,7 +77,7 @@ export default { this.$router.push({ name: "workflowUse", query: { - wfmId: row.ID + workflowMoveID: row.ID } }) } diff --git a/web/src/view/workflow/workflowUse/workflowUse.vue b/web/src/view/workflow/workflowUse/workflowUse.vue index 5e41ce374ab45dafd5eb3873bd4cefa161c0823d..a410724000387789f5373509870ca5dad724c5c0 100644 --- a/web/src/view/workflow/workflowUse/workflowUse.vue +++ b/web/src/view/workflow/workflowUse/workflowUse.vue @@ -1,6 +1,6 @@