diff --git a/app/controllers/api/pm/issue_links_controller.rb b/app/controllers/api/pm/issue_links_controller.rb index fe2c93c82..370e61d13 100644 --- a/app/controllers/api/pm/issue_links_controller.rb +++ b/app/controllers/api/pm/issue_links_controller.rb @@ -6,16 +6,40 @@ class Api::Pm::IssueLinksController < Api::Pm::BaseController end def create - params[:link_ids].map { |e| @issue.pm_links.find_or_create_by(be_linkable_type: 'Issue', be_linkable_id: e) } - render_ok + begin + ActiveRecord::Base.transaction do + params[:link_ids].each do |e| + @issue.pm_links.find_or_create_by!(be_linkable_type: 'Issue', be_linkable_id: e) + tag_issue = Issue.find_by_id(e) + next unless tag_issue.present? + journal = tag_issue.journals.create!({user_id: current_id.id}) + journal.journal_details.create!({property: "tag_link_issue", prop_key: "1", value: @issue.id.to_s}) + end + journal = @issue.journals.create!({user_id: current_user.id}) + journal.journal_details.create!({property: "tag_link_issue", prop_key: "#{params[:link_ids].size}", value: params[:link_ids].join(",")}) + end + render_ok + rescue + render_error('创建失败!') + end end def destroy - @links = PmLink.where(be_linkable_id: @issue.id, be_linkable_type: 'Issue', linkable_id: params[:id], linkable_type: 'Issue').or(PmLink.where(linkable_id: @issue.id, linkable_type: 'Issue', be_linkable_id: params[:id], be_linkable_type: 'Issue')) - @link = @links.last - if @link.try(:destroy) + begin + ActiveRecord::Base.transaction do + @links = PmLink.where(be_linkable_id: @issue.id, be_linkable_type: 'Issue', linkable_id: params[:id], linkable_type: 'Issue').or(PmLink.where(linkable_id: @issue.id, linkable_type: 'Issue', be_linkable_id: params[:id], be_linkable_type: 'Issue')) + journal = @issue.journals.create!({user_id: current_user.id}) + journal.journal_details.create!({property: "tag_link_issue", prop_key: "1", old_value: params[:id].to_s}) + another_issue = Issue.find_by_id(params[:id]) + if another_issue.present? + journal = another_issue.journals.create!({user_id: current_user.id}) + journal.journal_details.create!({property: "tag_link_issue", prop_key: "1", old_value: @issue.id.to_s}) + end + @link = @links.last + @link.destroy! + end render_ok - else + rescue render_error('删除失败!') end end diff --git a/app/models/issue.rb b/app/models/issue.rb index cb8b98cce..955f903e9 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -109,6 +109,20 @@ class Issue < ApplicationRecord after_save :incre_or_decre_closed_issues_count, :change_versions_count, :send_update_message_to_notice_system, :associate_attachment_container, :generate_uuid after_destroy :update_closed_issues_count_in_project!, :decre_project_common, :decre_user_statistic, :decre_platform_statistic, :destroy_be_pm_links + + def pm_issue_type_string + case pm_issue_type + when 1 + "requirement" + when 2 + "task" + when 3 + "bug" + else + "issue" + end + end + def destroy_be_pm_links PmLink.where(be_linkable_type:"Issue",be_linkable_id:self.id).map(&:destroy) end diff --git a/app/models/journal.rb b/app/models/journal.rb index 1c37d2f1b..d387366aa 100644 --- a/app/models/journal.rb +++ b/app/models/journal.rb @@ -114,8 +114,8 @@ class Journal < ApplicationRecord content.gsub!('拒绝', '已拒绝') return content when 'root_id' - old_value = Issue.find_by_id(detail.old_value)&.subject - new_value = Issue.find_by_id(detail.value)&.subject + old_value = "#{Issue.find_by_id(detail.old_value)&.subject}" + new_value = "#{Issue.find_by_id(detail.value)&.subject}" if old_value.nil? || old_value.blank? content += "关联了父需求<#{new_value}>" else @@ -127,28 +127,28 @@ class Journal < ApplicationRecord end return content when 'leaf_issue' - old_value = Issue.where(id: detail.old_value.to_s.split(",")).map{|i| "<#{i.subject}>"}.join("、") - new_value = Issue.where(id: detail.value.to_s.split(",")).map{|i| "<#{i.subject}>"}.join("、") + old_value = Issue.where(id: detail.old_value.to_s.split(",")).map{|i| "<#{i.subject}>"}.join("、") + new_value = Issue.where(id: detail.value.to_s.split(",")).map{|i| "<#{i.subject}>"}.join("、") if old_value.nil? || old_value.blank? - content += "新建了子需求#{new_value}" + content += "新建了子需求#{new_value}" else if new_value.nil? || new_value.blank? - content += "删除了关联的子需求#{old_value}" + content += "删除了关联的子需求#{old_value}" else - content += "新建了子需求#{new_value}" + content += "新建了子需求#{new_value}" end end return content when 'tag_leaf_issue' - old_value = Issue.where(id: detail.old_value.to_s.split(",")).map{|i| "<#{i.subject}>"}.join("、") - new_value = Issue.where(id: detail.value.to_s.split(",")).map{|i| "<#{i.subject}>"}.join("、") + old_value = Issue.where(id: detail.old_value.to_s.split(",")).map{|i| "<#{i.subject}>"}.join("、") + new_value = Issue.where(id: detail.value.to_s.split(",")).map{|i| "<#{i.subject}>"}.join("、") if old_value.nil? || old_value.blank? - content += "关联了子需求#{new_value}" + content += "关联了子需求#{new_value}" else if new_value.nil? || new_value.blank? - content += "取消了关联的子需求#{old_value}" + content += "取消了关联的子需求#{old_value}" else - content += "关联了子需求#{new_value}" + content += "关联了子需求#{new_value}" end end return content @@ -174,8 +174,8 @@ class Journal < ApplicationRecord content.gsub!('拒绝', '已拒绝') return content when 'root_id' - old_value = Issue.find_by_id(detail.old_value)&.subject - new_value = Issue.find_by_id(detail.value)&.subject + old_value = "#{Issue.find_by_id(detail.old_value)&.subject}" + new_value = "#{Issue.find_by_id(detail.value)&.subject}" if old_value.nil? || old_value.blank? content += "关联了父任务<#{new_value}>" else @@ -187,28 +187,28 @@ class Journal < ApplicationRecord end return content when 'leaf_issue' - old_value = Issue.where(id: detail.old_value.to_s.split(",")).map{|i| "<#{i.subject}>"}.join("、") - new_value = Issue.where(id: detail.value.to_s.split(",")).map{|i| "<#{i.subject}>"}.join("、") + old_value = Issue.where(id: detail.old_value.to_s.split(",")).map{|i| "<#{i.subject}>"}.join("、") + new_value = Issue.where(id: detail.value.to_s.split(",")).map{|i| "<#{i.subject}>"}.join("、") if old_value.nil? || old_value.blank? - content += "新建了子任务#{new_value}" + content += "新建了子任务#{new_value}" else if new_value.nil? || new_value.blank? - content += "删除了关联的子任务#{old_value}" + content += "删除了关联的子任务#{old_value}" else - content += "新建了子任务#{new_value}" + content += "新建了子任务#{new_value}" end end return content when 'tag_leaf_issue' - old_value = Issue.where(id: detail.old_value.to_s.split(",")).map{|i| "<#{i.subject}>"}.join("、") - new_value = Issue.where(id: detail.value.to_s.split(",")).map{|i| "<#{i.subject}>"}.join("、") + old_value = Issue.where(id: detail.old_value.to_s.split(",")).map{|i| "<#{i.subject}>"}.join("、") + new_value = Issue.where(id: detail.value.to_s.split(",")).map{|i| "<#{i.subject}>"}.join("、") if old_value.nil? || old_value.blank? - content += "关联了子任务#{new_value}" + content += "关联了子任务#{new_value}" else if new_value.nil? || new_value.blank? - content += "取消了关联的子任务#{old_value}" + content += "取消了关联的子任务#{old_value}" else - content += "关联了子任务#{new_value}" + content += "关联了子任务#{new_value}" end end return content @@ -234,8 +234,8 @@ class Journal < ApplicationRecord content.gsub!('拒绝', '已拒绝') return content when 'root_id' - old_value = Issue.find_by_id(detail.old_value)&.subject - new_value = Issue.find_by_id(detail.value)&.subject + old_value = "#{Issue.find_by_id(detail.old_value)&.subject}" + new_value = "#{Issue.find_by_id(detail.value)&.subject}" if old_value.nil? || old_value.blank? content += "关联了父缺陷<#{new_value}>" else @@ -247,28 +247,28 @@ class Journal < ApplicationRecord end return content when 'leaf_issue' - old_value = Issue.where(id: detail.old_value.to_s.split(",")).map{|i| "<#{i.subject}>"}.join("、") - new_value = Issue.where(id: detail.value.to_s.split(",")).map{|i| "<#{i.subject}>"}.join("、") + old_value = Issue.where(id: detail.old_value.to_s.split(",")).map{|i| "<#{i.subject}>"}.join("、") + new_value = Issue.where(id: detail.value.to_s.split(",")).map{|i| "<#{i.subject}>"}.join("、") if old_value.nil? || old_value.blank? - content += "新建了子缺陷#{new_value}" + content += "新建了子缺陷#{new_value}" else if new_value.nil? || new_value.blank? - content += "删除了关联的子缺陷#{old_value}" + content += "删除了关联的子缺陷#{old_value}" else - content += "新建了子缺陷#{new_value}" + content += "新建了子缺陷#{new_value}" end end return content when 'tag_leaf_issue' - old_value = Issue.where(id: detail.old_value.to_s.split(",")).map{|i| "<#{i.subject}>"}.join("、") - new_value = Issue.where(id: detail.value.to_s.split(",")).map{|i| "<#{i.subject}>"}.join("、") + old_value = Issue.where(id: detail.old_value.to_s.split(",")).map{|i| "<#{i.subject}>"}.join("、") + new_value = Issue.where(id: detail.value.to_s.split(",")).map{|i| "<#{i.subject}>"}.join("、") if old_value.nil? || old_value.blank? - content += "关联了子缺陷#{new_value}" + content += "关联了子缺陷#{new_value}" else if new_value.nil? || new_value.blank? - content += "取消了关联的子缺陷#{old_value}" + content += "取消了关联的子缺陷#{old_value}" else - content += "关联了子缺陷#{new_value}" + content += "关联了子缺陷#{new_value}" end end return content @@ -429,41 +429,41 @@ class Journal < ApplicationRecord end return content when 'assigner' - old_value = User.where(id: detail.old_value.split(",")).map{|u| u.real_name}.join("、") - new_value = User.where(id: detail.value.split(",")).map{|u| u.real_name}.join("、") + old_value = User.where(id: detail.old_value.split(",")).map{|u| "#{u.real_name}"}.join("、") + new_value = User.where(id: detail.value.split(",")).map{|u| "#{u.real_name}"}.join("、") if old_value.nil? || old_value.blank? - content += "添加负责人#{new_value}" + content += "添加负责人#{new_value}" else if new_value.nil? || new_value.blank? content += "将负责人更改为未设置" else - content += "将负责人由#{old_value}更改为#{new_value}" + content += "将负责人由#{old_value}更改为#{new_value}" end end return content when 'issue_tag' - old_value = IssueTag.where(id: detail.old_value.split(",")).pluck(:name).join("、") - new_value = IssueTag.where(id: detail.value.split(",")).pluck(:name).join("、") + old_value = IssueTag.where(id: detail.old_value.split(",")).map{|t| "#{t.name}"}.join("、") + new_value = IssueTag.where(id: detail.value.split(",")).map{|t| "#{t.name}"}.join("、") if old_value.nil? || old_value.blank? - content += "添加标记#{new_value}" + content += "添加标记#{new_value}" else if new_value.nil? || new_value.blank? content += "将标记更改为未设置" else - content += "将标记由#{old_value}更改为#{new_value}" + content += "将标记由#{old_value}更改为#{new_value}" end end return content when 'link_issue' - old_value = Issue.where(id: detail.old_value.to_s.split(",")).map{|i| "[#{i.pm_issue_type}]-<#{i.subject}>"}.join("、") - new_value = Issue.where(id: detail.value.to_s.split(",")).map{|i| "[#{i.pm_issue_type}]-<#{i.subject}>"}.join("、") + old_value = Issue.where(id: detail.old_value.to_s.split(",")).map{|i| "[#{i.pm_issue_type}]-<#{i.subject}>"}.join("、") + new_value = Issue.where(id: detail.value.to_s.split(",")).map{|i| "[#{i.pm_issue_type}]-<#{i.subject}>"}.join("、") if old_value.nil? || old_value.blank? - content += "关联了工作项#{new_value}" + content += "新建了关联的工作项#{new_value}" else if new_value.nil? || new_value.blank? - content += "取消了关联的工作项#{old_value}" + content += "删除了关联的工作项#{old_value}" else - content += "关联了工作项#{new_value}" + content += "新建了关联的工作项#{new_value}" end end content.gsub!('1', "需求") @@ -471,17 +471,20 @@ class Journal < ApplicationRecord content.gsub!('3', "缺陷") return content when 'tag_link_issue' - old_value = Issue.where(id: detail.old_value.to_s.split(",")).map{|i| "[#{i.pm_issue_type}]-<#{i.subject}>"}.join("、") - new_value = Issue.where(id: detail.value.to_s.split(",")).map{|i| "[#{i.pm_issue_type}]-<#{i.subject}>"}.join("、") + old_value = Issue.where(id: detail.old_value.to_s.split(",")).map{|i| "[#{i.pm_issue_type}]-<#{i.subject}>"}.join("、") + new_value = Issue.where(id: detail.value.to_s.split(",")).map{|i| "[#{i.pm_issue_type}]-<#{i.subject}>"}.join("、") if old_value.nil? || old_value.blank? - content += "新建了关联的工作项#{new_value}" + content += "关联了工作项#{new_value}" else if new_value.nil? || new_value.blank? - content += "删除了关联的工作项#{old_value}" + content += "取消了关联的工作项#{old_value}" else - content += "新建了关联的工作项#{new_value}" + content += "关联了工作项#{new_value}" end end + content.gsub!('1', "需求") + content.gsub!('2', "任务") + content.gsub!('3', "缺陷") return content when 'issue' issue = self.issue diff --git a/app/services/api/pm/issues/create_service.rb b/app/services/api/pm/issues/create_service.rb index 796faf1e5..5412fe17d 100644 --- a/app/services/api/pm/issues/create_service.rb +++ b/app/services/api/pm/issues/create_service.rb @@ -55,16 +55,6 @@ class Api::Pm::Issues::CreateService < ApplicationService load_atme_receivers(receivers_login) unless receivers_login.blank? try_lock("Api::Pm::Issues::CreateService:#{project.id}") # 开始写数据,加锁 @created_issue = Issue.new(issue_attributes) - build_author_participants - build_assigner_participants unless assigner_ids.blank? - build_atme_participants if @atme_receivers.present? - build_issue_journal_details - build_issue_project_trends - @created_issue.assigners = @assigners unless assigner_ids.blank? - @created_issue.attachments = @attachments unless attachment_ids.blank? - @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 if @root_subject.present? && @pm_issue_type.to_i == 4 @root_issue = Issue.find_by(subject: @root_subject, pm_issue_type: 4, pm_project_id: @pm_project_id) @@ -75,12 +65,35 @@ class Api::Pm::Issues::CreateService < ApplicationService else @created_issue.root_id = @root_id end + build_author_participants + build_assigner_participants unless assigner_ids.blank? + build_atme_participants if @atme_receivers.present? + build_issue_journal_details + build_issue_project_trends + @created_issue.assigners = @assigners unless assigner_ids.blank? + @created_issue.attachments = @attachments unless attachment_ids.blank? + @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.time_scale = @time_scale @created_issue.issue_tags_value = @issue_tags.order('id asc').pluck(:id).join(',') unless issue_tag_ids.blank? @created_issue.changer_id = @current_user.id @created_issue.save! - - PmLink.create(be_linkable_type: 'Issue', be_linkable_id: @created_issue.id, linkable_type: 'Issue', linkable_id: @linkable_id) if @linkable_id.present? + if @created_issue.parent_issue.present? + parent_issue = @created_issue.parent_issue + if @created_issue.root_id.present? && parent_issue.present? + journal = parent_issue.journals.create!({user_id: current_user.id}) + journal.journal_details.create!({property: @created_issue.pm_issue_type_string, prop_key: 'leaf_issue', value: @created_issue.id.to_s}) + end + end + if @linkable_id.present? + PmLink.create(be_linkable_type: 'Issue', be_linkable_id: @created_issue.id, linkable_type: 'Issue', linkable_id: @linkable_id) + another_issue = Issue.find_by_id(@linkable_id) + if another_issue.present? + journal = another_issue.journals.create!({user_id: @current_user.id}) + journal.journal_details.create!({property: 'link_issue', prop_key: "1", value: @created_issue.id.to_s}) + end + end if Site.has_blockchain? && @project.use_blockchain if @created_issue.blockchain_token_num.present? && @created_issue.blockchain_token_num > 0 Blockchain::CreateIssue.call({user_id: current_user.id, project_id: @created_issue.project_id, token_num: @created_issue.blockchain_token_num}) @@ -163,6 +176,6 @@ class Api::Pm::Issues::CreateService < ApplicationService def build_issue_journal_details journal = @created_issue.journals.new({user_id: current_user.id}) - journal.journal_details.new({property: 'issue', prop_key: 1, old_value: '', value: ''}) + journal.journal_details.new({property: @created_issue.pm_issue_type_string, prop_key: 1, old_value: '', value: ''}) end end \ No newline at end of file diff --git a/app/services/api/pm/issues/delete_service.rb b/app/services/api/pm/issues/delete_service.rb index 2d5df500e..0a04094c3 100644 --- a/app/services/api/pm/issues/delete_service.rb +++ b/app/services/api/pm/issues/delete_service.rb @@ -14,21 +14,27 @@ class Api::Pm::Issues::DeleteService < ApplicationService def call raise Error, errors.full_messages.join(", ") unless valid? try_lock("Api::V1::Issues::DeleteService:#{project.id}") # 开始写数据,加锁 + ActiveRecord::Base.transaction do + parent_issue = @issue.parent_issue + if @issue.root_id.present? && parent_issue.present? + journal = parent_issue.journals.create!({user_id: current_user.id}) + journal.journal_details.create!({property: @issue.pm_issue_type_string, prop_key: 'leaf_issue', old_value: @issue.id.to_s}) + end - delete_issue - #删除双向关联 - PmLink.where(be_linkable_id: @issue.id, be_linkable_type: 'Issue').or(PmLink.where(linkable_id: @issue.id, linkable_type: 'Issue')).map(&:destroy) + delete_issue + #删除双向关联 + PmLink.where(be_linkable_id: @issue.id, be_linkable_type: 'Issue').or(PmLink.where(linkable_id: @issue.id, linkable_type: 'Issue')).map(&:destroy) - project.incre_project_issue_cache_delete_count + project.incre_project_issue_cache_delete_count - if Site.has_blockchain? && @project.use_blockchain && !project.id.zero? - unlock_balance_on_blockchain(@issue.author_id.to_s, @project.id.to_s, @issue.blockchain_token_num.to_i) if @issue.blockchain_token_num.present? + if Site.has_blockchain? && @project.use_blockchain && !project.id.zero? + unlock_balance_on_blockchain(@issue.author_id.to_s, @project.id.to_s, @issue.blockchain_token_num.to_i) if @issue.blockchain_token_num.present? + end + + if Site.has_notice_menu? && !project.id.zero? + SendTemplateMessageJob.perform_later('IssueDeleted', current_user.id, @issue&.subject, @issue.assigners.pluck(:id), @issue.author_id) + end end - - if Site.has_notice_menu? && !project.id.zero? - SendTemplateMessageJob.perform_later('IssueDeleted', current_user.id, @issue&.subject, @issue.assigners.pluck(:id), @issue.author_id) - end - unlock("Api::V1::Issues::DeleteService:#{project.id}") return true diff --git a/app/services/api/pm/issues/update_service.rb b/app/services/api/pm/issues/update_service.rb index 99896e884..7196a497e 100644 --- a/app/services/api/pm/issues/update_service.rb +++ b/app/services/api/pm/issues/update_service.rb @@ -196,7 +196,7 @@ class Api::Pm::Issues::UpdateService < ApplicationService # 修改状态 if @updated_issue.previous_changes["status_id"].present? journal = @updated_issue.journals.create!({user_id: current_user.id}) - journal.journal_details.create!({property: "attr", prop_key: "status_id", old_value: @updated_issue.previous_changes["status_id"][0], value: @updated_issue.previous_changes["status_id"][1]}) + journal.journal_details.create!({property: @updated_issue.pm_issue_type_string, prop_key: "status_id", old_value: @updated_issue.previous_changes["status_id"][0], value: @updated_issue.previous_changes["status_id"][1]}) end # 修改优先级 @@ -205,6 +205,24 @@ class Api::Pm::Issues::UpdateService < ApplicationService journal.journal_details.create!({property: "attr", prop_key: "priority_id", old_value: @updated_issue.previous_changes["priority_id"][0], value: @updated_issue.previous_changes["priority_id"][1]}) end + # 修改工作项类型 + if @updated_issue.previous_changes["pm_issue_type"].present? + journal = @updated_issue.journals.create!({user_id: current_user.id}) + journal.journal_details.create!({property: "attr", prop_key: "pm_issue_type", old_value: @updated_issue.previous_changes["pm_issue_type"][0], value: @updated_issue.previous_changes["pm_issue_type"][1]}) + end + + # 修改迭代 + if @updated_issue.previous_changes["pm_sprint_id"].present? + journal = @updated_issue.journals.create!({user_id: current_user.id}) + journal.journal_details.create!({property: "attr", prop_key: "pm_sprint_id", old_value: @updated_issue.previous_changes["pm_sprint_id"][0], value: @updated_issue.previous_changes["pm_sprint_id"][1]}) + end + + # 修改代码库 + if @updated_issue.previous_changes["project_id"].present? + journal = @updated_issue.journals.create!({user_id: current_user.id}) + journal.journal_details.create!({property: "attr", prop_key: "project_id", old_value: @updated_issue.previous_changes["project_id"][0], value: @updated_issue.previous_changes["project_id"][1]}) + end + # 修改里程碑 if @updated_issue.previous_changes["fixed_version_id"].present? journal = @updated_issue.journals.create!({user_id: current_user.id}) @@ -228,6 +246,31 @@ class Api::Pm::Issues::UpdateService < ApplicationService journal = @updated_issue.journals.create!({user_id: current_user.id}) journal.journal_details.create!({property: "attr", prop_key: "due_date", old_value: @updated_issue.previous_changes["due_date"][0], value: @updated_issue.previous_changes["due_date"][1]}) end + + # 更改预估工时 + if @updated_issue.previous_changes["time_scale"].present? + journal = @updated_issue.journals.create!({user_id: current_user.id}) + journal.journal_details.create!({property: "attr", prop_key: "time_scale", old_value: @updated_issue.previous_changes["time_scale"][0], value: @updated_issue.previous_changes["time_scale"][1]}) + end + + # 更改父工作项 + if @updated_issue.previous_changes["root_id"].present? + journal = @updated_issue.journals.create!({user_id: current_user.id}) + journal.journal_details.create!({property: @updated_issue.pm_issue_type_string, prop_key: "root_id", old_value: @updated_issue.previous_changes["root_id"][0], value: @updated_issue.previous_changes["root_id"][1]}) + + # 更改子工作项 + before_parent_issue = Issue.find_by_id(@updated_issue.previous_changes["root_id"][0]) + if before_parent_issue.present? + journal = before_parent_issue.journals.create!({user_id: current_user.id}) + journal.journal_details.create!({property: @updated_issue.pm_issue_type_string, prop_key: "tag_leaf_issue", old_value: @updated_issue.previous_changes["root_id"][0]}) + end + + after_parent_issue = Issue.find_by_id(@updated_issue.previous_changes["root_id"][1]) + if after_parent_issue.present? + journal = after_parent_issue.journals.create!({user_id: current_user.id}) + journal.journal_details.create!({property: @updated_issue.pm_issue_type_string, prop_key: "tag_leaf_issue", value: @updated_issue.previous_changes["root_id"][1]}) + end + end rescue raise Error, "创建操作记录失败!" end