钉钉统计部门个人请假次数go

news/2024/12/31 7:26:24/

前言

最近小组需要统计部门各种请假次数,写了一个方法,第一次实战中用到递归函数,简单记录一下。

效果展示

在这里插入图片描述

这些数据不需要返回json,这里这样是为了方便测试。可以通过这些数据完成其它的操作。

功能实现

钉钉服务端调试工具API Explorer

在这里插入图片描述

感兴趣的可以在接口里面详细看一下参数,这里就不一 一解释了

定义model

请求参数

package modeltype RequestDingLeave struct {UseridList string `json:"userid_list"` // 待查询用户的ID列表,每次最多100个。StartTime  int    `json:"start_time"`  // 开始时间 ,Unix时间戳,支持最多180天的查询。EndTime    int    `json:"end_time"`    // 结束时间,Unix时间戳,支持最多180天的查询。Offset     int    `json:"offset"`      // 支持分页查询,与size参数同时设置时才生效,此参数代表偏移量,偏移量从0开始。Size       int    `json:"size"`        // 支持分页查询,与offset参数同时设置时才生效,此参数代表分页大小,最大20。
}

响应参数

package model// DingLeaveStatus 请假状态
type DingLeaveStatus struct {StartTime       int64  `json:"start_time"`DurationPercent int    `json:"duration_percent"`EndTime         int64  `json:"end_time"`LeaveCode       string `json:"leave_code"` // 请假类型 个人事假:d4edf257-e581-45f9-b9b9-35755b598952  非个人事假:baf811bc-3daa-4988-9604-d68ec1edaf50  病假:a7ffa2e6-872a-498d-aca7-4554c56fbb52DurationUnit    string `json:"duration_unit"`UserID          string `json:"userid"`
}// DingLeaveResult 请假列表
type DingLeaveResult struct {LeaveStatus *[]DingLeaveStatus `json:"leave_status"`HasMore     bool               `json:"has_more"` // 是否有更多数据
}// DingResponse 钉钉响应
type DingResponse struct {ErrCode   int             `json:"errcode"`Result    DingLeaveResult `json:"result"`Success   bool            `json:"success"`ErrMsg    string          `json:"errmsg"`RequestID string          `json:"request_id"`
}type DingUser struct {Id   string `json:"id"`Name string `json:"name"`Type map[string]int
}
功能逻辑

我这里只是想简单的实现一下功能,并没有按照严格标准的mvc分层,还请见谅

package controllerimport ("bytes""encoding/json""fmt""github.com/gin-gonic/gin""leave/model""net/http""time"
)var tmp = map[string]string{"d4edf257-e581-45f9-b9b9-35755b598952": "个人事假", "a7ffa2e6-872a-498d-aca7-4554c56fbb52": "病假", "baf811bc-3daa-4988-9604-d68ec1edaf50": "非个人事假"} // code与请假类型对应// GetDepartmentLeaveStatus 统计部门请假状态
func GetDepartmentLeaveStatus(c *gin.Context) {userList := "323832232226246897,01320463195324064909,02280849645326263552,01546916272226288917"	// 模拟数据leave := model.RequestDingLeave{UseridList: userList,StartTime:  1698624000000,	EndTime:    int(time.Now().UnixMilli()), // 拿到当前的时间戳Offset:     0,Size:       2,}res := []model.DingLeaveStatus{}res, err := GetLeaveStatus(leave, res)if err != nil {return}statistics := map[string]model.DingUser{}for _, v := range res {_, exist := statistics[v.UserID]if !exist {statistics[v.UserID] = model.DingUser{Type: map[string]int{}}}statistics[v.UserID].Type[tmp[v.LeaveCode]]++}c.JSON(http.StatusOK, statistics)fmt.Println(int(time.Now().Weekday()))return
}// GetLeaveStatus 获取请假状态
func GetLeaveStatus(leave model.RequestDingLeave, res []model.DingLeaveStatus) ([]model.DingLeaveStatus, error) {// 将json数据编码为字节数组var send func(leave model.RequestDingLeave) error// 切片作为函数参数传递时为值传递,如果每次传入新的切片需要增加返回值接收,这里直接使用的传入的res作为变量并返回send = func(leave model.RequestDingLeave) error {jsonLeave, err := json.Marshal(leave)if err != nil {fmt.Println("json.Marshal(leave) failed:", err)return err}url := fmt.Sprintf("https://oapi.dingtalk.com/topapi/attendance/getleavestatus?%s", "access_token=企业token") // access_token 填企业tokenbuffer := bytes.NewBuffer(jsonLeave)response, err := http.Post(url, "application/json", buffer)if err != nil {fmt.Println("http.Post(\"https://oapi.dingtalk.com/topapi/attendance/getleavestatus\", \"application/json\", buffer) failed:", err)return err}var dingResp model.DingResponseerr = json.NewDecoder(response.Body).Decode(&dingResp)	// 将响应的json绑定到dingResp中if err != nil {return err}res = append(res, *dingResp.Result.LeaveStatus...)if dingResp.Result.HasMore {	// 如果有更多的记录,再次请求并添加到切片后面leave.Offset += leave.Sizesend(leave)					// 递归}return nil}err := send(leave)return res, err
}
其他
package routerimport ("github.com/gin-gonic/gin""leave/controller"
)func SetupRouter() *gin.Engine {r := gin.Default()r.GET("/test", controller.GetDepartmentLeaveStatus)return r
}
package mainimport "leave/router"func main() {router := router.SetupRouter()router.Run()
}

