前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Yearning钉钉审批思路分享(一)

Yearning钉钉审批思路分享(一)

作者头像
用户1107783
发布2024-06-17 14:32:36
530
发布2024-06-17 14:32:36
举报

背景概述

上篇内容我们大致说明了一下Yearning如何集成外部工单通知,使其解耦支持更多自定义通知渠道。前几天有小伙伴提起如何集成飞书在线审批呢,当然飞书也好,钉钉也好实现思路都是一样的。因此我们这里简单的说明一下如何实现钉钉在线审批思路。

大致流程

  1. 获取审批接口
  2. 获取审批数据
  3. 发送审批请求

简单说明

获取审批接口

/api/v2/audit/order/state

代码语言:javascript
复制
 r := e.Group("/api/v2", middleware.JWTWithConfig(middleware.JwtConfig{SigningKey: []byte(model.JWT)}))
 audit := r.Group("/audit")
 audit.Restful("/order/:tp", audit2.AuditRestFulAPis())

审批

代码语言:javascript
复制
func AuditOrderApis(c yee.Context) (err error) {
 switch c.Params("tp") {
 case "state":
  return AuditOrderState(c)
 case "kill":
  return DelayKill(c)
 case "scheduled":
  return ScheduledChange(c)
 default:
  return c.JSON(http.StatusOK, common.ERR_REQ_FAKE)
 }
}

顾名思义,每个case我们就不解释了,这里主要是看一下state

代码语言:javascript
复制
// 工单审批

func AuditOrderState(c yee.Context) (err error) {
 u := new(Confirm)
 user := new(lib.Token).JwtParse(c)
 if err = c.Bind(u); err != nil {
  c.Logger().Error(err.Error())
  return c.JSON(http.StatusOK, common.ERR_REQ_BIND)
 }

 switch u.Tp {
 case "undo":
  lib.MessagePush(u.WorkId, 6, "")
  model.DB().Model(model.CoreSqlOrder{}).Where("work_id =?", u.WorkId).Updates(&model.CoreSqlOrder{Status: 6})
  return c.JSON(http.StatusOK, common.SuccessPayLoadToMessage(i18n.DefaultLang.Load(i18n.INFO_ORDER_IS_UNDO)))
 case "agree":
  return c.JSON(http.StatusOK, MultiAuditOrder(u, user.Username))
 case "reject":
  return c.JSON(http.StatusOK, RejectOrder(u, user.Username))
 default:
  return c.JSON(http.StatusOK, common.ERR_REQ_FAKE)
 }
}

这里我们看一下agree,即是同意。

代码语言:javascript
复制
func MultiAuditOrder(req *Confirm, user string) common.Resp {
 if assigned, isExecute, ok := isNotIdempotent(req, user); ok {
  if isExecute {
   return ExecuteOrder(req, user)
  }
  model.DB().Model(model.CoreSqlOrder{}).Where("work_id = ?", req.WorkId).Updates(&model.CoreSqlOrder{CurrentStep: req.Flag + 1, Assigned: strings.Join(assigned, ",")})
  model.DB().Create(&model.CoreWorkflowDetail{
   WorkId:   req.WorkId,
   Username: user,
   Time:     time.Now().Format("2006-01-02 15:04"),
   Action:   fmt.Sprintf(i18n.DefaultLang.Load(i18n.ORDER_AGREE_MESSAGE), strings.Join(assigned, " ")),
  })
  lib.MessagePush(req.WorkId, 5, "")
  return common.SuccessPayLoadToMessage(i18n.DefaultLang.Load(i18n.ORDER_AGREE_STATE))
 }
 return common.ERR_COMMON_TEXT_MESSAGE(i18n.DefaultLang.Load(i18n.ORDER_NOT_SEARCH))
}

获取审批数据

我们再结合URL请求验证一下

当我们点击同意后,其body数据为

代码语言:javascript
复制
{
    "work_id": "7fd51aec-d928-494e-a8c5-e144fd70bf12",
    "flag": 1,
    "tp": "agree",
    "source_id": "8280d90b-4130-4460-8002-87ada29e8c1d"
}

每个字段的含义解读:

work_id: 工单编号

flag: 流程步骤

tp: 工单审批动作

source_id: 数据库对应ID

至此我们就可以使用postman进行请求了,当然了我们还需要一个用户的token。

问题

我们应该如何获取到这些信息呢,也即是我们提交工单后,如何获取到下一步所需的body呢?

src/lib/sendMail.go

代码语言:javascript
复制
func MessagePush(workid string, t uint, reject string) {
 // 内容省略了。。。。。。
 //model.DB().Select("work_id,username,text,assigned,source").Where("work_id =?", workid).First(&o)
 model.DB().Where("work_id =?", workid).First(&o)
// 内容省略了。。。。。。
}

我们将指定字段的查询修改为查询所有字段,当然你也可以按需查询。

src/lib/ding.go

代码语言:javascript
复制
type imCryGeneric struct {
 Assigned    string     // 下步操作人
 WorkId      string     // 工单编号
 Source      string     // 数据源
 SourceId    string     // 数据源ID
 Username    string     // 提交人
 Text        string     // 描述
 IDC         string     // 归属类别
 Table       string     // 归属表
 Date        string     // 提交时间
 CurrentStep int        // 当前步骤
 Relevant    model.JSON // 流程审核人员相关

}

添加字段

代码语言:javascript
复制
 case model.CoreSqlOrder:
  order = imCryGeneric{
   Assigned:    v.Assigned,
   WorkId:      v.WorkId,
   Source:      v.Source,
   SourceId:    v.SourceId,
   Username:    v.Username,
   Text:        v.Text,
   IDC:         v.IDC,
   Table:       v.Table,
   Date:        v.Date,
   CurrentStep: v.CurrentStep,
  }

查看提交工单获取到数据

代码语言:javascript
复制
{
    "Order": {
        "Assigned": "张三",
        "WorkId": "b53da813-84aa-4fdb-9e7e-09eca41ca32e",
        "Source": "test",
        "SourceId": "8280d90b-4130-4460-8002-87ada29e8c1d",
        "Username": "admin",
        "Text": "流程测试",
        "IDC": "Aliyun",
        "Table": "sys_job_log",
        "Date": "2024-06-10 19:19",
        "CurrentStep": 1,
        "Relevant": [
            "提交人",
            "张三",
            "李四"
        ]
    },
    "status": "已提交"
}

查看钉钉通知

到此我们就可以获取到下一次审批所需的body内容了

代码语言:javascript
复制
{
    "work_id":  {{.Order.WorkId}},
    "flag":  {{.Order.CurrentStep}},
    "tp": "agree",
    "source_id": {.Order.SourceId}},
}

总结

到此我们就大致说明了一下如何使用其他媒介进行工单审批,当然这里的案例没有写完,这仅是一个思路的分享,更多的还是需要写点代码来实现的哦。等有时间再分享完整的案例。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云原生运维圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景概述
  • 大致流程
  • 简单说明
    • 获取审批接口
      • 获取审批数据
        • 问题
      • 查看提交工单获取到数据
      • 总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档