Page tree
Skip to end of metadata
Go to start of metadata

https://mp.weixin.qq.com/s/X2_YNKzTVo2NjbdAk4OcVw

// API访问凭证端口
def endPoint = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal/"
// 飞书机器人应用凭证的App ID
def appID = "xxx"
// 飞书机器人应用凭证的App Secret
def appSecret = "yyy"
// 设置所要发送消息的Jira用户组列表
def userGroups = ["研发部", "质量部"]

def groupManager = ComponentAccessor.getGroupManager()
def userManager = ComponentAccessor.getUserManager()
def userPropertyManager = ComponentAccessor.userPropertyManager

users.each{user->
    if(user.isActive()){    
        appUser = userManager.getUserByKey(user.getKey())
        // 针对每个人的信息
        displayName = appUser.getDisplayName()
        userName = appUser.getUsername()
        larkUserOpenId = userPropertyManager.getPropertySet(userManager.getUserByName(userName)).getString(userPropertyKey)
        // API访问凭证URL
        urlString = endPoint + "?app_id=" + appID + "&app_secret=" + appSecret
        larkURL = new URL(urlString)
        // 获取API访问凭证
        accessToken = result['tenant_access_token'].toString()
        // 发送消息API
        urlString = "https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=open_id"
        larkURL = new URL(urlString)
        HttpURLConnection httpConn = (HttpURLConnection) larkURL.openConnection()
        // 设置是否向 HttpUrlConnection 输出,对于post请求,参数要放在 http 正文内,因此需要设为true,默认为false
        httpConn.connect()

        // ***动态获取每个成员本周数据*** //
        searchService = ComponentAccessor.getComponent(SearchService.class)
        // 1.获取每个成员本周工时数据${totalLoggedWork}
        // 2.获取每个成员本周投入项目个数${numberofProjects}
        jqlSearch = "worklogAuthor = \"" + userName + "\" AND (worklogDate >= startOfWeek() AND worklogDate <= endOfWeek()) ORDER BY project"
        query = queryParser.parseQuery(jqlSearch)
        search = searchService.search(loggedInUser, query, PagerFilter.getUnlimitedFilter())

        worklogManager = ComponentAccessor.getWorklogManager()
        search.results.each{retrievedIssue->
            worklogs = worklogManager.getByIssue(retrievedIssue)

            // 获取项目Key,去重计算参与的项目个数
            if (projectKey != retrievedIssue.projectObject.key) {
                numberofProjects += 1
            }
            worklogs.each{workLog->
                // 默认毫秒,除以3600转换成单位:小时
                loggedTime = workLog.getTimeSpent()/3600?:0  
                // 工作日志记录中登记者为当前用户,且登记的开始日期为本周内时,累加本周合计总工时
                if (workLog.getAuthorObject().getDisplayName() == displayName  && workLog.getStartDate() >= startofWeek && workLog.getStartDate() <= endofWeek){
                    totalLoggedWork += loggedTime
                }
            }
        }      
        // 本周总投入工作量(小时)保留一位小数
        totalLoggedWork = totalLoggedWork.round(1)


        // 飞书消息核心内容,来自:https://open.feishu.cn/tool/cardbuilder?from=howtoguide
        contentBody = "{\"config\":{\"wide_screen_mode\":true},\"header\":{\"template\":\"red\",\"title\":{\"content\":\"项目一周小结\",\"tag\":\"plain_text\"}},\"i18n_elements\":{\"zh_cn\":[{\"alt\":{\"content\":\"\",\"tag\":\"plain_text\"},\"img_key\":\"img_v2_df1bbd76-f942-41d4-8ca6-538c0a0fcb6g\",\"tag\":\"img\"},{\"tag\":\"markdown\",\"content\":\"${displayName},感谢您一周辛苦工作\\n共投入 **${totalLoggedWork}** 小时\\n工作在 **${numberofProjects}** 个Jira项目上\\n完成了 **${numberofTasks}** 个任务\\n修复了 **${numberofBugs}** 个缺陷\\n目前有 **${numberofOverdueTasks}** 个任务已逾期\\n请记得及时处理呦~\\n[详见Jira系统仪表盘>>](http://hangzhouace.atlassian.net)\\n\\n**一个高度,一个境界;一个角度,一个世界。祝周末愉快!**\"}]}}"

        // 构建飞书消息HTTP POST请求体
        builder = new JsonBuilder([content: contentBody,
                                      msg_type: messageType,
                                      receive_id: larkUserOpenId])

        OutputStream outputStream = httpConn.getOutputStream()   
        outputStream.write(builder.toString().getBytes("utf-8"))
        outputStream.flush()
        outputStream.close()

        // 从连接中读取响应信息
        if (httpConn.getResponseCode() != 200 && httpConn.getResponseCode() != 201) {
            sb.append( "消息推送失败响应代码:" + httpConn.getResponseCode() + " || 响应消息体:" + httpConn.getResponseMessage())
        } 

        //断开HttpURL连接,释放资源
        httpConn.disconnect()
    }
}
  • No labels