提交 d844bc92 编写于 作者: Mr.奇淼('s avatar Mr.奇淼(

普通工作流流动完成

上级 58ecca14
...@@ -167,6 +167,25 @@ func StartWorkflow(c *gin.Context) { ...@@ -167,6 +167,25 @@ func StartWorkflow(c *gin.Context) {
response.OkWithMessage("启动成功", c) 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 // @Tags WorkflowProcess
// @Summary 我发起的工作流 // @Summary 我发起的工作流
// @Security ApiKeyAuth // @Security ApiKeyAuth
......
...@@ -88,6 +88,7 @@ var Apis = []model.SysApi{ ...@@ -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: 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: 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: 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) { func InitSysApi(db *gorm.DB) {
......
...@@ -83,6 +83,7 @@ var Carbines = []gormadapter.CasbinRule{ ...@@ -83,6 +83,7 @@ var Carbines = []gormadapter.CasbinRule{
{PType: "p", V0: "888", V1: "/workflowProcess/getWorkflowProcessList", V2: "GET"}, {PType: "p", V0: "888", V1: "/workflowProcess/getWorkflowProcessList", V2: "GET"},
{PType: "p", V0: "888", V1: "/workflowProcess/findWorkflowStep", 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/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/getMyStated", V2: "GET"},
{PType: "p", V0: "888", V1: "/workflowProcess/getMyNeed", V2: "GET"}, {PType: "p", V0: "888", V1: "/workflowProcess/getMyNeed", V2: "GET"},
{PType: "p", V0: "888", V1: "/workflowProcess/getWorkflowMoveByID", V2: "GET"}, {PType: "p", V0: "888", V1: "/workflowProcess/getWorkflowMoveByID", V2: "GET"},
......
...@@ -12,24 +12,29 @@ var WorkflowBusinessTable map[string]func() interface{} ...@@ -12,24 +12,29 @@ var WorkflowBusinessTable map[string]func() interface{}
type GVA_Workflow interface { type GVA_Workflow interface {
CreateWorkflowMove() *WorkflowMove CreateWorkflowMove() *WorkflowMove
GetBusinessType() string GetBusinessType() string
GetBusinessID() uint
GetWorkflowBase() WorkflowBase GetWorkflowBase() WorkflowBase
} }
type WorkflowBase struct { 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:"-"` BusinessType string `json:"businessType" gorm:"-"`
PromoterID uint `json:"promoterID" gorm:"-"` PromoterID uint `json:"promoterID" gorm:"-"`
OperatorID uint `json:"operatorID" gorm:"-"` OperatorID uint `json:"operatorID" gorm:"-"`
WorkflowProcessID string `json:"workflowProcessID" gorm:"-"` WorkflowProcessID string `json:"workflowProcessID" gorm:"-"`
WorkflowNodeID string `json:"workflowNodeID" gorm:"-"` WorkflowNodeID string `json:"workflowNodeID" gorm:"-"`
Param string `json:"param" gorm:"-"`
Action string `json:"action" gorm:"-"` Action string `json:"action" gorm:"-"`
} }
func (w WorkflowBase) CreateWorkflowMove() (businessModel *WorkflowMove) { func (w WorkflowBase) CreateWorkflowMove() (businessModel *WorkflowMove) {
return &WorkflowMove{ return &WorkflowMove{
GVA_MODEL: global.GVA_MODEL{ID: w.WorkflowMoveID},
BusinessType: w.BusinessType, BusinessType: w.BusinessType,
PromoterID: w.PromoterID, PromoterID: w.PromoterID,
OperatorID: w.OperatorID, OperatorID: w.OperatorID,
Param: w.Param,
WorkflowProcessID: w.WorkflowProcessID, WorkflowProcessID: w.WorkflowProcessID,
WorkflowNodeID: w.WorkflowNodeID, WorkflowNodeID: w.WorkflowNodeID,
BusinessID: w.BusinessID, BusinessID: w.BusinessID,
...@@ -42,6 +47,10 @@ func (w WorkflowBase) GetBusinessType() (businessType string) { ...@@ -42,6 +47,10 @@ func (w WorkflowBase) GetBusinessType() (businessType string) {
return w.BusinessType return w.BusinessType
} }
func (w WorkflowBase) GetBusinessID() (businessID uint) {
return w.BusinessID
}
func (w WorkflowBase) GetWorkflowBase() (workflowBase WorkflowBase) { func (w WorkflowBase) GetWorkflowBase() (workflowBase WorkflowBase) {
return w return w
} }
......
...@@ -17,6 +17,7 @@ func InitWorkflowProcessRouter(Router *gin.RouterGroup) { ...@@ -17,6 +17,7 @@ func InitWorkflowProcessRouter(Router *gin.RouterGroup) {
WorkflowProcessRouter.GET("findWorkflowStep", v1.FindWorkflowStep) // 根据ID获取工作流步骤 WorkflowProcessRouter.GET("findWorkflowStep", v1.FindWorkflowStep) // 根据ID获取工作流步骤
WorkflowProcessRouter.GET("getWorkflowProcessList", v1.GetWorkflowProcessList) // 获取WorkflowProcess列表 WorkflowProcessRouter.GET("getWorkflowProcessList", v1.GetWorkflowProcessList) // 获取WorkflowProcess列表
WorkflowProcessRouter.POST("startWorkflow", v1.StartWorkflow) // 开启工作流 WorkflowProcessRouter.POST("startWorkflow", v1.StartWorkflow) // 开启工作流
WorkflowProcessRouter.POST("completeWorkflowMove", v1.CompleteWorkflowMove) // 提交工作流
WorkflowProcessRouter.GET("getMyStated", v1.GetMyStated) // 获取我发起的工作流 WorkflowProcessRouter.GET("getMyStated", v1.GetMyStated) // 获取我发起的工作流
WorkflowProcessRouter.GET("getMyNeed", v1.GetMyNeed) // 获取我的待办 WorkflowProcessRouter.GET("getMyNeed", v1.GetMyNeed) // 获取我的待办
WorkflowProcessRouter.GET("getWorkflowMoveByID", v1.GetWorkflowMoveByID) // 获取我的待办 WorkflowProcessRouter.GET("getWorkflowMoveByID", v1.GetWorkflowMoveByID) // 获取我的待办
......
...@@ -190,19 +190,33 @@ func StartWorkflow(wfInterface model.GVA_Workflow) (err error) { ...@@ -190,19 +190,33 @@ func StartWorkflow(wfInterface model.GVA_Workflow) (err error) {
return err 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) { func complete(tx *gorm.DB, wfm *model.WorkflowMove) (err error) {
var returnWfm model.WorkflowMove var returnWfm model.WorkflowMove
var nodeInfo model.WorkflowNode var nodeInfo model.WorkflowNode
var Edges []model.WorkflowEdge 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 { if txErr != nil {
return txErr return txErr
} }
txErr = tx.First(&nodeInfo, "ID = ?", wfm.WorkflowNodeID).Error txErr = tx.First(&nodeInfo, "id = ?", wfm.WorkflowNodeID).Error
if txErr != nil { if txErr != nil {
return txErr return txErr
} }
...@@ -216,20 +230,7 @@ func complete(tx *gorm.DB, wfm *model.WorkflowMove) (err error) { ...@@ -216,20 +230,7 @@ func complete(tx *gorm.DB, wfm *model.WorkflowMove) (err error) {
return errors.New("不存在当前节点为起点的后续流程") return errors.New("不存在当前节点为起点的后续流程")
} }
if len(Edges) == 1 { if len(Edges) == 1 {
//当前节点为初始节点时候 txErr = tx.Model(&returnWfm).Update("param", wfm.Param).Update("is_active", false).Update("action", wfm.Action).Update("operator_id", wfm.OperatorID).Error
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
}
}
newWfm := createNewWorkflowMove(&returnWfm, Edges[0].Target) newWfm := createNewWorkflowMove(&returnWfm, Edges[0].Target)
txErr = tx.Create(newWfm).Error txErr = tx.Create(newWfm).Error
...@@ -240,16 +241,20 @@ func complete(tx *gorm.DB, wfm *model.WorkflowMove) (err error) { ...@@ -240,16 +241,20 @@ func complete(tx *gorm.DB, wfm *model.WorkflowMove) (err error) {
} }
if len(Edges) > 1 { if len(Edges) > 1 {
var needUseTargetNodeID string 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 { if txErr != nil {
return txErr 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 { for _, v := range Edges {
if v.ConditionExpression == wfm.Param { if v.ConditionExpression == wfm.Param {
needUseTargetNodeID = v.Target needUseTargetNodeID = v.Target
break break
} }
} }
if needUseTargetNodeID == "" {
return errors.New("未发现流转参数,流转失败")
}
newWfm := createNewWorkflowMove(&returnWfm, needUseTargetNodeID) newWfm := createNewWorkflowMove(&returnWfm, needUseTargetNodeID)
txErr = tx.Create(newWfm).Error txErr = tx.Create(newWfm).Error
if txErr != nil { if txErr != nil {
...@@ -270,6 +275,7 @@ func complete(tx *gorm.DB, wfm *model.WorkflowMove) (err error) { ...@@ -270,6 +275,7 @@ func complete(tx *gorm.DB, wfm *model.WorkflowMove) (err error) {
} }
func createNewWorkflowMove(oldWfm *model.WorkflowMove, targetNodeID string) (newWfm *model.WorkflowMove) { func createNewWorkflowMove(oldWfm *model.WorkflowMove, targetNodeID string) (newWfm *model.WorkflowMove) {
return &model.WorkflowMove{ return &model.WorkflowMove{
BusinessID: oldWfm.BusinessID, BusinessID: oldWfm.BusinessID,
BusinessType: oldWfm.BusinessType, BusinessType: oldWfm.BusinessType,
...@@ -277,6 +283,7 @@ func createNewWorkflowMove(oldWfm *model.WorkflowMove, targetNodeID string) (new ...@@ -277,6 +283,7 @@ func createNewWorkflowMove(oldWfm *model.WorkflowMove, targetNodeID string) (new
OperatorID: 0, OperatorID: 0,
WorkflowNodeID: targetNodeID, WorkflowNodeID: targetNodeID,
WorkflowProcessID: oldWfm.WorkflowProcessID, WorkflowProcessID: oldWfm.WorkflowProcessID,
Param: "",
Action: "", Action: "",
IsActive: true, IsActive: true,
} }
......
...@@ -27,8 +27,29 @@ ...@@ -27,8 +27,29 @@
></el-date-picker> ></el-date-picker>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button @click="start" type="primary">启动</el-button> <el-button
<el-button @click="back" type="primary">返回</el-button> v-if="this.wf.clazz == 'start'"
@click="start"
type="primary"
>启动</el-button
>
<el-button
v-if="this.wf.clazz == 'userTask'"
@click="complete('yes')"
type="primary"
>同意</el-button
>
<el-button
v-if="this.wf.clazz == 'userTask'"
@click="complete('no')"
type="primary"
>拒绝</el-button
>
<el-button
@click="back"
type="primary"
>返回</el-button
>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
...@@ -37,9 +58,11 @@ ...@@ -37,9 +58,11 @@
<script> <script>
import { import {
startWorkflow, startWorkflow,
completeWorkflowMove
} from "@/api/workflowProcess"; } from "@/api/workflowProcess";
import infoList from "@/mixins/infoList"; import infoList from "@/mixins/infoList";
import { mapGetters } from "vuex"; import { mapGetters } from "vuex";
import Axios from 'axios';
export default { export default {
name: "ExaWfLeave", name: "ExaWfLeave",
mixins: [infoList], mixins: [infoList],
...@@ -51,6 +74,10 @@ export default { ...@@ -51,6 +74,10 @@ export default {
wf:{ wf:{
type:Object, type:Object,
default:function(){return{}} default:function(){return{}}
},
workflowMoveID:{
type:Number,
default:0
} }
}, },
data() { data() {
...@@ -65,6 +92,21 @@ export default { ...@@ -65,6 +92,21 @@ export default {
}; };
}, },
computed:{ computed:{
canShow(){
if(this.wf.assignType == "user"){
if(this.wf.assginValue.indexOf(","+this.userInfo.ID+",")>0){
return true
}else{
return false
}
}else if(this.wf.assign_type == "authority"){
if(this.wf.assginValue.indexOf(","+this.userInfo.authorityId+",")>0){
return true
}else{
return false
}
}
},
...mapGetters("user", ["userInfo"]) ...mapGetters("user", ["userInfo"])
}, },
methods: { methods: {
...@@ -72,6 +114,7 @@ export default { ...@@ -72,6 +114,7 @@ export default {
const res = await startWorkflow({ const res = await startWorkflow({
business:this.formData, business:this.formData,
wf:{ wf:{
workflowMoveID:this.workflowMoveID,
businessId:0, businessId:0,
businessType:"leave", businessType:"leave",
workflowProcessID:this.wf.workflowProcessID, workflowProcessID:this.wf.workflowProcessID,
...@@ -87,18 +130,45 @@ export default { ...@@ -87,18 +130,45 @@ export default {
type:"success", type:"success",
message:"启动成功" message:"启动成功"
}) })
this.back()
} }
}, },
async complete(param){
const res = await completeWorkflowMove({
business:this.formData,
wf:{
workflowMoveID:this.workflowMoveID,
businessID:this.formData.ID,
businessType:"leave",
workflowProcessID:this.wf.workflowProcessID,
workflowNodeID:this.wf.id,
promoterID:this.userInfo.ID,
operatorID:this.userInfo.ID,
action:"complete",
param:param
}
})
if(res.code == 0){
this.$message({
type:"success",
message:"提交"
})
this.back()
}
},
back(){ back(){
this.$router.go(-1) this.$router.go(-1)
} }
}, },
async created() { async created() {
console.log(this.workflowMoveID)
// 建议通过url传参获取目标数据ID 调用 find方法进行查询数据操作 从而决定本页面是create还是update 以下为id作为url参数示例 // 建议通过url传参获取目标数据ID 调用 find方法进行查询数据操作 从而决定本页面是create还是update 以下为id作为url参数示例
if(this.business){ if(this.business){
this.formData = this.business this.formData = this.business
} }
} }
}; };
</script> </script>
......
...@@ -70,7 +70,7 @@ export default { ...@@ -70,7 +70,7 @@ export default {
this.$router.push({ this.$router.push({
name: "workflowUse", name: "workflowUse",
query: { query: {
wfmId: row.ID workflowMoveID: row.ID
} }
}) })
} }
......
...@@ -77,7 +77,7 @@ export default { ...@@ -77,7 +77,7 @@ export default {
this.$router.push({ this.$router.push({
name: "workflowUse", name: "workflowUse",
query: { query: {
wfmId: row.ID workflowMoveID: row.ID
} }
}) })
} }
......
<template> <template>
<div class="workflow-use"> <div class="workflow-use">
<WorkflowInfo v-if="done" :wf="this.node" :business="business"/> <WorkflowInfo v-if="done" :wf="this.node" :business="business" :workflowMoveID="$route.query.workflowMoveID" />
</div> </div>
</template> </template>
<script> <script>
...@@ -16,7 +16,7 @@ export default { ...@@ -16,7 +16,7 @@ export default {
}, },
async created(){ async created(){
const workflowId = this.$route.query.workflowId const workflowId = this.$route.query.workflowId
const wfmId = this.$route.query.wfmId const workflowMoveID = this.$route.query.workflowMoveID
if(workflowId){ if(workflowId){
const res = await findWorkflowStep({id:workflowId}) const res = await findWorkflowStep({id:workflowId})
if(res.code == 0){ if(res.code == 0){
...@@ -24,8 +24,8 @@ export default { ...@@ -24,8 +24,8 @@ export default {
this.node = res.data.workflow.nodes[0] this.node = res.data.workflow.nodes[0]
this.done = true this.done = true
} }
}else if(wfmId){ }else if(workflowMoveID){
const res = await getWorkflowMoveByID({id:wfmId}) const res = await getWorkflowMoveByID({id:workflowMoveID})
if(res.code == 0){ if(res.code == 0){
this.business = res.data.business this.business = res.data.business
this.node = res.data.move.workflowNode this.node = res.data.move.workflowNode
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册