领导急了,那该如何在钉钉群中推送团队的过期任务?

前言

最近部门要求大家下班前挪动jira中敏捷迭代的任务,但是团队中总有些同事忘记,然后第二天早上被通报批评,领导后面直接发话这些同事有可能成为年底的淘汰对象。我在想能否通过程序每天定时获取jira中的过期任务,然后通知到敏捷团队钉钉群中呢,这样团队成员就不会忘记了。

Jira任务获取功能

jira是一个应用广发的项目管理工具,我们公司也使用这个工具去管理需求、任务、bug等。那么通过程序如何获取jira中的任务、bug信息呢?

  1. 引入 jira-client依赖

我这边使用了一个开源的依赖包jira-client, maven坐标如下:

xml 复制代码
 <dependency>
    <groupId>net.rcarz</groupId>
    <artifactId>jira-client</artifactId>
    <version>0.5</version>
    <scope>compile</scope>
</dependency>

github地址:https://github.com/bobcarroll/jira-client

  1. 创建 JiraClient的Bean
java 复制代码
@Configuration
@EnableConfigurationProperties({JiraAuthProperties.class, DingTalkProperties.class})
public class JiraConfig {

    @Autowired
    private JiraAuthProperties jiraAuthProperties;

    /**
     * jira client的bean
     * @return
     */
    @Bean
    public JiraClient createJiraClient() {
        BasicCredentials creds = new BasicCredentials(jiraAuthProperties.getUsername(), jiraAuthProperties.getPassword());
        JiraClient jiraClient = new JiraClient(jiraAuthProperties.getUrl(), creds);
        return jiraClient;
    }

}
  • BasicCredentials对象中传入jira账号和密码
  • 根据jira的地址和认证信息创建JiraClient
  1. 获取团队成员过期的任务和bug
java 复制代码
/**
 * 获取所有过期的任务
 *
 * @param endDate 截止时间
 * @return
 * @throws JiraException
 */
public List<Issue> getAllExpireTasks(Date endDate) throws JiraException {
    List<String> allUserNames = EmployeeManager.getAllUserNames();
    String endDateStr = DateUtil.format(endDate, DATE_FORMATE);
    String userTasksJql = getUserExpireTasksJql(allUserNames, endDateStr);
    Issue.SearchResult searchResult = jiraClient.searchIssues(userTasksJql, 100000);
    return searchResult.issues;
}

/**
 * 获取用户过期的查询语句
 *
 * @param users
 * @param dueDateStr
 * @return
 */
public static String getUserExpireTasksJql(List<String> users, String dueDateStr) {
    String jqlTmpl = "resolution = Unresolved and due <= {} AND assignee in ({}) ORDER BY priority DESC";
    return StrUtil.format(jqlTmpl, dueDateStr, CollUtil.join(users, ","));
}
  • getUserExpireTasksJql() 方法中拼接过期任务的jira查询语句
  • 传入对应的查询语句,调用jiraClient.searchIssues()从jira服务端中查询对应的jira任务和bug等

钉钉通知功能

我们现在已经从jira服务中获取到了哪些用户的任务过期了,那么该如何推送到钉钉群中呢?其实钉钉就开放了这样的能力,详细可以参考:https://open.dingtalk.com/document/robots/custom-robot-access

  1. 钉钉群中添加机器人

钉钉群设置中添加机器人,如下图所示,保存。

  1. 编写推送代码
  • 钉钉配置处理
less 复制代码
@ConfigurationProperties(prefix = "dingtalk.auth")
@Data
public class DingTalkProperties {

    private String url;

    private String secretKey;

}
  • 根据webhook和加签生成钉钉最终的推送地址
java 复制代码
private String genDingTalkUrl() {
    try {
        Long timestamp = System.currentTimeMillis();
        String stringToSign = timestamp + "\n" + dingTalkProperties.getSecretKey();
        Mac mac = null;
        mac = Mac.getInstance("HmacSHA256");
        mac.init(new SecretKeySpec(dingTalkProperties.getSecretKey().getBytes("UTF-8"), "HmacSHA256"));
        byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
        String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
        String urlTmpl = dingTalkProperties.getUrl() + "&timestamp={}&sign={}";
        return StrUtil.format(urlTmpl, timestamp, sign);
    } catch (Exception e) {
        log.error("getDingTalkUrl error", e);
    }
    return null;
}
  • markdown的格式推送内容
java 复制代码
/**
 * 发送markdown内容
 * @param title 标题
 * @param content 内容
 * @param mobiles 手机号,需要@的人
 */
public void sendMarkDown(String title, String content, List<String> mobiles) {
    String url = genDingTalkUrl();
    DingTalkClient client = new DefaultDingTalkClient(url);
    OapiRobotSendRequest req = new OapiRobotSendRequest();
    req.setMsgtype("markdown");
    OapiRobotSendRequest.Markdown markdown = new OapiRobotSendRequest.Markdown();
    markdown.setTitle(title);
    markdown.setText(content);
    req.setMarkdown(markdown);
    OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
    at.setAtMobiles(mobiles);
    req.setAt(at);
    try {
        OapiRobotSendResponse rsp = client.execute(req, "");
        if(!rsp.isSuccess()) {
            log.error("rsp error, errorCode: [{}], errorMsg: [{}]", rsp.getErrcode(), rsp.getErrmsg());
        };

    } catch (ApiException e) {
        log.error("sendText error", e);
    }
}

结果展示

现在我们已经完成了最核心的获取钉钉任务以及推送的功能,最后通过springboot的调度,每天临近下班,6点的时候每隔5分钟提醒大家要去处理jira中的过期任务。

总结

本文和大家简单分享了一种通过钉钉推送jira中过期任务的方法,其实我们还可以用它做更多的事情,比如统计缺陷数量,统计大家的周报等等。

本案例中的代码地址:https://github.com/alvinlkk/jira-job

欢迎关注个人公众号【JAVA旭阳】交流学习!

相关推荐
崎岖Qiu9 分钟前
【设计模式笔记06】:单一职责原则
java·笔记·设计模式·单一职责原则
Hello.Reader15 分钟前
Flink ExecutionConfig 实战并行度、序列化、对象重用与全局参数
java·大数据·flink
熊小猿1 小时前
在 Spring Boot 项目中使用分页插件的两种常见方式
java·spring boot·后端
paopaokaka_luck1 小时前
基于SpringBoot+Vue的助农扶贫平台(AI问答、WebSocket实时聊天、快递物流API、协同过滤算法、Echarts图形化分析、分享链接到微博)
java·vue.js·spring boot·后端·websocket·spring
老华带你飞1 小时前
机器人信息|基于Springboot的机器人门户展示系统设计与实现(源码+数据库+文档)
java·数据库·spring boot·机器人·论文·毕设·机器人门户展示系统
notion20251 小时前
Adobe Lightroom Classic下载与安装教程(附安装包) 2025最新版详细图文安装教程
java·数据库·其他·adobe
rengang662 小时前
351-Spring AI Alibaba Dashscope 多模型示例
java·人工智能·spring·多模态·spring ai·ai应用编程
小蒜学长3 小时前
springboot酒店客房管理系统设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
lang201509283 小时前
Spring MVC配置全解析
java·spring·mvc
せいしゅん青春之我4 小时前
【JavaEE初阶】TCP核心机制10——异常情况的处理
java·网络·笔记·网络协议·tcp/ip·java-ee