ding_event.go 6.1 KB

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