ding_event.go 4.8 KB

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