| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- 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"
- "github.com/gogf/gf/text/gstr"
- "github.com/gogf/gf/util/gconv"
- )
- func DoTask(req *flowModel.CheckWfSaveReq) error {
- nPid := req.Npid //下一步骤流程id
- runId := req.RunId //运行中的id
- runProcess := req.RunProcess //运行中的process
- isAddNextMode2 := true //同步模式是否添加下一步节点
- if req.Sup == 1 {
- req.CheckCon = "[管理员代办]" + req.CheckCon
- }
- 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,
- "id <> ": req.RunProcess,
- })
- if err != nil {
- return err
- }
- if runProcessList != nil {
- nPidS := make([]uint, len(runProcessList))
- for k, v := range runProcessList {
- //查询每个分支的所有下级节点
- nPidS[k] = v.RunFlowProcess
- }
- //查询对应的流程步骤信息判断他们的下一步是否是同一个节点(分支合并)
- processes := ([]*wf_flow_process.Entity)(nil) //和当前步骤同步模式下的其他分支步骤
- processes, err = wf_flow_process.GetProcessInfosByIds(nPidS)
- if err != nil {
- return err
- }
- 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()
- if err != nil {
- g.Log().Error()
- return gerror.New("开启事务失败")
- }
- if nPid != "0" && nPid != "" { //判断是否为最后一步
- //不是最后一步
- //结束流程
- err = EndProcess(runProcess, req.CheckCon, 2, tx)
- if err != nil {
- tx.Rollback()
- return err
- }
- //同步模式下只写入记录
- if req.WfMode != 2 { //非同步模式
- //更新单据信息
- 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 {
- 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 {
- //是最后一步
- //结束流程
- err = EndFlow(runId, tx)
- if err != nil {
- tx.Rollback()
- return err
- }
- err = EndProcess(runProcess, req.CheckCon, 2, tx)
- if err != nil {
- tx.Rollback()
- return err
- }
- //删除审批表中的用户/部门信息
- err = DeleteBusinessChecker(req.WfFid, req.WfType, tx)
- if err != nil {
- tx.Rollback()
- return err
- }
- 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(runId), fm, "ok", tx)
- if err != nil {
- tx.Rollback()
- return err
- }
- //更新单据状态
- err = UpdateBill(gconv.Int(req.WfFid), req.WfType, req.WfStatusField, 2, tx)
- if err != nil {
- tx.Rollback()
- return err
- }
- }
- tx.Commit()
- return nil
- }
|