ding_event.go 11 KB

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