12

我正在使用 PHP 和 Jira REST API 编写一个应用程序,该应用程序需要生成一个特定时间段的报告,其中包含一个人在特定项目上花费的小时数。

为此,我需要一个电话,它会给出这样的东西。

例如:For the period 01/01/2012 - 31/01/2012 give me the worklogs for project X.

到目前为止,我发现的方法是在开始日期之后获取更新的问题,并再次按期间过滤每个问题的工作日志。

有更好的选择吗?

4

4 回答 4

4

正如许多人所说,没有直接的方法。但是,如果您有效地缩小搜索空间,那还不错。以下 PHP 代码在我的设置中运行得非常快,但当然,您的里程可能会有所不同:

<?php
$server   = 'jira.myserver.com';
$fromDate = '2012-01-01';
$toDate   = '2012-01-31';
$project  = 'X';
$assignee = 'bob';

$username = 'my_name';
$password = 'my_password';

$curl = curl_init();
curl_setopt($curl, CURLOPT_USERPWD, "$username:$password");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);

# Give me up to 1000 search results with the Key, where
# assignee = $assignee  AND  project = $project
#  AND created < $toDate  AND  updated > $fromDate
#  AND timespent > 0
curl_setopt($curl, CURLOPT_URL, 
            "https://$server/rest/api/2/search?startIndex=0&jql=".
            "assignee+%3D+$assignee+and+project+%3D+$project+".
            "and+created+%3C+$toDate+and+updated+%3E+$fromDate+".
            "and+timespent+%3E+0&fields=key&maxResults=1000");

$issues = json_decode(curl_exec($curl), true);
foreach ($issues['issues'] as $issue) {
    $key = $issue['key'];
    # for each issue in result, give me the full worklog for that issue
    curl_setopt($curl, CURLOPT_URL,
                "https://$server/rest/api/2/issue/$key/worklog");

    $worklog = json_decode(curl_exec($curl), true);
    foreach ($worklog['worklogs'] as $entry) {
        $shortDate = substr($entry['started'], 0, 10);
        # keep a worklog entry on $key item,
        # iff within the search time period
        if ($shortDate >= $fromDate && $shortDate <= $toDate)
            $periodLog[$key][] = $entry;
    }
}
# Show Result:
#  echo json_encode($periodLog);
#  var_dump($periodLog);
?>
于 2015-01-08T19:35:45.547 回答
3

如果您找不到可以满足您要求的开箱即用功能,我可以考虑除您之外的其他三种解决方案:

  1. 直接查询数据库,这样您就可以使用一个查询来获取工作日志。确保不要直接插入/删除/更新数据库,而只是查询它。
  2. 使用诸如Jira Scripting SuiteBehaviors Plugin之类的东西来添加将工作日志写入磁盘某处的脚本。然后使用另一个应用程序从磁盘读取写入的信息并将其显示给用户。
  3. 使用速度插件
于 2012-10-14T11:11:13.257 回答
2

值得指出的是,Jira 查询有一个expand选项,允许您指定要附加到搜索的字段:

// Javascript
$jql = 'project = MyProject and updated > 2016-02-01 and updated < 2016-03-01';

// note this definition
$fields = 'key,summary,worklog';

$query = "https://{server}/rest/api/2/search?maxResults=100&fields={fields}&jql={jql}"
  .replace(/{server}/g,$server)
  .replace(/{jql}/g,encodeURIComponent($jql))
  .replace(/{fields}/g,$fields)
  ;

返回的 JSON 对象将是一个工单列表,每个工单将附加一组工作项(可能长度为零)。

Javascript 而不是 PHP,但同样的想法也成立:

function getJql(params){
    $.ajax({
        url: getJiraUrl() 
            + "/rest/api/2/search?startIndex=0&fields=worklog,assignee,status,key,summary&maxResults=1000&jql=" 
            + encodeURI(params.jql),
        success: function (resp) {
            resp.issues.forEach(function(issue) {
                issue.fields.worklog.worklogs.forEach(function(work){
                    alert(JSON.stringify(work));
                    db.AddWork(work);
                });
            });
        }
    });
}

发布在 GitLab:https ://gitlab.com/jefferey-cave/ProductivityBlockers/blob/5c4cb33276e8403443d4d766fc94ab2f92292da6/plugin-data-jira.js

于 2016-03-16T00:20:05.393 回答
0

我个人用于同类应用程序的方法是每周从 JIRA 获取所有记录,然后从存储它们的数据库中生成报告。

这样,如果发生重大 JIRA 崩溃,您也可以获得可用的数据。当 RAID 阵列烧毁并且大部分数据无法恢复时,我们公司在 OnDemand 实例中遇到了这样的问题。

于 2012-10-09T13:30:18.857 回答