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()
}
}