Quellcode durchsuchen

流程(同步模式)审批bug修复

yxh vor 5 Jahren
Ursprung
Commit
1128c2b84c

+ 1 - 1
app/controller/admin/wf_flow.go

@@ -339,7 +339,7 @@ func (c *Flow) WfCheck(r *ghttp.Request) {
 	//当前用户信息
 	userInfo := user_service.GetLoginAdminInfo(r)
 	//获取流程信息
-	flowInfo, err := work_flow_service.WorkFlowInfo(req.WfFid, req.WfType, userInfo.Id, userInfo.DeptId)
+	flowInfo, _, err := work_flow_service.WorkFlowInfo(req.WfFid, req.WfType, userInfo.Id, userInfo.DeptId)
 	if err != nil {
 		response.FailJson(true, r, err.Error())
 	}

+ 29 - 15
app/service/common/work_flow_service/flow.go

@@ -94,8 +94,19 @@ func SetBtn(wfFid uint, wfType, wfTitle, wfStatusField string, status int, userI
 	case 1:
 		st := 0
 		userName := ""
-		flowInfo, err := WorkFlowInfo(wfFid, wfType, userId, departmentId)
+		flowInfo, processList, err := WorkFlowInfo(wfFid, wfType, userId, departmentId)
 		if err != nil {
+			if err.Error() == "无权限" {
+				//获取当前步骤审批人信息
+				userNameArr := make([]string, 0, 10)
+				for _, process := range processList {
+					userNameArr = append(userNameArr, process.SponsorText)
+				}
+				return g.MapStrAny{
+					"title": "无审批权限(" + gstr.Join(userNameArr, ",") + ")",
+					"type":  "text",
+				}, nil
+			}
 			return nil, err
 		}
 		if flowInfo != nil && flowInfo.NextProcess != nil {
@@ -162,10 +173,13 @@ func SetBtn(wfFid uint, wfType, wfTitle, wfStatusField string, status int, userI
 }
 
 //流程状态查询
-func WorkFlowInfo(wfFid uint, wfType string, userId uint64, departmentId uint64) (*WorkFlow, error) {
+func WorkFlowInfo(wfFid uint, wfType string, userId uint64, departmentId uint64) (
+	*WorkFlow, []*wf_run_process.Entity, error) {
+
 	workFlow := &WorkFlow{}
+	processList := ([]*wf_run_process.Entity)(nil)
 	if wfFid == 0 || wfType == "" {
-		return nil, gerror.New("单据编号,单据表不可为空!")
+		return nil, nil, gerror.New("单据编号,单据表不可为空!")
 	}
 	//根据表信息,判断当前流程是否还在运行
 	runInfo, err := wf_run.GetRunning(&wf_run.RunSearch{
@@ -175,7 +189,7 @@ func WorkFlowInfo(wfFid uint, wfType string, userId uint64, departmentId uint64)
 		Status:    0,
 	})
 	if err != nil {
-		return nil, err
+		return nil, nil, err
 	}
 	if runInfo != nil {
 		info := new(wf_run_process.Entity)
@@ -186,14 +200,14 @@ func WorkFlowInfo(wfFid uint, wfType string, userId uint64, departmentId uint64)
 			RunFlowProcess: runInfo.RunFlowProcess,
 			Status:         "0",
 		}
-		processList, err := wf_run_process.GetProcessList(where)
+		processList, err = wf_run_process.GetProcessList(where)
 		if err != nil {
-			return nil, err
+			return nil, nil, err
 		}
 		if processList == nil || len(processList) == 0 {
 			process, err := wf_run_process.GetProcess(where)
 			if err != nil {
-				return nil, err
+				return nil, nil, err
 			}
 			processList = append(processList, process)
 		}
@@ -218,7 +232,7 @@ func WorkFlowInfo(wfFid uint, wfType string, userId uint64, departmentId uint64)
 				}
 			}
 			if info == nil || info.Id == 0 {
-				return nil, gerror.New("无权限")
+				return nil, processList, gerror.New("无权限")
 			}
 		}
 		//设置运行信息数据
@@ -234,21 +248,21 @@ func WorkFlowInfo(wfFid uint, wfType string, userId uint64, departmentId uint64)
 		//获取流程名称
 		flowName, err := GetFlowName(gconv.Int64(runInfo.FlowId))
 		if err != nil {
-			return nil, err
+			return nil, nil, err
 		}
 		workFlow.FlowName = flowName
 		//获取流程步骤信息
 		var processData *ProcessData
 		processData, err = GetProcessInfo(info.RunFlowProcess, runInfo.Id)
 		if err != nil {
-			return nil, err
+			return nil, nil, err
 		}
 		workFlow.Process = processData
 		//获取下一个步骤信息
 		var nextProcess []*ProcessData
 		nextProcess, err = GetNexProcessInfo(wfType, wfFid, info.RunFlowProcess, runInfo.Id)
 		if err != nil {
-			return nil, err
+			return nil, nil, err
 		}
 		workFlow.NextProcess = nextProcess
 		//获取前几个步骤信息,用于步骤回退
@@ -264,13 +278,13 @@ func WorkFlowInfo(wfFid uint, wfType string, userId uint64, departmentId uint64)
 				Status:         "0",
 			})
 			if err != nil {
-				return nil, err
+				return nil, nil, err
 			}
 			workFlow.SingSt = 1
 			workFlow.FlowProcess = info.RunFlowProcess
 			process, err := GetProcessInfo(info.RunFlowProcess, runInfo.Id)
 			if err != nil {
-				return nil, err
+				return nil, nil, err
 			}
 			workFlow.Status = &wf_run_process.Entity{
 				WfMode:   gconv.Int(process.WfMode),
@@ -278,7 +292,7 @@ func WorkFlowInfo(wfFid uint, wfType string, userId uint64, departmentId uint64)
 			}
 			nextProcess, err = GetNexProcessInfo(wfType, wfFid, info.RunFlowProcess, runInfo.Id)
 			if err != nil {
-				return nil, err
+				return nil, nil, err
 			}
 			workFlow.NextProcess = nextProcess
 			workFlow.Process = process
