work_flow.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package workflow
  2. import (
  3. "context"
  4. dao "dashoo.cn/micro/app/dao/workflow"
  5. model "dashoo.cn/micro/app/model/workflow"
  6. "dashoo.cn/micro/app/service"
  7. "dashoo.cn/opms_libary/myerrors"
  8. "dashoo.cn/opms_libary/plugin/dingtalk"
  9. "dashoo.cn/opms_libary/plugin/dingtalk/message"
  10. "dashoo.cn/opms_libary/plugin/dingtalk/workflow"
  11. "dashoo.cn/opms_libary/utils"
  12. "github.com/gogf/gf/frame/g"
  13. "github.com/gogf/gf/os/gtime"
  14. "github.com/gogf/gf/util/gconv"
  15. "time"
  16. )
  17. type workflowService struct {
  18. *service.ContextService
  19. Dao *dao.PlatWorkflowDao
  20. }
  21. func NewFlowService(ctx context.Context) (svc *workflowService, err error) {
  22. svc = new(workflowService)
  23. if svc.ContextService, err = svc.Init(ctx); err != nil {
  24. return nil, err
  25. }
  26. svc.Dao = dao.NewPlatWorkflowDao(svc.Tenant)
  27. return svc, nil
  28. }
  29. // GetSchemaByProcessCode 获取表单 schema(钉钉接口)
  30. func (s *workflowService) GetSchemaByProcessCode(processCode string) (*workflow.QuerySchemaByProcessCodeResponse, error) {
  31. g.Log().Info("搜索值", processCode)
  32. // 调用钉钉接口
  33. client := dingtalk.NewClient()
  34. w := client.GetWorkflow()
  35. resp, err := w.QuerySchemaByProcessCode(processCode)
  36. if err != nil {
  37. return nil, err
  38. }
  39. return &resp, nil
  40. }
  41. // GetProcessInstanceDetail 获取审批实例详情(钉钉接口)
  42. func (s *workflowService) GetProcessInstanceDetail(instId string) (*workflow.QueryProcessInstanceResponse, error) {
  43. g.Log().Info("搜索值", instId)
  44. // 调用钉钉接口
  45. client := dingtalk.NewClient()
  46. w := client.GetWorkflow()
  47. resp, err := w.QueryProcessInstanceDetail(instId)
  48. if err != nil {
  49. return nil, err
  50. }
  51. return &resp, nil
  52. }
  53. // StartProcessInstance 发起一个新的审批流(钉钉接口,并回填到本地系统)
  54. // OriginatorUserId = utils.String("当前用户的钉钉中的Id")
  55. // ProcessCode = utils.String("每种审批对应固定的code")
  56. // bizType:业务类型(10领用20项目创建30合同创建
  57. // 详情参照文档:https://open.dingtalk.com/document/orgapp/create-an-approval-instance
  58. func (s *workflowService) StartProcessInstance(bizCode, bizType, remark string, flow *workflow.StartProcessInstanceRequest) (instanceId string, err error) {
  59. // 参数调整
  60. if flow.OriginatorUserId == nil {
  61. flow.OriginatorUserId = utils.String(s.GetCxtUserDingtalkUid())
  62. }
  63. if flow.DeptId == nil {
  64. flow.DeptId = utils.Int64(gconv.Int64(s.GetCxtUserDeptId()))
  65. }
  66. g.Log().Info("搜索值", flow)
  67. // 调用钉钉接口
  68. client := dingtalk.NewClient()
  69. w := client.GetWorkflow()
  70. resp, err := w.StartProcessInstance(flow)
  71. if err != nil {
  72. return "", err
  73. }
  74. _, err = s.saveWorkflowInstance(bizCode, bizType, remark, resp.InstanceId)
  75. return resp.InstanceId, err
  76. }
  77. // RevokeProcessInstance 撤销审批实例(钉钉接口)
  78. func (s *workflowService) RevokeProcessInstance(instId, remark string) (string, error) {
  79. g.Log().Info("搜索值instId, remark:", instId, remark)
  80. // 调用钉钉接口
  81. client := dingtalk.NewClient()
  82. w := client.GetWorkflow()
  83. resp, err := w.RevokeProcessInstance(instId, remark, s.GetCxtUserDingtalkUid())
  84. if err != nil {
  85. return "", err
  86. }
  87. return resp.InstanceId, nil
  88. }
  89. // 将审批实例同步到数据库中
  90. func (s *workflowService) saveWorkflowInstance(bizCode, bizType, remark, instanceId string) (insertId int64, err error) {
  91. now := gtime.Now()
  92. // 构造基础数据
  93. var instance model.PlatWorkflow
  94. instance.BizCode = bizCode
  95. instance.BizType = bizType
  96. instance.CurrentNode = "create"
  97. instance.CurrentNodeTime = now.Format("Y-m-d H:i:s")
  98. instance.ProcessInstId = instanceId
  99. instance.Remark = remark
  100. // 填充创建信息
  101. service.SetCreatedInfo(&instance, s.GetCxtUserId(), s.GetCxtUserName())
  102. // 保存数据并返回
  103. return s.Dao.InsertAndGetId(instance)
  104. }
  105. // GetWorkflowInstance 获取实例(本地数据)
  106. func (s *workflowService) GetWorkflowInstance(instanceId string) (*model.PlatWorkflow, error) {
  107. // 查询日程实例
  108. return s.Dao.Where("process_inst_id", instanceId).FindOne()
  109. }
  110. // Update 更新(本地数据)
  111. func (s *workflowService) Update(instance *model.PlatWorkflow, msg *message.MixMessage) (err error) {
  112. // 保存实例
  113. instance.CurrentNode = msg.ProcessType
  114. instance.CurrentNodeTime = time.Unix(gconv.Int64(msg.FinishTime), 0).Format("2006-01-02 15:04:05")
  115. instance.ApprovalResult = msg.Result
  116. _, err = s.Dao.Save(instance)
  117. return
  118. }
  119. // GetList 任务信息列表(本地数据)
  120. func (s *workflowService) GetList(req *model.SearchWorkflowReq) (total int, flowList []*model.PlatWorkflow, err error) {
  121. flowModel := s.Dao.M
  122. if req.BizCode != "" {
  123. flowModel = flowModel.Where("biz_code", req.BizCode)
  124. }
  125. if req.BizType != "" {
  126. flowModel = flowModel.Where("biz_type", req.BizType)
  127. }
  128. if req.MySelf != "0" {
  129. flowModel = flowModel.Where("created_by", s.GetCxtUserId())
  130. }
  131. total, err = flowModel.Count()
  132. if err != nil {
  133. g.Log().Error(err)
  134. err = myerrors.DbError("获取总行数失败。")
  135. return
  136. }
  137. err = flowModel.Page(req.GetPage()).Order("plat_task.created_time DESC").Scan(&flowList)
  138. return
  139. }