forked from Gitlink/forgeplus
129 lines
5.7 KiB
Ruby
129 lines
5.7 KiB
Ruby
class Api::Pm::SprintIssuesController < Api::Pm::BaseController
|
|
|
|
before_action :require_login, except: [:index]
|
|
|
|
def index
|
|
@issues = Api::Pm::SprintIssues::ListService.call(query_params, current_user)
|
|
@issues = kaminari_paginate(@issues)
|
|
render 'api/v1/issues/index'
|
|
end
|
|
|
|
def burndown_charts
|
|
return tip_exception '参数错误' if params[:pm_sprint_id].blank? || params[:start_time].blank? || params[:end_time].blank?
|
|
@issues = Issue.where(pm_sprint_id: params[:pm_sprint_id])
|
|
start_time = Date.parse params[:start_time]
|
|
end_time = Date.parse params[:end_time]
|
|
time_count = (end_time - start_time).to_i + 1 # 计算间隔时间 加上最后一天
|
|
data = []
|
|
curren_issues = @issues.group(:pm_issue_type, :status_id, :due_date).count
|
|
total_count = @issues.count
|
|
cardinality = (total_count.zero? || time_count.zero?) ? 0 : total_count.to_f / time_count.to_f
|
|
# cardinality = BigDecimal.new(total_count) / BigDecimal.new(time_count)
|
|
time_count.times do |x|
|
|
e_time = start_time + x
|
|
completed = curren_issues[[1, 2, e_time]].to_i + curren_issues[[1, 7, e_time]].to_i + curren_issues[[1, 8, e_time]].to_i + curren_issues[[2, 3, e_time]].to_i + curren_issues[[2, 5, e_time]].to_i + curren_issues[[2, 6, e_time]].to_i + curren_issues[[3, 3, e_time]].to_i + curren_issues[[3, 5, e_time]].to_i + curren_issues[[3, 6, e_time]].to_i
|
|
total_count = total_count - completed
|
|
data << { time: e_time, undone: total_count, completed: completed, base_number: (cardinality * (time_count - x - 1)).to_f.round(2) }
|
|
end
|
|
render_ok(data: data)
|
|
end
|
|
|
|
def statistics
|
|
pm_sprint_ids = params[:pm_sprint_ids].split(",") rescue []
|
|
return tip_exception '参数错误' if pm_sprint_ids.blank?
|
|
@issues = Issue.where(pm_sprint_id: pm_sprint_ids)
|
|
data = {}
|
|
# requirement 1 task 2 bug 3
|
|
@issues_count = @issues.group(:pm_sprint_id).count
|
|
@issues_type_count = @issues.group(:pm_sprint_id, :status_id).count
|
|
@issues_pm_type_count = @issues.group(:pm_sprint_id, :pm_issue_type).count
|
|
@issues_hour_count = @issues.group(:pm_sprint_id).sum(:time_scale)
|
|
@issues_hour_type_count = @issues.group(:pm_sprint_id, :status_id).sum(:time_scale)
|
|
@issues_hour_pm_type_count = @issues.group(:pm_sprint_id, :pm_issue_type).sum(:time_scale)
|
|
@issues_status_pm_type_count = @issues.group(:pm_sprint_id, :pm_issue_type, :status_id).count
|
|
@issues_hour_status_pm_type_count = @issues.group(:pm_sprint_id, :pm_issue_type, :status_id).sum(:time_scale)
|
|
pm_sprint_ids.map(&:to_i).map do |sprint_id|
|
|
# count_closed 工作项已完成/已关闭数量,需排除已修复的缺陷数量
|
|
count_closed = 0
|
|
# hour_closed 已完成/已关闭 预估工时之和,需排除已修复的缺陷预估工时
|
|
hour_closed = 0
|
|
requirement_open = @issues_pm_type_count[[sprint_id, 1]].to_i
|
|
task_open = @issues_pm_type_count[[sprint_id, 2]].to_i
|
|
bug_open = @issues_pm_type_count[[sprint_id, 3]].to_i
|
|
[[1,[2,7,8]], [2, [3,5,6]], [3, [3,5,6]]].each do |i|
|
|
i_count_closed = 0
|
|
count_closed += @issues_status_pm_type_count[[sprint_id, i[0], i[1][0]]].to_i
|
|
i_count_closed += @issues_status_pm_type_count[[sprint_id, i[0], i[1][0]]].to_i
|
|
count_closed += @issues_status_pm_type_count[[sprint_id, i[0], i[1][1]]].to_i
|
|
i_count_closed += @issues_status_pm_type_count[[sprint_id, i[0], i[1][1]]].to_i
|
|
count_closed += @issues_status_pm_type_count[[sprint_id, i[0], i[1][2]]].to_i
|
|
i_count_closed += @issues_status_pm_type_count[[sprint_id, i[0], i[1][2]]].to_i
|
|
hour_closed += @issues_hour_status_pm_type_count[[sprint_id, i[0], i[1][0]]].to_f
|
|
hour_closed += @issues_hour_status_pm_type_count[[sprint_id, i[0], i[1][1]]].to_f
|
|
hour_closed += @issues_hour_status_pm_type_count[[sprint_id, i[0], i[1][2]]].to_f
|
|
requirement_open -= i_count_closed if i[0] == 1
|
|
task_open -= i_count_closed if i[0] == 2
|
|
bug_open -= i_count_closed if i[0] == 3
|
|
end
|
|
|
|
data[sprint_id] = {
|
|
count_total: @issues_count[sprint_id] || 0,
|
|
count_closed: count_closed || 0,
|
|
hour_total: @issues_hour_count[sprint_id].to_f || 0,
|
|
hour_closed: hour_closed || 0,
|
|
requirement: @issues_pm_type_count[[sprint_id, 1]] || 0,
|
|
task: @issues_pm_type_count[[sprint_id, 2]] || 0,
|
|
bug: @issues_pm_type_count[[sprint_id, 3]] || 0,
|
|
requirement_hour: @issues_hour_pm_type_count[[sprint_id, 1]].to_i || 0,
|
|
task_hour: @issues_hour_pm_type_count[[sprint_id, 2]].to_i || 0,
|
|
bug_hour: @issues_hour_pm_type_count[[sprint_id, 3]].to_i || 0,
|
|
requirement_open: requirement_open,
|
|
task_open: task_open,
|
|
bug_open: bug_open
|
|
}
|
|
end
|
|
render_ok(data: data)
|
|
end
|
|
|
|
before_action :load_uncomplete_issues, only: [:complete]
|
|
|
|
def complete
|
|
begin
|
|
case complete_params[:complete_type].to_i
|
|
when 1
|
|
@issues.update_all(status_id: 5, due_date: Time.now)
|
|
when 2
|
|
@issues.update_all(pm_sprint_id: 0)
|
|
when 3
|
|
@issues.update_all(pm_sprint_id: complete_params[:target_pm_project_sprint_id])
|
|
end
|
|
render_ok
|
|
rescue => e
|
|
render_error(e.message)
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def load_uncomplete_issues
|
|
@issues = Issue.where(pm_sprint_id: complete_params[:pm_project_sprint_id]).where.not(status_id: 5)
|
|
end
|
|
|
|
def complete_params
|
|
params.permit(:pm_project_sprint_id, :complete_type, :target_pm_project_sprint_id)
|
|
end
|
|
|
|
def query_params
|
|
params.permit(
|
|
:category,
|
|
:pm_project_id,
|
|
:pm_issue_type, # 需求1 任务2 缺陷3
|
|
:assigner_id,
|
|
:priority_id,
|
|
:status_id,
|
|
:keyword, :status_ids, :pm_issue_types,
|
|
:sort_by, :sort_direction
|
|
)
|
|
end
|
|
|
|
end |