http://www.ppmy.cn/news/1211988.html

相关文章

【Docker】Web应用通过jar打包成WAR文件

把当前目录下的所有文件打包成game.war jar -cvfM0 game.war ./ -c 创建war包 -v 显示过程信息 -f -M -0 这个是阿拉伯数字,只打包不压缩的意思 解压game.war jar -xvf game.war 解压到当前目录 环境 RedHat Linux 9 VWWare 8.0 SSH 3.2.9 Putty 0.62 问题…

实战Leetcode(三)

Practice makes perfect! 实战一: 带环问题其实我们小学时就接触过,就比如在操场上比赛跑步的追击问题,这里也是一样,如果我们定义两个指针,一个快指针,一个慢指针,快指针走的快&…

Mysql数据库 14.SQL语言 视图

一、视图的概念 视图:就是由数据库中一张或多张表根据特定的条件查询出的数据狗造成的虚拟表 二、视图的作用 安全性,简单性 三、视图的语法 语法 create view 视图表 as select_statement; 代码实现 #创建视图 将查询结果创建称为视图&#x…

短视频矩阵系统源码--剪辑/矩阵/分发/直播

短视频矩阵系统源码--剪辑/矩阵/分发/直播 短视频矩阵系统开发,首先对服务器要求: 源码所需服务器配置 1、规格:最低8核16G 2、硬盘:系统盘40-100G,数据盘不低于100G 3、带宽:10M 4、系统:…

ArcGIS:如何迭代Shp文件所有要素并分别导出为Shp文件?

01 前言 尝试用IDL实现,奈何又涉及新的类IDLffShape,觉得实在没有必要学习的必要,毕竟不是搞开发,只是做做数据处理,没必要拿IDL不擅长的且底层的东西自己造轮子。 这里想到使用Python去解决,gdal太久没用…

openEuler编译安装nmon性能监控工具及可视化分析工具

ln 介绍 nmon(short for Nigel’s Monitor)是一个性能分析工具,由蓝色巨人IBM开发,最早用于自家操作系统UNIX,AIX (Advanced Interactive eXecutive)。现在也能用在Linux上。它可以显示系统的…

Jenkins 质量扫描

代码质量扫描工具(SonarQube) 质量评审 SonarQube有四个关键组件 ◼ SonarQube Server运行有三个组件 ◆ Web Server:UI ◆ Search Server:为UI提供搜索功能,基于ElasticSearch ◆ Compute Engine Server&#xff1a…

Java中String的概念与应用

引言: 在Java编程语言中,String(字符串)是一个非常重要且广泛使用的类。String类代表不可变的字符序列,它提供了一系列方法来操作字符串。本文将详细描述Java中String的概念、特性以及在实际开发中的应用。 一、String…