run_log.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. package work_flow_service
  2. import (
  3. "gfast/app/model/admin/user"
  4. flowModel "gfast/app/model/admin/wf_flow"
  5. "gfast/app/model/admin/wf_flow_process"
  6. "gfast/app/model/admin/wf_run_log"
  7. "gfast/app/model/admin/wf_run_process"
  8. "gfast/app/model/admin/wf_workinfo"
  9. "github.com/gogf/gf/database/gdb"
  10. "github.com/gogf/gf/errors/gerror"
  11. "github.com/gogf/gf/frame/g"
  12. "github.com/gogf/gf/os/gtime"
  13. "github.com/gogf/gf/text/gstr"
  14. "github.com/gogf/gf/util/gconv"
  15. )
  16. //工作流审批日志记录
  17. func AddRunLog(runId int64, req *flowModel.SaveWfFlowReq, btn string, tx *gdb.TX) error {
  18. workReturn := ""
  19. if btn != "Send" && btn != "SupEnd" {
  20. //workReturn =
  21. //在日志记录前加载节点钩子
  22. var err error
  23. workReturn, err = WorkApi(req, tx)
  24. if err != nil {
  25. return err
  26. }
  27. }
  28. err := wf_run_log.Add(&wf_run_log.AddData{
  29. Uid: gconv.Uint(req.UserId),
  30. FromId: req.WfFid,
  31. FromTable: req.WfType,
  32. RunId: gconv.Uint(runId),
  33. Content: req.CheckCon,
  34. WorkInfo: workReturn,
  35. Art: req.Art,
  36. Btn: btn,
  37. Dateline: gconv.Uint(gtime.Timestamp()),
  38. }, tx)
  39. return err
  40. }
  41. func WorkApi(req *flowModel.SaveWfFlowReq, tx *gdb.TX) (string, error) {
  42. sqlReturn := "null"
  43. msgReturn := "null"
  44. //去除当前运行的步骤ID
  45. runProcess, err := wf_run_process.GetProcessById(req.RunProcess)
  46. if err != nil {
  47. return "", err
  48. }
  49. runFlowProcess := runProcess.RunFlowProcess
  50. //获取当前步骤版本ID,对应的所有信息
  51. flowProcessInfo, err := wf_flow_process.GetProcessInfoById(runFlowProcess)
  52. if err != nil {
  53. return "", err
  54. }
  55. if flowProcessInfo == nil {
  56. return "flow_process_info err!", nil
  57. }
  58. if flowProcessInfo.WorkSql != "" {
  59. workInfoId, err := workSql(req, flowProcessInfo, tx)
  60. if err != nil {
  61. return "", err
  62. }
  63. sqlReturn = gconv.String(workInfoId)
  64. if flowProcessInfo.WorkMsg != "" {
  65. workInfoId, err := workMsg(req, flowProcessInfo, tx)
  66. if err != nil {
  67. return "", err
  68. }
  69. msgReturn = gconv.String(workInfoId)
  70. }
  71. }
  72. return "work_sql:" + sqlReturn + "|work_msg:" + msgReturn, nil
  73. }
  74. func workMsg(req *flowModel.SaveWfFlowReq, flowProcessInfo *wf_flow_process.Entity, tx *gdb.TX) (int64, error) {
  75. newWorkMsg := gstr.ReplaceIByArray(flowProcessInfo.WorkMsg, []string{
  76. "@from_id", gconv.String(req.WfFid),
  77. "@run_id", gconv.String(req.RunId),
  78. "@check_con", req.CheckCon,
  79. })
  80. workInfoId, err := wf_workinfo.Add(&wf_workinfo.AddData{
  81. Datetime: gtime.Now(),
  82. Type: "work_msg",
  83. BillInfo: gconv.String(req),
  84. Data: newWorkMsg,
  85. Info: "success",
  86. }, tx)
  87. if err != nil {
  88. return -1, err
  89. }
  90. return workInfoId, nil
  91. }
  92. func workSql(req *flowModel.SaveWfFlowReq, flowProcessInfo *wf_flow_process.Entity, tx *gdb.TX) (int64, error) {
  93. newWorkSql := gstr.ReplaceIByArray(flowProcessInfo.WorkSql, []string{
  94. "@from_id", gconv.String(req.WfFid),
  95. "@run_id", gconv.String(req.RunId),
  96. "@check_con", req.CheckCon,
  97. })
  98. workReturn := ""
  99. _, err := g.DB().Query(newWorkSql)
  100. if err != nil {
  101. g.Log().Error()
  102. workReturn = "SQL_Err:" + newWorkSql
  103. }
  104. workInfoId, err := wf_workinfo.Add(&wf_workinfo.AddData{
  105. Datetime: gtime.Now(),
  106. Type: "work_sql",
  107. BillInfo: gconv.String(req),
  108. Data: newWorkSql,
  109. Info: workReturn,
  110. }, tx)
  111. if err != nil {
  112. return -1, err
  113. }
  114. return workInfoId, nil
  115. }
  116. type RunLogInfo struct {
  117. *wf_run_log.Entity
  118. User string `json:"user"`
  119. }
  120. //获取审批日志
  121. func RunLog(wfFid uint, wfType string) ([]*RunLogInfo, error) {
  122. types := g.MapStrStr{
  123. "Send": "流程发起",
  124. "ok": "同意提交",
  125. "Back": "退回修改",
  126. "SupEnd": "终止流程",
  127. "Sing": "会签提交",
  128. "sok": "会签同意",
  129. "SingBack": "会签退回",
  130. "SingSing": "会签再会签",
  131. }
  132. runLog, err := wf_run_log.GetRunLog(g.Map{
  133. "from_id": wfFid,
  134. "from_table": wfType,
  135. })
  136. if err != nil {
  137. return nil, err
  138. }
  139. logs := make([]*RunLogInfo, len(runLog))
  140. for k, v := range runLog {
  141. logs[k] = &RunLogInfo{
  142. Entity: v,
  143. }
  144. logs[k].Btn = types[v.Btn]
  145. userInfo, err := user.GetUserById(gconv.Uint64(v.Uid))
  146. if err != nil {
  147. return nil, err
  148. }
  149. logs[k].User = userInfo.UserNickname
  150. }
  151. return logs, nil
  152. }
  153. //运行记录
  154. func Run(req *flowModel.CheckWfSaveReq, btn string, tx *gdb.TX) error {
  155. if req.Npid != "" && req.Npid != "0" {
  156. nexPid := gstr.Split(req.Npid, ",")
  157. var wps []*wf_flow_process.Entity
  158. for _, v := range nexPid {
  159. wfProcess, err := GetProcessInfo(gconv.Uint(v), req.RunId)
  160. if err != nil {
  161. return err
  162. }
  163. //添加流程步骤日志
  164. wp := new(wf_flow_process.Entity)
  165. err = gconv.Struct(wfProcess.Entity, wp)
  166. if err != nil {
  167. g.Log().Error(err)
  168. return gerror.New("转换流程步骤数据失败")
  169. }
  170. err = AddWorkflowProcess(req.FlowId, wp, gconv.Int64(req.RunId), req.UserId, req.Todo, tx)
  171. if err != nil {
  172. return err
  173. }
  174. wps = append(wps, wp)
  175. }
  176. if wps != nil {
  177. //设置下一步审批人员/部门信息
  178. err := SetBusinessCheckers(gconv.Int(req.WfFid), req.WfType, gconv.Int64(req.RunId), wps, req.Todo, tx)
  179. if err != nil {
  180. return err
  181. }
  182. }
  183. }
  184. //日志记录
  185. fm := &flowModel.SaveWfFlowReq{
  186. WfType: req.WfType,
  187. WfFid: gconv.Int(req.WfFid),
  188. WfId: req.FlowId,
  189. CheckCon: req.CheckCon,
  190. RunProcess: req.RunProcess,
  191. RunId: req.RunId,
  192. Art: req.Art,
  193. UserId: req.UserId,
  194. }
  195. err := AddRunLog(gconv.Int64(req.RunId), fm, btn, tx)
  196. if err != nil {
  197. return err
  198. }
  199. return nil
  200. }