work_flow.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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/workflow"
  10. "dashoo.cn/opms_libary/utils"
  11. "github.com/gogf/gf/frame/g"
  12. "github.com/gogf/gf/os/gtime"
  13. )
  14. type workflowService struct {
  15. *service.ContextService
  16. Dao *dao.PlatWorkflowDao
  17. }
  18. func NewFlowService(ctx context.Context) (svc *workflowService, err error) {
  19. svc = new(workflowService)
  20. if svc.ContextService, err = svc.Init(ctx); err != nil {
  21. return nil, err
  22. }
  23. svc.Dao = dao.NewPlatWorkflowDao(svc.Tenant)
  24. return svc, nil
  25. }
  26. // GetProcessInstanceDetail 获取审批实例详情(钉钉接口)
  27. func (s *workflowService) GetProcessInstanceDetail(instId string) (*workflow.QueryProcessInstanceResponse, error) {
  28. g.Log().Info("搜索值", instId)
  29. // 调用钉钉接口
  30. client := dingtalk.NewClient()
  31. w := client.GetWorkflow()
  32. resp, err := w.QueryProcessInstanceDetail(instId)
  33. if err != nil {
  34. return nil, err
  35. }
  36. return &resp, nil
  37. }
  38. // StartProcessInstance 发起一个新的审批流(钉钉接口,并回填到本地系统)
  39. // OriginatorUserId = utils.String("当前用户的钉钉中的Id")
  40. // ProcessCode = utils.String("每种审批对应固定的code")
  41. // bizType:业务类型(10领用20项目创建30合同创建
  42. // 详情参照文档:https://open.dingtalk.com/document/orgapp/create-an-approval-instance
  43. func (s *workflowService) StartProcessInstance(bizCode, bizType string, flow *workflow.StartProcessInstanceRequest) (insertId int64, err error) {
  44. g.Log().Info("搜索值", flow)
  45. // 参数调整
  46. if flow.OriginatorUserId == nil {
  47. // TODO s.GetCxtDingId() 目前写死
  48. flow.OriginatorUserId = utils.String("2710120955840801")
  49. }
  50. // 调用钉钉接口
  51. client := dingtalk.NewClient()
  52. w := client.GetWorkflow()
  53. resp, err := w.StartProcessInstance(flow)
  54. if err != nil {
  55. return 0, err
  56. }
  57. return s.saveWorkflowInstance(bizCode, bizType, resp.InstanceId)
  58. }
  59. // RevokeProcessInstance 撤销审批实例(钉钉接口)
  60. func (s *workflowService) RevokeProcessInstance(instId, remark string) (string, error) {
  61. g.Log().Info("搜索值instId, remark:", instId, remark)
  62. // 调用钉钉接口
  63. client := dingtalk.NewClient()
  64. w := client.GetWorkflow()
  65. // TODO 获取当前用户的钉钉中的Id s.GetCxtDingId()
  66. resp, err := w.RevokeProcessInstance(instId, remark, "s.GetCxtDingId()")
  67. if err != nil {
  68. return "", err
  69. }
  70. return resp.InstanceId, nil
  71. }
  72. // 将审批实例同步到数据库中
  73. func (s *workflowService) saveWorkflowInstance(bizCode, bizType, instanceId string) (insertId int64, err error) {
  74. now := gtime.Now()
  75. // 构造基础数据
  76. var instance model.PlatWorkflow
  77. instance.BizCode = bizCode
  78. instance.BizType = bizType
  79. instance.CurrentNode = "新建"
  80. instance.CurrentNodeTime = now.Format("Y-m-d H:i:s")
  81. instance.ProcessInstId = instanceId
  82. // 填充创建信息
  83. service.SetCreatedInfo(&instance, s.GetCxtUserId(), s.GetCxtUserName())
  84. // 保存数据并返回
  85. return s.Dao.InsertAndGetId(instance)
  86. }
  87. // GetWorkflowInstance 获取实例(本地数据)
  88. func (s *workflowService) GetWorkflowInstance(instanceId string) (*model.PlatWorkflow, error) {
  89. // 查询日程实例
  90. return s.Dao.Where("process_inst_id", instanceId).FindOne()
  91. }
  92. // GetList 任务信息列表(本地数据)
  93. func (s *workflowService) GetList(req *model.SearchWorkflowReq) (total int, flowList []*model.PlatWorkflow, err error) {
  94. flowModel := s.Dao.M
  95. if req.BizCode != "" {
  96. flowModel = flowModel.Where("biz_code", req.BizCode)
  97. }
  98. if req.BizType != "" {
  99. flowModel = flowModel.Where("biz_type", req.BizType)
  100. }
  101. if req.MySelf != "0" {
  102. flowModel = flowModel.Where("created_by", s.GetCxtUserId())
  103. }
  104. total, err = flowModel.Count()
  105. if err != nil {
  106. g.Log().Error(err)
  107. err = myerrors.DbError("获取总行数失败。")
  108. return
  109. }
  110. err = flowModel.Page(req.GetPage()).Order("plat_task.created_time DESC").Scan(&flowList)
  111. return
  112. }