@@ -292,7 +306,7 @@ func WorkFlowInfo(wfFid uint, wfType string, userId uint64, departmentId uint64)
 		workFlow.BillCheck = ""
 		workFlow.BillTime = ""
 	}
-	return workFlow, nil
+	return workFlow, processList, nil
 }
 
 //获取对应类型的工作流

+ 24 - 0
app/service/common/work_flow_service/process.go

@@ -415,3 +415,27 @@ func getFirstProcess(processes []*wf_flow_process.Entity) *wf_flow_process.Entit
 	}
 	return firstProcess
 }
+
+//获取步骤所有下级步骤
+func GetAllNextProcessIds(id uint) (ids []uint, err error) {
+	entity := (*wf_flow_process.Entity)(nil)
+	entity, err = wf_flow_process.GetProcessInfoById(id)
+	ids = make([]uint, 0, 100)
+	if err != nil {
+		return
+	}
+	if entity != nil && entity.ProcessTo != "" {
+		processTo := gstr.Split(entity.ProcessTo, ",")
+		for _, v := range processTo {
+			id := gconv.Uint(v)
+			ids = append(ids, id)
+			idsChd := make([]uint, 0, 100)
+			idsChd, err = GetAllNextProcessIds(id)
+			if err != nil {
+				return nil, err
+			}
+			ids = append(ids, idsChd...)
+		}
+	}
+	return
+}

+ 90 - 21
app/service/common/work_flow_service/task.go

