task.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. package work_flow_service
  2. import (
  3. flowModel "gfast/app/model/admin/wf_flow"
  4. "gfast/app/model/admin/wf_flow_process"
  5. "gfast/app/model/admin/wf_run_process"
  6. "github.com/gogf/gf/errors/gerror"
  7. "github.com/gogf/gf/frame/g"
  8. "github.com/gogf/gf/text/gstr"
  9. "github.com/gogf/gf/util/gconv"
  10. )
  11. func DoTask(req *flowModel.CheckWfSaveReq) error {
  12. nPid := req.Npid //下一步骤流程id
  13. runId := req.RunId //运行中的id
  14. runProcess := req.RunProcess //运行中的process
  15. isAddNextMode2 := true //同步模式是否添加下一步节点
  16. if req.Sup == 1 {
  17. req.CheckCon = "[管理员代办]" + req.CheckCon
  18. }
  19. runProcessList := ([]*wf_run_process.Entity)(nil)
  20. if req.WfMode == 2 {
  21. var err error
  22. //获取当前流程运行信息
  23. thisProcess := (*wf_run_process.Entity)(nil)
  24. thisProcess, err = wf_run_process.GetProcessById(runProcess)
  25. if err != nil {
  26. return err
  27. }
  28. //获取当前审批分支的所有下级节点
  29. thisNpidSAll := make([]uint, 0, 100)
  30. thisNpidSAll, err = GetAllNextProcessIds(thisProcess.RunFlowProcess)
  31. //获取其他同步的步骤信息
  32. runProcessList, err = wf_run_process.GetProcessByMap(g.Map{
  33. "run_id": req.RunId,
  34. "status": 0,
  35. "id <> ": req.RunProcess,
  36. })
  37. if err != nil {
  38. return err
  39. }
  40. if runProcessList != nil {
  41. nPidS := make([]uint, len(runProcessList))
  42. for k, v := range runProcessList {
  43. //查询每个分支的所有下级节点
  44. nPidS[k] = v.RunFlowProcess
  45. }
  46. //查询对应的流程步骤信息判断他们的下一步是否是同一个节点(分支合并)
  47. processes := ([]*wf_flow_process.Entity)(nil) //和当前步骤同步模式下的其他分支步骤
  48. processes, err = wf_flow_process.GetProcessInfosByIds(nPidS)
  49. if err != nil {
  50. return err
  51. }
  52. for _, v := range processes {
  53. hasLinkNode := false //是否在分支上还有下一级节点,并且下个节点在分支内
  54. nPidSAll := make([]uint, 0, 100) //每个分支的所有下级节点
  55. nPidSAll, err = GetAllNextProcessIds(gconv.Uint(v.Id))
  56. if err != nil {
  57. return err
  58. }
  59. tagLink := true
  60. for _, nv := range nPidSAll {
  61. tag := false
  62. for _, tv := range thisNpidSAll {
  63. if tv == nv {
  64. tag = true
  65. break
  66. }
  67. }
  68. if !tag {
  69. tagLink = false
  70. } else {
  71. tagLink = true
  72. }
  73. }
  74. if nPid != v.ProcessTo && tagLink {
  75. hasLinkNode = true
  76. break
  77. }
  78. isAddNextMode2 = isAddNextMode2 && hasLinkNode
  79. }
  80. nPid = gstr.JoinAny(nPidS, ",")
  81. }
  82. }
  83. tx, err := g.DB().Begin()
  84. if err != nil {
  85. g.Log().Error()
  86. return gerror.New("开启事务失败")
  87. }
  88. if nPid != "0" && nPid != "" { //判断是否为最后一步
  89. //不是最后一步
  90. //结束流程
  91. err = EndProcess(runProcess, req.CheckCon, 2, tx)
  92. if err != nil {
  93. tx.Rollback()
  94. return err
  95. }
  96. //同步模式下只写入记录
  97. if req.WfMode != 2 { //非同步模式
  98. //更新单据信息
  99. err = Up(runId, nPid, tx)
  100. if err != nil {
  101. tx.Rollback()
  102. return err
  103. }
  104. //记录下一个流程(消息记录)
  105. err = Run(req, "ok", tx)
  106. if err != nil {
  107. tx.Rollback()
  108. return err
  109. }
  110. } else {
  111. if isAddNextMode2 {
  112. //更新单据信息
  113. if nPid == "" {
  114. nPid = req.Npid
  115. } else {
  116. nPid = nPid + "," + req.Npid
  117. }
  118. g.Log().Debug(nPid)
  119. err = Up(runId, nPid, tx)
  120. if err != nil {
  121. tx.Rollback()
  122. return err
  123. }
  124. //记录下一个流程(消息记录)
  125. err = Run(req, "ok", tx)
  126. if err != nil {
  127. tx.Rollback()
  128. return err
  129. }
  130. } else {
  131. fm := &flowModel.SaveWfFlowReq{
  132. WfType: req.WfType,
  133. WfFid: gconv.Int(req.WfFid),
  134. WfId: req.FlowId,
  135. CheckCon: req.CheckCon,
  136. RunProcess: req.RunProcess,
  137. RunId: req.RunId,
  138. Art: req.Art,
  139. UserId: req.UserId,
  140. }
  141. err = AddRunLog(gconv.Int64(req.RunId), fm, "ok", tx)
  142. if err != nil {
  143. tx.Rollback()
  144. return err
  145. }
  146. }
  147. }
  148. } else {
  149. //是最后一步
  150. //结束流程
  151. err = EndFlow(runId, tx)
  152. if err != nil {
  153. tx.Rollback()
  154. return err
  155. }
  156. err = EndProcess(runProcess, req.CheckCon, 2, tx)
  157. if err != nil {
  158. tx.Rollback()
  159. return err
  160. }
  161. //删除审批表中的用户/部门信息
  162. err = DeleteBusinessChecker(req.WfFid, req.WfType, tx)
  163. if err != nil {
  164. tx.Rollback()
  165. return err
  166. }
  167. fm := &flowModel.SaveWfFlowReq{
  168. WfType: req.WfType,
  169. WfFid: gconv.Int(req.WfFid),
  170. WfId: req.FlowId,
  171. CheckCon: req.CheckCon,
  172. RunProcess: req.RunProcess,
  173. RunId: req.RunId,
  174. Art: req.Art,
  175. UserId: req.UserId,
  176. }
  177. err = AddRunLog(gconv.Int64(runId), fm, "ok", tx)
  178. if err != nil {
  179. tx.Rollback()
  180. return err
  181. }
  182. //更新单据状态
  183. err = UpdateBill(gconv.Int(req.WfFid), req.WfType, req.WfStatusField, 2, tx)
  184. if err != nil {
  185. tx.Rollback()
  186. return err
  187. }
  188. }
  189. tx.Commit()
  190. return nil
  191. }