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

2024-06-17 14:32:36 浏览数 (2)

背景概述

上篇内容我们大致说明了一下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}},
}

总结

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

0 人点赞