@@ -2,6 +2,7 @@ package work_flow_service
 
 import (
 	flowModel "gfast/app/model/admin/wf_flow"
+	"gfast/app/model/admin/wf_flow_process"
 	"gfast/app/model/admin/wf_run_process"
 	"github.com/gogf/gf/errors/gerror"
 	"github.com/gogf/gf/frame/g"
@@ -10,15 +11,26 @@ import (
 )
 
 func DoTask(req *flowModel.CheckWfSaveReq) error {
-	npid := req.Npid             //下一步骤流程id
+	nPid := req.Npid             //下一步骤流程id
 	runId := req.RunId           //运行中的id
 	runProcess := req.RunProcess //运行中的process
+	isAddNextMode2 := true       //同步模式是否添加下一步节点
 	if req.Sup == 1 {
 		req.CheckCon = "[管理员代办]" + req.CheckCon
 	}
-	var runProcessList []*wf_run_process.Entity
+	runProcessList := ([]*wf_run_process.Entity)(nil)
 	if req.WfMode == 2 {
 		var err error
+		//获取当前流程运行信息
+		thisProcess := (*wf_run_process.Entity)(nil)
+		thisProcess, err = wf_run_process.GetProcessById(runProcess)
+		if err != nil {
+			return err
+		}
+		//获取当前审批分支的所有下级节点
+		thisNpidSAll := make([]uint, 0, 100)
+		thisNpidSAll, err = GetAllNextProcessIds(thisProcess.RunFlowProcess)
+		//获取其他同步的步骤信息
 		runProcessList, err = wf_run_process.GetProcessByMap(g.Map{
 			"run_id": req.RunId,
 			"status": 0,
@@ -28,11 +40,47 @@ func DoTask(req *flowModel.CheckWfSaveReq) error {
 			return err
 		}
 		if runProcessList != nil {
-			npids := make([]uint, len(runProcessList))
+			nPidS := make([]uint, len(runProcessList))
 			for k, v := range runProcessList {
-				npids[k] = v.RunFlowProcess
+				//查询每个分支的所有下级节点
+				nPidS[k] = v.RunFlowProcess
+			}
+			//查询对应的流程步骤信息判断他们的下一步是否是同一个节点(分支合并)
+			processes := ([]*wf_flow_process.Entity)(nil) //和当前步骤同步模式下的其他分支步骤
+			processes, err = wf_flow_process.GetProcessInfosByIds(nPidS)
+			if err != nil {
+				return err
 			}
-			npid = gstr.JoinAny(npids, ",")
+
+			for _, v := range processes {
+				hasLinkNode := false             //是否在分支上还有下一级节点,并且下个节点在分支内
+				nPidSAll := make([]uint, 0, 100) //每个分支的所有下级节点
+				nPidSAll, err = GetAllNextProcessIds(gconv.Uint(v.Id))
+				if err != nil {
+					return err
+				}
+				tagLink := true
+				for _, nv := range nPidSAll {
+					tag := false
+					for _, tv := range thisNpidSAll {
+						if tv == nv {
+							tag = true
+							break
+						}
+					}
+					if !tag {
+						tagLink = false
+					} else {
+						tagLink = true
+					}
+				}
+				if nPid != v.ProcessTo && tagLink {
+					hasLinkNode = true
+					break
+				}
+				isAddNextMode2 = isAddNextMode2 && hasLinkNode
+			}
+			nPid = gstr.JoinAny(nPidS, ",")
 		}
 	}
 	tx, err := g.DB().Begin()
@@ -40,7 +88,7 @@ func DoTask(req *flowModel.CheckWfSaveReq) error {
 		g.Log().Error()
 		return gerror.New("开启事务失败")
 	}
-	if npid != "0" && npid != "" { //判断是否为最后一步
+	if nPid != "0" && nPid != "" { //判断是否为最后一步
 		//不是最后一步
 		//结束流程
 		err = EndProcess(runProcess, req.CheckCon, 2, tx)
@@ -51,7 +99,7 @@ func DoTask(req *flowModel.CheckWfSaveReq) error {
 		//同步模式下只写入记录
 		if req.WfMode != 2 { //非同步模式
 			//更新单据信息
-			err = Up(runId, npid, tx)
+			err = Up(runId, nPid, tx)
 			if err != nil {
 				tx.Rollback()
 				return err
@@ -63,20 +111,41 @@ func DoTask(req *flowModel.CheckWfSaveReq) error {
 				return err
 			}
 		} else {
-			fm := &flowModel.SaveWfFlowReq{
-				WfType:     req.WfType,
-				WfFid:      gconv.Int(req.WfFid),
-				WfId:       req.FlowId,
-				CheckCon:   req.CheckCon,
-				RunProcess: req.RunProcess,
-				RunId:      req.RunId,
-				Art:        req.Art,
-				UserId:     req.UserId,
-			}
-			err = AddRunLog(gconv.Int64(req.RunId), fm, "ok", tx)
-			if err != nil {
-				tx.Rollback()
-				return err
+			if isAddNextMode2 {
+				//更新单据信息
+				if nPid == "" {
+					nPid = req.Npid
+				} else {
+					nPid = nPid + "," + req.Npid
+				}
+				g.Log().Debug(nPid)
+				err = Up(runId, nPid, tx)
+				if err != nil {
+					tx.Rollback()
+					return err
+				}
+				//记录下一个流程(消息记录)
+				err = Run(req, "ok", tx)
+				if err != nil {
+					tx.Rollback()
+					return err
+				}
+			} else {
+				fm := &flowModel.SaveWfFlowReq{
+					WfType:     req.WfType,
+					WfFid:      gconv.Int(req.WfFid),
+					WfId:       req.FlowId,
+					CheckCon:   req.CheckCon,
+					RunProcess: req.RunProcess,
+					RunId:      req.RunId,
+					Art:        req.Art,
+					UserId:     req.UserId,
+				}
+				err = AddRunLog(gconv.Int64(req.RunId), fm, "ok", tx)
+				if err != nil {
+					tx.Rollback()
+					return err
+				}
 			}
 		}
 	} else {

+ 1 - 1
go.mod

@@ -8,7 +8,7 @@ require (
 	github.com/go-openapi/spec v0.19.11 // indirect
 	github.com/go-openapi/swag v0.19.11 // indirect
 	github.com/goflyfox/gtoken v1.4.1
-	github.com/gogf/gf v1.14.5
+	github.com/gogf/gf v1.15.0
 	github.com/mailru/easyjson v0.7.6 // indirect
 	github.com/mojocn/base64Captcha v1.3.1
 	github.com/mssola/user_agent v0.5.1

+ 2 - 0
go.sum

@@ -64,6 +64,8 @@ github.com/goflyfox/gtoken v1.4.1/go.mod h1:ylHVvQ4/nTstw81iElcDWFht4LAKL4Pqhw7J
 github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
 github.com/gogf/gf v1.14.5 h1:y/4q8rfFtiuIL7PwNUhG8RyBWLlvR1pl44x7/EJeDMI=
 github.com/gogf/gf v1.14.5/go.mod h1:s4b0tkBqHyEWAk/Hwm4hzUCbCbdIPeERxB2wmeBg11g=
+github.com/gogf/gf v1.15.0 h1:gLyTwrH0xPRTdzM7UfWkqkRUwfRCGr4tzAo0/QoS5so=
+github.com/gogf/gf v1.15.0/go.mod h1:BdcZOAIvMxap/Li5G454MbzFtI8gPFKV5XubA0iLNPk=
 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=