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

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Current »

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