ding_event.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package dingtalk
  2. import (
  3. "context"
  4. model "dashoo.cn/micro/app/model/workflow"
  5. custServer "dashoo.cn/micro/app/service/cust"
  6. platServer "dashoo.cn/micro/app/service/plat"
  7. workflowServer "dashoo.cn/micro/app/service/workflow"
  8. "dashoo.cn/opms_libary/plugin/dingtalk"
  9. dingContext "dashoo.cn/opms_libary/plugin/dingtalk/context"
  10. "dashoo.cn/opms_libary/plugin/dingtalk/message"
  11. "database/sql"
  12. "fmt"
  13. "github.com/gogf/gf/os/glog"
  14. )
  15. type DingHandler struct{}
  16. // CallBack 钉钉事件回调
  17. // 日程相关详情参照文档:https://open.dingtalk.com/document/orgapp/schedule-event
  18. // 审批相关详情参照文档:https://open.dingtalk.com/document/orgapp/approval-events
  19. func (h *DingHandler) CallBack(ctx context.Context, req *message.SubsMessage, rsp *message.Reply) error {
  20. req.Ctx = ctx
  21. handler := dingtalk.Client.GetDingTalkHandler(req)
  22. //设置接收消息的处理方法
  23. handler.SetHandleMessageFunc(func(msg *message.MixMessage) string {
  24. switch msg.EventType {
  25. case message.EventCheckUrl:
  26. return h.handleCheckUrl(msg)
  27. case message.EventCalendarChange:
  28. return h.handleCalendarChange(msg, handler.Context)
  29. case message.BpmsInstanceChange:
  30. return h.handleBpmsInstanceChange(msg, handler.Context)
  31. case message.BpmsTaskChange:
  32. return h.handleBpmsTaskChange(msg, handler.Context)
  33. }
  34. return ""
  35. })
  36. result, _ := handler.Handle()
  37. *rsp = result
  38. return nil
  39. }
  40. // 验证回调参数
  41. func (h *DingHandler) handleCheckUrl(msg *message.MixMessage) string {
  42. fmt.Println(msg)
  43. return "success"
  44. }
  45. // 处理日程回调
  46. func (h *DingHandler) handleCalendarChange(msg *message.MixMessage, ctx *dingContext.Context) string {
  47. fmt.Println(msg)
  48. // 本系统数据库操作
  49. s, err := platServer.NewScheduleService(ctx.SubsMessage.Ctx)
  50. if err != nil {
  51. glog.Error(err)
  52. return err.Error()
  53. }
  54. // 回填数据
  55. err = s.SaveByDingEvent(msg)
  56. if err != nil {
  57. glog.Error(err)
  58. return err.Error()
  59. }
  60. return "success"
  61. }
  62. // 处理审批实例回调
  63. func (h *DingHandler) handleBpmsInstanceChange(msg *message.MixMessage, ctx *dingContext.Context) string {
  64. fmt.Println(msg)
  65. // 构造访问服务
  66. s, err := workflowServer.NewFlowService(ctx.SubsMessage.Ctx)
  67. if err != nil {
  68. glog.Error(err)
  69. return err.Error()
  70. }
  71. // 获取审批实例数据
  72. instance, err := s.GetWorkflowInstance(msg.ProcessInstanceId)
  73. if err != nil {
  74. if err == sql.ErrNoRows {
  75. glog.Error("无匹配的审批实例")
  76. return "无匹配的审批实例"
  77. }
  78. glog.Error(err)
  79. return err.Error()
  80. }
  81. // 处理实例数据(不需要钉钉审批实例参数)
  82. switch instance.BizType {
  83. case model.CustomerReceive:
  84. if msg.ProcessType == "finish" || msg.ProcessType == "terminate" {
  85. srv, err := custServer.NewCustomerService(ctx.SubsMessage.Ctx)
  86. if err != nil {
  87. glog.Error(err)
  88. return err.Error()
  89. }
  90. err = srv.AssignCustomerRequestApproval(instance, msg)
  91. if err != nil {
  92. glog.Error(err)
  93. return err.Error()
  94. }
  95. }
  96. return "success"
  97. case model.ProjectCreate:
  98. if msg.ProcessType == "finish" || msg.ProcessType == "terminate" {
  99. //srv.Handle(instance, msg)
  100. }
  101. return "success"
  102. case model.ContractCreate:
  103. if msg.ProcessType == "finish" || msg.ProcessType == "terminate" {
  104. //srv.Handle(instance, msg)
  105. }
  106. return "success"
  107. }
  108. // 以下的代码需要调用钉钉接口查询数据,并且以下接口需要审批实例的数据
  109. //// 获取钉钉数据
  110. //resp, err := s.GetProcessInstanceDetail(msg.ProcessInstanceId)
  111. //if err != nil {
  112. // glog.Error(err)
  113. // return err.Error()
  114. //}
  115. //if resp.Success == "false" {
  116. // return "fail"
  117. //}
  118. ////按照类型处理数据(不需要钉钉审批实例参数)
  119. //switch instance.BizType {
  120. //case model.CustomerReceive:
  121. // if msg.ProcessType == "finish" || msg.ProcessType == "terminate" {
  122. // //srv.Handle(instance, msg, resp)
  123. // }
  124. return "success"
  125. }
  126. // 处理审批任务回调
  127. func (h *DingHandler) handleBpmsTaskChange(msg *message.MixMessage, ctx *dingContext.Context) string {
  128. fmt.Println(msg)
  129. // TODO 目前审批任务无处理逻辑
  130. //// 本系统数据库操作
  131. //s, err := platServer.NewScheduleService(ctx.SubsMessage.Ctx)
  132. //if err != nil {
  133. // glog.Error(err)
  134. // return err.Error()
  135. //}
  136. //// 回填数据
  137. //err = s.SaveByDingEvent(msg)
  138. //if err != nil {
  139. // glog.Error(err)
  140. // return err.Error()
  141. //}
  142. return "success"
  143. }