背景概述
上篇内容我们大致说明了一下Yearning如何集成外部工单通知,使其解耦支持更多自定义通知渠道。前几天有小伙伴提起如何集成飞书在线审批呢,当然飞书也好,钉钉也好实现思路都是一样的。因此我们这里简单的说明一下如何实现钉钉在线审批思路。
大致流程
- 获取审批接口
- 获取审批数据
- 发送审批请求
简单说明
获取审批接口
/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)
}
}
代码语言:javascript复制❝顾名思义,每个case我们就不解释了,这里主要是看一下state
// 工单审批
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)
}
}
代码语言:javascript复制❝这里我们看一下agree,即是同意。
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}},
}
总结
到此我们就大致说明了一下如何使用其他媒介进行工单审批,当然这里的案例没有写完,这仅是一个思路的分享,更多的还是需要写点代码来实现的哦。等有时间再分享完整的案例。