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

前言

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

效果展示

在这里插入图片描述

这些数据不需要返回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.mzph.cn/news/143661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

短剧公众号系统:连接创作者与观众的桥梁

随着数字媒体的迅速发展,短剧公众号系统作为一种新型的内容传播方式,逐渐在社交媒体平台上崭露头角。它通过将创作者与观众紧密连接,为双方提供了丰富的内容与互动体验。本文将探讨短剧公众号系统的价值,以及如何通过这种系统连接…

Java主流分布式解决方案多场景设计与实战

Java的主流分布式解决方案的设计和实战涉及到多个场景,包括但不限于以下几点: 分布式缓存:在Java的分布式系统中,缓存是非常重要的一部分。常用的分布式缓存技术包括Redis、EhCache等。这些缓存技术可以用来提高系统的性能和响应…

多个Obj模型合并

MergeObj(合并Obj模型) 1 概述 由于项目原因,需要下载谷歌地图上的模型,关于谷歌模型下载的,见我的CSDN博客. 由于下载谷歌地图上的数据,会分多个模块下载。下载完成后,怎么合并,在…

【数据结构初阶】链表OJ

链表OJ 题目一:移除链表元素题目二:反转链表题目三:链表的中间节点题目四:链表中倒数第k个结点题目五:合并两个有序链表题目六:链表分割题目七:链表的回文结构题目八:相交链表题目九…

B2B企业如何打造独立站:从策略到实施的全面指南

随着数字化转型的加速,B2B企业越来越认识到独立站的重要性。然而,如何建设一个优秀的独立站,以及如何将独立站与企业的整体战略相结合,是许多企业面临的挑战。本文将详细探讨B2B企业如何从策略到实施打造一个成功的独立站。 一、…

Pytorch自动混合精度的计算:torch.cuda.amp.autocast

1 autocast介绍 1.1 什么是AMP? 默认情况下,大多数深度学习框架都采用32位浮点算法进行训练。2017年,NVIDIA研究了一种用于混合精度训练的方法,该方法在训练网络时将单精度(FP32)与半精度(FP16)结合在一起&#xff…

2656. K 个元素的最大和 --力扣 --JAVA

题目 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你需要执行以下操作 恰好 k 次,最大化你的得分: 从 nums 中选择一个元素 m 。 将选中的元素 m 从数组中删除。 将新元素 m 1 添加到数组中。 你的得分增加 m 。 请你返回执行以上操作恰好 k …

【外贸干货】收到只有一句话的询盘该怎么回复?

外贸业务员收到询盘无疑是开心的事情,但收到的询盘多了,才知道“套路”也更深了。今天,我们将通过几个实际的询盘案例,来重点说一说当遇到一些简单笼统的询盘,甚至是只有一句话的询盘时,应该怎么办&#xf…

共享台球室小程序系统的数据统计与分析功能

随着共享经济的繁荣发展,共享台球室作为一种新型的娱乐方式,越来越受到年轻人的喜爱。为了更好地满足用户需求和提高管理效率,我们设计了一款基于微信小程序的共享台球室预订与管理系统。该系统不仅具备基本的预订和管理功能,还集…

Alter database open fails with ORA-00600 kcratr_nab_less_than_odr

Alter database open fails with ORA-00600 kcratr_nab_less_than_odr (Doc ID 1296264.1)​编辑To Bottom APPLIES TO: Oracle Database - Enterprise Edition - Version 11.2.0.1 to 11.2.0.1 [Release 11.2] Oracle Database - Enterprise Edition - Version 12.1.0.1 to …

2023NOIP A层联测32 红楼 ~ Eastern Dream

题目大意 给定一个长度为 n n n的序列 a a a,有 m m m次操作,每次操作有两种类型: 1 x y k,对于所有满足 ( i − 1 ) m o d x ≤ y (i-1)\bmod x\leq y (i−1)modx≤y的 i i i,将 a i a_i ai​的值加上 k k k2 l r&a…

servlet 的XML Schema从哪边获取

servlet 6.0的规范定义: https://jakarta.ee/specifications/servlet/6.0/ 其中包含的三个XML Schema:web-app_6_0.xsd、web-common_6_0.xsd、web-fragment_6_0.xsd。但这个页面没有给出下载的链接地址。 正好我本机有Tomcat 10.1.15版本的源码&#…

vue3 中的ref、reactive的介绍

reactive: 当使用reactive()处理数据后,数据再次被使用时,就会进行依赖收集 当数据发生改变时,所有收集到的依赖进行对应的响应式操作(如:更新界面), 事实上,我们编写的d…

深入解析JavaScript中的变量作用域与声明提升

JS中的变量作用域 背景: ​ 之前做js逆向的时候,有一个网站很有意思,就是先出现对其赋值,但是后来的变量赋值没有对其发生修改,决定说一下js中的作用域问题. 全局作用域: ​ 全局作用域的变量可以在任何…

PDF自动打印

​ 最近接到用户提过来的需求,需要一个能够自动打印图纸的功能,经过几天的研究整出来个初版了的,分享出来给大家,希望能有帮助。 需求描述: ​ 生产车间现场每天都有大量的图纸需要打印,一个一个打印太慢了&#xff0…

什么是3D建模中的“高模”和“低模”?

3D建模中什么是高多边形和低多边形? 高多边形建模和低多边形建模之间的主要区别正如其名称所暗示的那样:您是否在模型中使用大量多边形或少量多边形。 然而,在决定每个模型的细节和多边形级别时,还需要考虑其他事项。最值得注意的…

一文解码语言模型:语言模型的原理、实战与评估

在本文中,我们深入探讨了语言模型的内部工作机制,从基础模型到大规模的变种,并分析了各种评价指标的优缺点。文章通过代码示例、算法细节和最新研究,提供了一份全面而深入的视角,旨在帮助读者更准确地理解和评估语言模…

NI USRP软件无线设备的特点

NI USRP软件无线设备 NI的USRP(Universal Software Radio Peripheral)设备是RF应用中使用的软件无线(SDR)。NI的USRP收发器可以在多个频段发送和接收RF信号,因此可用于通信工程教育和研究。通过与LabVIEW开发环境相结合,USRP可以实现使用无线信号验证无…

接口开放太麻烦?试试阿里云API网关吧

前言 我在多方合作时,系统间的交互是怎么做的?这篇文章中写过一些多方合作时接口的调用规则和例子,然而,接口开放所涉及的安全、权限、监控、流量控制等问题,可不是简简单单就可以解决的,这一般需要专业的…

使用pixy计算群体遗传学统计量

1 数据过滤 过滤参数:过滤掉次等位基因频率(minor allele frequency,MAF)低于0.05、哈达-温伯格平衡(Hardy– Weinberg equilibrium,HWE)对应的P值低于1e-10或杂合率(heterozygosit…