ding_event.go 12 KB

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