ding_event.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. package dingtalk
  2. import (
  3. "context"
  4. model "dashoo.cn/micro/app/model/workflow"
  5. baseSrv "dashoo.cn/micro/app/service/base"
  6. contractSrv "dashoo.cn/micro/app/service/contract"
  7. custServer "dashoo.cn/micro/app/service/cust"
  8. "dashoo.cn/micro/app/service/dingtalk_log"
  9. platServer "dashoo.cn/micro/app/service/plat"
  10. projService "dashoo.cn/micro/app/service/proj"
  11. workflowServer "dashoo.cn/micro/app/service/workflow"
  12. "dashoo.cn/opms_libary/plugin/dingtalk"
  13. dingContext "dashoo.cn/opms_libary/plugin/dingtalk/context"
  14. "dashoo.cn/opms_libary/plugin/dingtalk/message"
  15. "database/sql"
  16. "fmt"
  17. "github.com/gogf/gf/os/glog"
  18. "github.com/gogf/gf/util/gconv"
  19. )
  20. type DingHandler struct{}
  21. // CallBack 钉钉事件回调
  22. // 日程相关详情参照文档:https://open.dingtalk.com/document/orgapp/schedule-event
  23. // 审批相关详情参照文档:https://open.dingtalk.com/document/orgapp/approval-events
  24. func (h *DingHandler) CallBack(ctx context.Context, req *message.SubsMessage, rsp *message.Reply) error {
  25. req.Ctx = ctx
  26. handler := dingtalk.Client.GetDingTalkHandler(req)
  27. //设置接收消息的处理方法
  28. handler.SetHandleMessageFunc(func(msg *message.MixMessage) string {
  29. // 记录日志
  30. dingtalk_log.Create(handler.Context.SubsMessage.Ctx, "20", gconv.String(msg))
  31. switch msg.EventType {
  32. case message.EventCheckUrl:
  33. return h.handleCheckUrl(msg)
  34. case message.EventCalendarChange:
  35. return h.handleCalendarChange(msg, handler.Context)
  36. case message.BpmsInstanceChange:
  37. return h.handleBpmsInstanceChange(msg, handler.Context)
  38. case message.BpmsTaskChange:
  39. return h.handleBpmsTaskChange(msg, handler.Context)
  40. }
  41. return ""
  42. })
  43. result, _ := handler.Handle()
  44. *rsp = result
  45. return nil
  46. }
  47. // 验证回调参数
  48. func (h *DingHandler) handleCheckUrl(msg *message.MixMessage) string {
  49. fmt.Println(msg)
  50. return "success"
  51. }
  52. // 处理日程回调
  53. func (h *DingHandler) handleCalendarChange(msg *message.MixMessage, ctx *dingContext.Context) string {
  54. fmt.Println(msg)
  55. // 本系统数据库操作
  56. s, err := platServer.NewScheduleService(ctx.SubsMessage.Ctx)
  57. if err != nil {
  58. glog.Error(err)
  59. return err.Error()
  60. }
  61. // 回填数据
  62. err = s.SaveByDingEvent(msg)
  63. if err != nil {
  64. glog.Error(err)
  65. return err.Error()
  66. }
  67. return "success"
  68. }
  69. // 处理审批实例回调
  70. func (h *DingHandler) handleBpmsInstanceChange(msg *message.MixMessage, ctx *dingContext.Context) string {
  71. fmt.Println(msg)
  72. // 构造访问服务
  73. s, err := workflowServer.NewFlowService(ctx.SubsMessage.Ctx)
  74. if err != nil {
  75. glog.Error(err)
  76. return err.Error()
  77. }
  78. // 获取审批实例数据
  79. instance, err := s.GetWorkflowInstance(msg.ProcessInstanceId)
  80. if err != nil {
  81. if err == sql.ErrNoRows {
  82. glog.Error("无匹配的审批实例")
  83. return "无匹配的审批实例"
  84. }
  85. glog.Error(err)
  86. return err.Error()
  87. }
  88. if instance == nil {
  89. return "无匹配的审批实例"
  90. }
  91. // 处理实例数据(不需要钉钉审批实例参数)
  92. switch instance.BizType {
  93. case model.CustomerReceive:
  94. if msg.ProcessType == "finish" || msg.ProcessType == "terminate" {
  95. srv, err := custServer.NewCustomerService(ctx.SubsMessage.Ctx)
  96. if err != nil {
  97. glog.Error(err)
  98. return err.Error()
  99. }
  100. err = srv.AssignCustomerRequestApproval(instance, msg)
  101. if err != nil {
  102. glog.Error(err)
  103. return err.Error()
  104. }
  105. }
  106. err = s.Update(instance, msg)
  107. if err != nil {
  108. glog.Error(err)
  109. return err.Error()
  110. }
  111. return "success"
  112. case model.CustomerPublic:
  113. if msg.ProcessType == "finish" || msg.ProcessType == "terminate" {
  114. srv, err := custServer.NewCustomerService(ctx.SubsMessage.Ctx)
  115. if err != nil {
  116. glog.Error(err)
  117. return err.Error()
  118. }
  119. err = srv.MoveToPublicApproval(instance, msg)
  120. if err != nil {
  121. glog.Error(err)
  122. return err.Error()
  123. }
  124. }
  125. err = s.Update(instance, msg)
  126. if err != nil {
  127. glog.Error(err)
  128. return err.Error()
  129. }
  130. return "success"
  131. case model.CustomerTrans:
  132. if msg.ProcessType == "finish" || msg.ProcessType == "terminate" {
  133. srv, err := custServer.NewCustomerService(ctx.SubsMessage.Ctx)
  134. if err != nil {
  135. glog.Error(err)
  136. return err.Error()
  137. }
  138. err = srv.TransCustomerApproval(instance, msg)
  139. if err != nil {
  140. glog.Error(err)
  141. return err.Error()
  142. }
  143. }
  144. err = s.Update(instance, msg)
  145. if err != nil {
  146. glog.Error(err)
  147. return err.Error()
  148. }
  149. return "success"
  150. case model.ContractInvoice:
  151. if msg.ProcessType == "finish" || msg.ProcessType == "terminate" {
  152. err = contractSrv.InvoiceApplyApproval(ctx.SubsMessage.Ctx, instance, msg)
  153. if err != nil {
  154. glog.Error(err)
  155. return err.Error()
  156. }
  157. }
  158. err = s.Update(instance, msg)
  159. if err != nil {
  160. glog.Error(err)
  161. return err.Error()
  162. }
  163. return "success"
  164. case model.ContractCreate:
  165. if msg.ProcessType == "finish" || msg.ProcessType == "terminate" {
  166. err = contractSrv.ContractApplyApproval(ctx.SubsMessage.Ctx, instance, msg)
  167. if err != nil {
  168. glog.Error(err)
  169. return err.Error()
  170. }
  171. }
  172. err = s.Update(instance, msg)
  173. if err != nil {
  174. glog.Error(err)
  175. return err.Error()
  176. }
  177. return "success"
  178. case model.DistProxyCreate:
  179. if msg.ProcessType == "finish" || msg.ProcessType == "terminate" {
  180. err = baseSrv.ApprovalProxyCreate(ctx.SubsMessage.Ctx, instance, msg)
  181. if err != nil {
  182. glog.Error(err)
  183. return err.Error()
  184. }
  185. }
  186. err = s.Update(instance, msg)
  187. if err != nil {
  188. glog.Error(err)
  189. return err.Error()
  190. }
  191. return "success"
  192. case model.DistToProxy:
  193. if msg.ProcessType == "finish" || msg.ProcessType == "terminate" {
  194. err = baseSrv.ApprovalDistToProxy(ctx.SubsMessage.Ctx, instance, msg)
  195. if err != nil {
  196. glog.Error(err)
  197. return err.Error()
  198. }
  199. }
  200. err = s.Update(instance, msg)
  201. if err != nil {
  202. glog.Error(err)
  203. return err.Error()
  204. }
  205. return "success"
  206. case model.DistProxyRenew:
  207. if msg.ProcessType == "finish" || msg.ProcessType == "terminate" {
  208. err = baseSrv.ApprovalDistRenew(ctx.SubsMessage.Ctx, instance, msg)
  209. if err != nil {
  210. glog.Error(err)
  211. return err.Error()
  212. }
  213. }
  214. err = s.Update(instance, msg)
  215. if err != nil {
  216. glog.Error(err)
  217. return err.Error()
  218. }
  219. return "success"
  220. case model.DistToDist:
  221. if msg.ProcessType == "finish" || msg.ProcessType == "terminate" {
  222. err = baseSrv.ApprovalDistToDist(ctx.SubsMessage.Ctx, instance, msg)
  223. if err != nil {
  224. glog.Error(err)
  225. return err.Error()
  226. }
  227. }
  228. err = s.Update(instance, msg)
  229. if err != nil {
  230. glog.Error(err)
  231. return err.Error()
  232. }
  233. return "success"
  234. case model.ProjectCreate:
  235. if msg.ProcessType == "finish" || msg.ProcessType == "terminate" {
  236. srv, err := projService.NewBusinessService(ctx.SubsMessage.Ctx)
  237. if err != nil {
  238. glog.Error(err)
  239. return err.Error()
  240. }
  241. err = srv.BusinessCreatedNotify(instance, msg)
  242. if err != nil {
  243. glog.Error(err)
  244. return err.Error()
  245. }
  246. }
  247. err = s.Update(instance, msg)
  248. if err != nil {
  249. glog.Error(err)
  250. return err.Error()
  251. }
  252. return "success"
  253. case model.ProjectUpGrade:
  254. if msg.ProcessType == "finish" || msg.ProcessType == "terminate" {
  255. srv, err := projService.NewBusinessService(ctx.SubsMessage.Ctx)
  256. if err != nil {
  257. glog.Error(err)
  258. return err.Error()
  259. }
  260. err = srv.BusinessUpgradeNotify(instance, msg)
  261. if err != nil {
  262. glog.Error(err)
  263. return err.Error()
  264. }
  265. }
  266. err = s.Update(instance, msg)
  267. if err != nil {
  268. glog.Error(err)
  269. return err.Error()
  270. }
  271. return "success"
  272. case model.ProjectDownGrade:
  273. if msg.ProcessType == "finish" || msg.ProcessType == "terminate" {
  274. srv, err := projService.NewBusinessService(ctx.SubsMessage.Ctx)
  275. if err != nil {
  276. glog.Error(err)
  277. return err.Error()
  278. }
  279. err = srv.BusinessDowngradeNotify(instance, msg)
  280. if err != nil {
  281. glog.Error(err)
  282. return err.Error()
  283. }
  284. }
  285. err = s.Update(instance, msg)
  286. if err != nil {
  287. glog.Error(err)
  288. return err.Error()
  289. }
  290. return "success"
  291. case model.ProjectTransfer:
  292. if msg.ProcessType == "finish" || msg.ProcessType == "terminate" {
  293. srv, err := projService.NewBusinessService(ctx.SubsMessage.Ctx)
  294. if err != nil {
  295. glog.Error(err)
  296. return err.Error()
  297. }
  298. err = srv.BusinessTransferNotify(instance, msg)
  299. if err != nil {
  300. glog.Error(err)
  301. return err.Error()
  302. }
  303. }
  304. err = s.Update(instance, msg)
  305. if err != nil {
  306. glog.Error(err)
  307. return err.Error()
  308. }
  309. return "success"
  310. case model.ProjectToReserve:
  311. if msg.ProcessType == "finish" || msg.ProcessType == "terminate" {
  312. srv, err := projService.NewBusinessService(ctx.SubsMessage.Ctx)
  313. if err != nil {
  314. glog.Error(err)
  315. return err.Error()
  316. }
  317. err = srv.ConvertToReserveNotify(instance, msg)
  318. if err != nil {
  319. glog.Error(err)
  320. return err.Error()
  321. }
  322. }
  323. err = s.Update(instance, msg)
  324. if err != nil {
  325. glog.Error(err)
  326. return err.Error()
  327. }
  328. return "success"
  329. case model.PlatTaskApproval:
  330. if msg.ProcessType == "finish" || msg.ProcessType == "terminate" {
  331. srv, err := platServer.NewTaskService(ctx.SubsMessage.Ctx)
  332. if err != nil {
  333. glog.Error(err)
  334. return err.Error()
  335. }
  336. err = srv.AddTaskApproval(instance, msg)
  337. if err != nil {
  338. glog.Error(err)
  339. return err.Error()
  340. }
  341. }
  342. err = s.Update(instance, msg)
  343. if err != nil {
  344. glog.Error(err)
  345. return err.Error()
  346. }
  347. return "success"
  348. }
  349. // 以下的代码需要调用钉钉接口查询数据,并且以下接口需要审批实例的数据
  350. //// 获取钉钉数据
  351. //resp, err := s.GetProcessInstanceDetail(msg.ProcessInstanceId)
  352. //if err != nil {
  353. // glog.Error(err)
  354. // return err.Error()
  355. //}
  356. //if resp.Success == "false" {
  357. // return "fail"
  358. //}
  359. ////按照类型处理数据(不需要钉钉审批实例参数)
  360. //switch instance.BizType {
  361. //case model.CustomerReceive:
  362. // if msg.ProcessType == "finish" || msg.ProcessType == "terminate" {
  363. // //srv.Handle(instance, msg, resp)
  364. // }
  365. return "success"
  366. }
  367. // 处理审批任务回调
  368. func (h *DingHandler) handleBpmsTaskChange(msg *message.MixMessage, ctx *dingContext.Context) string {
  369. fmt.Println(msg)
  370. // TODO 目前审批任务无处理逻辑
  371. //// 本系统数据库操作
  372. //s, err := platServer.NewScheduleService(ctx.SubsMessage.Ctx)
  373. //if err != nil {
  374. // glog.Error(err)
  375. // return err.Error()
  376. //}
  377. //// 回填数据
  378. //err = s.SaveByDingEvent(msg)
  379. //if err != nil {
  380. // glog.Error(err)
  381. // return err.Error()
  382. //}
  383. return "success"
  384. }