diff --git a/app/assets/javascripts/pm/issues.js b/app/assets/javascripts/pm/issues.js new file mode 100644 index 000000000..dee720fac --- /dev/null +++ b/app/assets/javascripts/pm/issues.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/javascripts/pm/journals.js b/app/assets/javascripts/pm/journals.js new file mode 100644 index 000000000..dee720fac --- /dev/null +++ b/app/assets/javascripts/pm/journals.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/stylesheets/pm/issues.scss b/app/assets/stylesheets/pm/issues.scss new file mode 100644 index 000000000..cdf9fbc43 --- /dev/null +++ b/app/assets/stylesheets/pm/issues.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the pm/issues controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/pm/journals.scss b/app/assets/stylesheets/pm/journals.scss new file mode 100644 index 000000000..45dbf18b4 --- /dev/null +++ b/app/assets/stylesheets/pm/journals.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the pm/journals controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/api/pm/issues_controller.rb b/app/controllers/api/pm/issues_controller.rb new file mode 100644 index 000000000..9e9bbde2d --- /dev/null +++ b/app/controllers/api/pm/issues_controller.rb @@ -0,0 +1,79 @@ +class Api::Pm::IssuesController < ApplicationController + before_action :require_login, except: [:index] + before_action :load_issue, only: [:show, :children, :update, :destroy] + def index + @project = Project.find_by_id(params[:project_id]) || Project.new(id: 0, user_id: 0, name: 'pm_mm', identifier: 'pm_mm') + @object_result = Api::V1::Issues::ListService.call(@project, query_params, current_user) + @total_issues_count = @object_result[:total_issues_count] + @opened_issues_count = @object_result[:opened_issues_count] + @closed_issues_count = @object_result[:closed_issues_count] + if params[:only_name].present? + @issues = kaminary_select_paginate( + @object_result[:data].select(:id, :subject, :project_issues_index, :updated_on, :created_on)) + else + @issues = kaminari_paginate(@object_result[:data]) + end + render "api/v1/issues/index" + end + + def show + @issue.associate_attachment_container + render "api/v1/issues/show" + end + + def create + project = Project.find_by_id(params[:project_id]) || Project.new(id: 0, user_id: 0, name: 'pm_mm', identifier: 'pm_mm') + @object_result = Api::V1::Issues::CreateService.call(project, issue_params, current_user) + render "api/v1/issues/create" + end + + def update + @object_result = Api::V1::Issues::UpdateService.call(@project, @issue, issue_params, current_user) + end + + def destroy + @object_result = Api::V1::Issues::DeleteService.call(@project, @issue, current_user) + if @object_result + render_ok + else + render_error('删除疑修失败!') + end + end + private + def load_issue + @project = Project.new(id: params[:project_id], user_id: 0, name: 'pm_mm', identifier: 'pm_mm') + @issue = @project.issues.issue_issue.where(pm_project_id: params[:pm_project_id], pm_sprint_id:params[:pm_sprint_id]).find_by_id(params[:id]) + if @issue.blank? + render_not_found("疑修不存在!") + end + end + + def query_params + params.permit( + :only_name, + :category, + :participant_category, + :keyword, :author_id, + :milestone_id, :assigner_id, + :status_id, + :begin_date, :end_date, + :sort_by, :sort_direction,:parent_id, + :issue_tag_ids, :pm_project_id, :pm_sprint_id, :pm_issue_type + ) + end + + + + def issue_params + params.permit( + :status_id, :priority_id, :milestone_id, + :branch_name, :start_date, :due_date, + :subject, :description, :blockchain_token_num, + :pm_project_id, :pm_sprint_id, :pm_issue_type, :parent_id, + issue_tag_ids: [], + assigner_ids: [], + attachment_ids: [], + receivers_login: [] + ) + end +end diff --git a/app/controllers/pm/issues_controller.rb b/app/controllers/pm/issues_controller.rb new file mode 100644 index 000000000..ec2370cdf --- /dev/null +++ b/app/controllers/pm/issues_controller.rb @@ -0,0 +1,37 @@ +class Pm::IssuesController < ApplicationController + before_action :require_login, except: [:index] + + def index + @project = Project.find_by_id(params[:project_id]) || Project.new(id: 0, user_id: 0, name: 'pm_mm', identifier: 'pm_mm') + @object_result = Api::V1::Issues::ListService.call(@project, query_params, current_user) + @total_issues_count = @object_result[:total_issues_count] + @opened_issues_count = @object_result[:opened_issues_count] + @closed_issues_count = @object_result[:closed_issues_count] + if params[:only_name].present? + @issues = kaminary_select_paginate( + @object_result[:data].select(:id, :subject, :project_issues_index, :updated_on, :created_on)) + else + @issues = kaminari_paginate(@object_result[:data]) + end + end + + def create + project = Project.find_by_id(params[:project_id]) || Project.new(id: 0, user_id: 0, name: 'pm_mm', identifier: 'pm_mm') + @object_result = Api::V1::Issues::CreateService.call(project, issue_params, current_user) + end + + private + + def issue_params + params.permit( + :status_id, :priority_id, :milestone_id, + :branch_name, :start_date, :due_date, + :subject, :description, :blockchain_token_num, + :pm_project_id, :pm_sprint_id, :pm_issue_type, + issue_tag_ids: [], + assigner_ids: [], + attachment_ids: [], + receivers_login: [] + ) + end +end diff --git a/app/helpers/pm/issues_helper.rb b/app/helpers/pm/issues_helper.rb new file mode 100644 index 000000000..79cd6dd3e --- /dev/null +++ b/app/helpers/pm/issues_helper.rb @@ -0,0 +1,2 @@ +module Pm::IssuesHelper +end diff --git a/app/helpers/pm/journals_helper.rb b/app/helpers/pm/journals_helper.rb new file mode 100644 index 000000000..e1a99e5ee --- /dev/null +++ b/app/helpers/pm/journals_helper.rb @@ -0,0 +1,2 @@ +module Pm::JournalsHelper +end diff --git a/app/models/issue.rb b/app/models/issue.rb index a5fee95fb..6325a327f 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -36,6 +36,7 @@ # blockchain_token_num :integer # pm_project_id :integer # pm_sprint_id :integer +# pm_issue_type :integer # # Indexes # diff --git a/app/services/api/v1/issues/concerns/checkable.rb b/app/services/api/v1/issues/concerns/checkable.rb index b19c245ed..d3cc4741d 100644 --- a/app/services/api/v1/issues/concerns/checkable.rb +++ b/app/services/api/v1/issues/concerns/checkable.rb @@ -47,6 +47,7 @@ module Api::V1::Issues::Concerns::Checkable end def check_blockchain_token_num(user_id, project_id, blockchain_token_num, now_blockchain_token_num=0) + return if project_id.zero? left_blockchain_token_num = Blockchain::BalanceQueryOneProject.call({"user_id": user_id, "project_id": project_id}) rescue 0 raise ApplicationService::Error, "用户Token不足。" if blockchain_token_num.to_i > (left_blockchain_token_num+now_blockchain_token_num).to_i end diff --git a/app/services/api/v1/issues/create_service.rb b/app/services/api/v1/issues/create_service.rb index fc81f4dde..64a42b20d 100644 --- a/app/services/api/v1/issues/create_service.rb +++ b/app/services/api/v1/issues/create_service.rb @@ -31,9 +31,11 @@ class Api::V1::Issues::CreateService < ApplicationService @receivers_login = params[:receivers_login] @pm_project_id = params[:pm_project_id] @pm_sprint_id = params[:pm_sprint_id] + @pm_issue_type = params[:pm_issue_type] + @parent_id = params[:parent_id] end - def call + def call raise Error, errors.full_messages.join(", ") unless valid? ActiveRecord::Base.transaction do check_issue_status(status_id) @@ -48,7 +50,6 @@ class Api::V1::Issues::CreateService < ApplicationService load_attachments(attachment_ids) unless attachment_ids.blank? load_issue_tags(issue_tag_ids) unless issue_tag_ids.blank? load_atme_receivers(receivers_login) unless receivers_login.blank? - try_lock("Api::V1::Issues::CreateService:#{project.id}") # 开始写数据,加锁 @created_issue = Issue.new(issue_attributes) build_author_participants @@ -61,6 +62,8 @@ class Api::V1::Issues::CreateService < ApplicationService @created_issue.issue_tags = @issue_tags unless issue_tag_ids.blank? @created_issue.pm_project_id = @pm_project_id @created_issue.pm_sprint_id = @pm_sprint_id + @created_issue.pm_issue_type = @pm_issue_type + @created_issue.parent_id = @parent_id @created_issue.issue_tags_value = @issue_tags.order("id asc").pluck(:id).join(",") unless issue_tag_ids.blank? @created_issue.save! diff --git a/app/services/api/v1/issues/list_service.rb b/app/services/api/v1/issues/list_service.rb index 862524bf3..5e442c01f 100644 --- a/app/services/api/v1/issues/list_service.rb +++ b/app/services/api/v1/issues/list_service.rb @@ -4,7 +4,7 @@ class Api::V1::Issues::ListService < ApplicationService attr_reader :project, :only_name, :category, :participant_category, :keyword, :author_id, :issue_tag_ids attr_reader :begin_date, :end_date attr_reader :milestone_id, :assigner_id, :status_id, :sort_by, :sort_direction, :current_user - attr_reader :pm_project_id, :pm_sprint_id + attr_reader :pm_project_id, :pm_sprint_id, :parent_id, :pm_issue_type attr_accessor :queried_issues, :total_issues_count, :closed_issues_count, :opened_issues_count validates :category, inclusion: {in: %w(all opened closed), message: "请输入正确的Category"} @@ -29,6 +29,8 @@ class Api::V1::Issues::ListService < ApplicationService @sort_by = params[:sort_by].present? ? params[:sort_by] : 'issues.updated_on' @pm_project_id = params[:pm_project_id] @pm_sprint_id = params[:pm_sprint_id] + @parent_id = params[:parent_id] + @pm_issue_type = params[:pm_issue_type] @sort_direction = (params[:sort_direction].present? ? params[:sort_direction] : 'desc').downcase @current_user = current_user end @@ -64,10 +66,17 @@ class Api::V1::Issues::ListService < ApplicationService # issue_tag_ids issues = issues.ransack(issue_tags_value_cont: issue_tag_ids.sort!.join(",")).result unless issue_tag_ids.blank? - + # milestone_id issues = issues.where(fixed_version_id: milestone_id) if milestone_id.present? + #pm相关 + # parent_id, + issues = issues.where(parent_id: parent_id) if parent_id.present? + + # pm_issue_type + issues = issues.where(pm_issue_type: pm_issue_type) if pm_issue_type.present? + # pm_project_id issues = issues.where(pm_project_id: pm_project_id) if pm_project_id.present? diff --git a/app/views/api/v1/issues/_detail.json.jbuilder b/app/views/api/v1/issues/_detail.json.jbuilder index 7c3adecc3..bec02a555 100644 --- a/app/views/api/v1/issues/_detail.json.jbuilder +++ b/app/views/api/v1/issues/_detail.json.jbuilder @@ -44,4 +44,8 @@ json.operate_journals_count issue.operate_journals.size json.attachments issue.attachments.each do |attachment| json.partial! "api/v1/attachments/simple_detail", locals: {attachment: attachment} end -json.pull_fixed issue.pull_attached_issues.where(fixed: true).present? \ No newline at end of file +json.pull_fixed issue.pull_attached_issues.where(fixed: true).present? +json.parent_id issue.parent_id +json.pm_issue_type issue.pm_issue_type +json.pm_sprint_id issue.pm_sprint_id +json.pm_project_id issue.pm_project_id diff --git a/app/views/api/v1/issues/index.json.jbuilder b/app/views/api/v1/issues/index.json.jbuilder index cde117fdc..8fd915553 100644 --- a/app/views/api/v1/issues/index.json.jbuilder +++ b/app/views/api/v1/issues/index.json.jbuilder @@ -7,6 +7,6 @@ json.issues @issues.each do |issue| if params[:only_name].present? json.(issue, :id, :subject, :project_issues_index) else - json.partial! "simple_detail", locals: {issue: issue} + json.partial! "api/v1/issues/simple_detail", locals: {issue: issue} end end \ No newline at end of file diff --git a/app/views/api/v1/pm_issues/create.json.jbuilder b/app/views/api/v1/pm_issues/create.json.jbuilder deleted file mode 100644 index f45ef5b2f..000000000 --- a/app/views/api/v1/pm_issues/create.json.jbuilder +++ /dev/null @@ -1 +0,0 @@ -json.partial! "api/v1/issues/detail", locals: {issue: @object_result} diff --git a/config/routes.rb b/config/routes.rb index 7694a77c0..647405bdb 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -792,6 +792,11 @@ Rails.application.routes.draw do end end + namespace :pm do + resource :issues + resource :journals + end + namespace :admins do mount Sidekiq::Web => '/sidekiq' get '/', to: 'dashboards#index' diff --git a/config/routes/api.rb b/config/routes/api.rb index 5b1f37d8d..88b75c740 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -1,5 +1,9 @@ defaults format: :json do - namespace :api do + namespace :api do + namespace :pm do + resources :issues + end + namespace :v1 do resources :users, only: [:index] do @@ -56,8 +60,7 @@ defaults format: :json do end end - resources :pm_issues - + scope module: :issues do resources :issue_tags, except: [:new, :edit] do collection do diff --git a/db/migrate/20231031070603_add_pm_issue_type_to_issues.rb b/db/migrate/20231031070603_add_pm_issue_type_to_issues.rb new file mode 100644 index 000000000..846a760f1 --- /dev/null +++ b/db/migrate/20231031070603_add_pm_issue_type_to_issues.rb @@ -0,0 +1,5 @@ +class AddPmIssueTypeToIssues < ActiveRecord::Migration[5.2] + def change + add_column :issues, :pm_issue_type, :integer + end +end diff --git a/spec/controllers/pm/issues_controller_spec.rb b/spec/controllers/pm/issues_controller_spec.rb new file mode 100644 index 000000000..cb80ebb71 --- /dev/null +++ b/spec/controllers/pm/issues_controller_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe Pm::IssuesController, type: :controller do + +end diff --git a/spec/controllers/pm/journals_controller_spec.rb b/spec/controllers/pm/journals_controller_spec.rb new file mode 100644 index 000000000..0a0ced0ba --- /dev/null +++ b/spec/controllers/pm/journals_controller_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe Pm::JournalsController, type: :controller do + +end diff --git a/spec/helpers/pm/issues_helper_spec.rb b/spec/helpers/pm/issues_helper_spec.rb new file mode 100644 index 000000000..43b9ba751 --- /dev/null +++ b/spec/helpers/pm/issues_helper_spec.rb @@ -0,0 +1,15 @@ +require 'rails_helper' + +# Specs in this file have access to a helper object that includes +# the Pm::IssuesHelper. For example: +# +# describe Pm::IssuesHelper do +# describe "string concat" do +# it "concats two strings with spaces" do +# expect(helper.concat_strings("this","that")).to eq("this that") +# end +# end +# end +RSpec.describe Pm::IssuesHelper, type: :helper do + pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/helpers/pm/journals_helper_spec.rb b/spec/helpers/pm/journals_helper_spec.rb new file mode 100644 index 000000000..8dd212826 --- /dev/null +++ b/spec/helpers/pm/journals_helper_spec.rb @@ -0,0 +1,15 @@ +require 'rails_helper' + +# Specs in this file have access to a helper object that includes +# the Pm::JournalsHelper. For example: +# +# describe Pm::JournalsHelper do +# describe "string concat" do +# it "concats two strings with spaces" do +# expect(helper.concat_strings("this","that")).to eq("this that") +# end +# end +# end +RSpec.describe Pm::JournalsHelper, type: :helper do + pending "add some examples to (or delete) #{__FILE__}" +end