From 16a71a383b2e5b938a66ae6cedb36cc6526066b7 Mon Sep 17 00:00:00 2001 From: yystopf Date: Wed, 30 Jul 2025 16:23:41 +0800 Subject: [PATCH 01/12] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=93=8D=E4=BD=9C=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/user_action.rb | 2 +- app/views/admins/shared/_sidebar.html.erb | 2 +- app/views/admins/user_actions/index.html.erb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/models/user_action.rb b/app/models/user_action.rb index 7723fb12e..0dba93da4 100644 --- a/app/models/user_action.rb +++ b/app/models/user_action.rb @@ -31,7 +31,7 @@ class UserAction < ApplicationRecord def action_name case action_type - when "DestroyUser" then "用户注销" + when "DestroyUser" then "删除用户" when "DestroyProject" then "删除项目" when "Login" then "登录" when "Logout" then "退出登录" diff --git a/app/views/admins/shared/_sidebar.html.erb b/app/views/admins/shared/_sidebar.html.erb index 0c9b9c495..bfbce0a8e 100644 --- a/app/views/admins/shared/_sidebar.html.erb +++ b/app/views/admins/shared/_sidebar.html.erb @@ -26,7 +26,7 @@
  • <%= sidebar_item(admins_faqs_path, 'FAQ', icon: 'question-circle', controller: 'admins-faqs', has_permission: current_user.admin? || current_user.business?) %>
  • <%= sidebar_item(admins_nps_path, 'NPS用户调研', icon: 'question-circle', controller: 'admins-nps', has_permission: current_user.admin? || current_user.business?) %>
  • <%= sidebar_item(admins_feedbacks_path, '用户反馈', icon: 'question-circle', controller: 'admins-feedbacks', has_permission: current_user.admin? || current_user.business?) %>
  • -
  • <%= sidebar_item(admins_user_actions_path, '操作记录', icon: 'pencil-square', controller: 'admins-user_actions', has_permission: current_user.admin?) %>
  • +
  • <%= sidebar_item(admins_user_actions_path, '操作日志', icon: 'pencil-square', controller: 'admins-user_actions', has_permission: current_user.admin?) %>
  • <%= sidebar_item(admins_system_notifications_path, '系统公告配置', icon: 'bell', controller: 'admins-system_notifications', has_permission: current_user.admin? || current_user.business?) %>
  • <% end %> diff --git a/app/views/admins/user_actions/index.html.erb b/app/views/admins/user_actions/index.html.erb index c48c26c3d..3be99282a 100644 --- a/app/views/admins/user_actions/index.html.erb +++ b/app/views/admins/user_actions/index.html.erb @@ -5,7 +5,7 @@
    <%= form_tag(admins_user_actions_path, method: :get, class: 'form-inline search-form flex-1', remote: true) do %> 操作类型: - <% action_type_options = [['自定义',''],['用户注销','DestroyUser'], ['删除项目', 'DestroyProject'], ['删除组织', 'DestroyOrganization']] %> + <% action_type_options = [['自定义',''],['删除用户','DestroyUser'], ['删除项目', 'DestroyProject'], ['删除组织', 'DestroyOrganization']] %> <%= select_tag(:action_type_select, options_for_select(action_type_options), class: 'form-control') %> <%= text_field_tag(:action_type, params[:action_type], class: 'form-control col-sm-2 ml-3',style: 'display:;', placeholder: '自定义操作类型检索') %> <%= text_field_tag(:keyword, params[:keyword], class: 'form-control col-sm-2 ml-3', placeholder: '操作人用户名/邮箱/手机号检索') %> From 532b924ff1d00ac748388c302b287c24433f0abf Mon Sep 17 00:00:00 2001 From: yystopf Date: Wed, 30 Jul 2025 16:32:58 +0800 Subject: [PATCH 02/12] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E5=88=97=E8=A1=A8project=5Fid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/api/v1/issues/_simple_detail.json.jbuilder | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/api/v1/issues/_simple_detail.json.jbuilder b/app/views/api/v1/issues/_simple_detail.json.jbuilder index 6207ab80b..5782d8661 100644 --- a/app/views/api/v1/issues/_simple_detail.json.jbuilder +++ b/app/views/api/v1/issues/_simple_detail.json.jbuilder @@ -1,4 +1,4 @@ -json.(issue, :id, :subject, :project_issues_index) +json.(issue, :id, :subject, :project_issues_index, :project_id) json.blockchain_token_num (Site.has_blockchain? && issue.project&.use_blockchain) ? issue.blockchain_token_num : nil json.created_at issue.created_on.strftime("%Y-%m-%d %H:%M") json.updated_at issue.updated_on.strftime("%Y-%m-%d %H:%M") From 2229c732cae2894e968415478681293980ec30f3 Mon Sep 17 00:00:00 2001 From: yystopf Date: Wed, 30 Jul 2025 16:48:30 +0800 Subject: [PATCH 03/12] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E5=88=97=E8=A1=A8project=5Fid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/api/v1/issues/_simple_detail.json.jbuilder | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/views/api/v1/issues/_simple_detail.json.jbuilder b/app/views/api/v1/issues/_simple_detail.json.jbuilder index 5782d8661..0c27cc2c6 100644 --- a/app/views/api/v1/issues/_simple_detail.json.jbuilder +++ b/app/views/api/v1/issues/_simple_detail.json.jbuilder @@ -1,4 +1,11 @@ json.(issue, :id, :subject, :project_issues_index, :project_id) +json.project do + if issue.project.present? + json.partial! "api/v1/projects/simple_detail", locals: {project: issue.project} + else + json.nil! + end +end json.blockchain_token_num (Site.has_blockchain? && issue.project&.use_blockchain) ? issue.blockchain_token_num : nil json.created_at issue.created_on.strftime("%Y-%m-%d %H:%M") json.updated_at issue.updated_on.strftime("%Y-%m-%d %H:%M") From a35537694c0879968b2da6294923f1ccb9fac63d Mon Sep 17 00:00:00 2001 From: yystopf Date: Thu, 31 Jul 2025 16:41:58 +0800 Subject: [PATCH 04/12] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E6=97=A5=E5=BF=97=E6=98=BE=E7=A4=BA=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/api/v1/issues/journals/_detail.json.jbuilder | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/api/v1/issues/journals/_detail.json.jbuilder b/app/views/api/v1/issues/journals/_detail.json.jbuilder index e374dd04c..cfb09217b 100644 --- a/app/views/api/v1/issues/journals/_detail.json.jbuilder +++ b/app/views/api/v1/issues/journals/_detail.json.jbuilder @@ -8,7 +8,7 @@ end if journal.is_journal_detail? detail = journal.journal_details.take json.operate_category @issue.pm_issue_type.nil? ? detail.property == "attr" ? detail.prop_key : detail.property : journal.pm_operate_category - json.operate_content journal.is_journal_detail? ? @issue.pm_issue_type.nil? ? journal.operate_content : journal.pm_operate_content : nil + json.operate_content journal.is_journal_detail? ? @issue.pm_project_id.nil? && @issue.pm_issue_type.nil? ? journal.operate_content : journal.pm_operate_content : nil else json.notes journal.notes json.comments_count journal.comments_count From 01ef87f5a349ad3fd82a015038b4b87a749fd3b4 Mon Sep 17 00:00:00 2001 From: yystopf Date: Fri, 1 Aug 2025 14:34:17 +0800 Subject: [PATCH 05/12] =?UTF-8?q?fixed=EF=BC=9A=E6=93=8D=E4=BD=9C=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E4=B8=BA=E7=A9=BA=E7=9A=84=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/journal.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/models/journal.rb b/app/models/journal.rb index 196a76165..d4dfd5f5a 100644 --- a/app/models/journal.rb +++ b/app/models/journal.rb @@ -532,6 +532,7 @@ class Journal < ApplicationRecord def operate_content content = "#{operate_by_content}" detail = self.journal_details.take + content = "" case detail.property when 'issue' content += "创建了疑修" @@ -605,7 +606,7 @@ class Journal < ApplicationRecord content += "由#{old_value}更改为#{new_value}" end end - + content = self.pm_operate_content if content == "" end def journal_content From b6de7fa96b89c3951d91ee51603fa5ccc0616206 Mon Sep 17 00:00:00 2001 From: yystopf Date: Fri, 1 Aug 2025 14:57:07 +0800 Subject: [PATCH 06/12] =?UTF-8?q?fixed=EF=BC=9A=E6=93=8D=E4=BD=9C=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E4=B8=BA=E7=A9=BA=E7=9A=84=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/journal.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/models/journal.rb b/app/models/journal.rb index d4dfd5f5a..a72526872 100644 --- a/app/models/journal.rb +++ b/app/models/journal.rb @@ -532,10 +532,10 @@ class Journal < ApplicationRecord def operate_content content = "#{operate_by_content}" detail = self.journal_details.take - content = "" case detail.property when 'issue' content += "创建了疑修" + return content when 'attachment' old_value = Attachment.where("BINARY id in (?) or uuid in (?)", detail.old_value.to_s.split(","), detail.old_value.to_s.split(",")).pluck(:filename).join("、") new_value = Attachment.where("BINARY id in (?) or uuid in (?)", detail.value.to_s.split(","), detail.value.to_s.split(",")).pluck(:filename).join("、") @@ -545,6 +545,7 @@ class Journal < ApplicationRecord new_value = "无" if new_value.blank? content += "将附件由#{old_value}更改为#{new_value}" 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("、") @@ -554,6 +555,7 @@ class Journal < ApplicationRecord new_value = "无" if new_value.blank? content += "将标记由#{old_value}更改为#{new_value}" 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("、") @@ -563,6 +565,7 @@ class Journal < ApplicationRecord new_value = "无" if new_value.blank? content += "将负责人由#{old_value}更改为#{new_value}" end + return content when 'attr' content += "将" case detail.prop_key @@ -605,6 +608,7 @@ class Journal < ApplicationRecord new_value = "无" if new_value.blank? content += "由#{old_value}更改为#{new_value}" end + return content end content = self.pm_operate_content if content == "" end From 81a5adb21a5edf1c9b1fbd98dbc48d19c80f7a53 Mon Sep 17 00:00:00 2001 From: yystopf Date: Fri, 1 Aug 2025 15:12:41 +0800 Subject: [PATCH 07/12] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=85=B3?= =?UTF-8?q?=E8=81=94=E7=9A=84=E7=96=91=E4=BF=AE=E6=93=8D=E4=BD=9C=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/journal.rb | 73 ++++++++++++++++++++++++++++++------------- 1 file changed, 51 insertions(+), 22 deletions(-) diff --git a/app/models/journal.rb b/app/models/journal.rb index a72526872..a110cd85a 100644 --- a/app/models/journal.rb +++ b/app/models/journal.rb @@ -483,37 +483,66 @@ class Journal < ApplicationRecord 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("、") - if detail.old_value.nil? || detail.old_value.blank? - content += "新建了关联的工作项#{new_value}" - else - if detail.value.nil? || detail.value.blank? - content += "删除了关联的工作项#{old_value}" + if i.pm_issue_type.nil? && i.pm_project_id.nil? + 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 detail.old_value.nil? || detail.old_value.blank? + content += "新建了关联的疑修 #{new_value}" else + if detail.value.nil? || detail.value.blank? + content += "删除了关联的疑修 #{old_value}" + else + content += "新建了关联的疑修 #{new_value}" + end + end + else + 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 detail.old_value.nil? || detail.old_value.blank? content += "新建了关联的工作项#{new_value}" + else + if detail.value.nil? || detail.value.blank? + content += "删除了关联的工作项#{old_value}" + else + content += "新建了关联的工作项#{new_value}" + end end end - content.gsub!('1', "需求") - content.gsub!('2', "任务") - 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("、") - if detail.old_value.nil? || detail.old_value.blank? - content += "关联了工作项#{new_value}" - else - if detail.value.nil? || detail.value.blank? - content += "取消了关联的工作项#{old_value}" + if i.pm_issue_type.nil? && i.pm_project_id.nil? + 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 detail.old_value.nil? || detail.old_value.blank? + content += "关联了疑修 #{new_value}" else - content += "关联了工作项#{new_value}" + if detail.value.nil? || detail.value.blank? + content += "取消了关联的疑修 #{old_value}" + else + content += "关联了疑修 #{new_value}" + end end + content.gsub!('1', "需求") + content.gsub!('2', "任务") + content.gsub!('3', "缺陷") + return content + else + 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 detail.old_value.nil? || detail.old_value.blank? + content += "关联了工作项#{new_value}" + else + if detail.value.nil? || detail.value.blank? + content += "取消了关联的工作项#{old_value}" + else + content += "关联了工作项#{new_value}" + end + end + content.gsub!('1', "需求") + content.gsub!('2', "任务") + content.gsub!('3', "缺陷") + return content end - content.gsub!('1', "需求") - content.gsub!('2', "任务") - content.gsub!('3', "缺陷") - return content when 'issue' issue = self.issue case issue.pm_issue_type From bcf0b376a9225c39168354f19e0372799700b16a Mon Sep 17 00:00:00 2001 From: yystopf Date: Fri, 1 Aug 2025 15:25:47 +0800 Subject: [PATCH 08/12] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=85=B3?= =?UTF-8?q?=E8=81=94=E7=9A=84=E7=96=91=E4=BF=AE=E6=93=8D=E4=BD=9C=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/journal.rb | 75 +++++++++++++------------------------------ 1 file changed, 23 insertions(+), 52 deletions(-) diff --git a/app/models/journal.rb b/app/models/journal.rb index a110cd85a..9b3e7dbc6 100644 --- a/app/models/journal.rb +++ b/app/models/journal.rb @@ -483,66 +483,37 @@ class Journal < ApplicationRecord end return content when 'link_issue' - if i.pm_issue_type.nil? && i.pm_project_id.nil? - 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 detail.old_value.nil? || detail.old_value.blank? - content += "新建了关联的疑修 #{new_value}" + old_value = Issue.where(id: detail.old_value.to_s.split(",")).map{|i| i.pm_issue_type.nil? && i.pm_project_id.nil? ? "疑修 【#{i.subject}】" : "工作项 [#{i.pm_issue_type}]-<#{i.subject}>"}.join("、") + new_value = Issue.where(id: detail.value.to_s.split(",")).map{|i| i.pm_issue_type.nil? && i.pm_project_id.nil? ? "疑修 【#{i.subject}】" : "工作项 [#{i.pm_issue_type}]-<#{i.subject}>"}.join("、") + if detail.old_value.nil? || detail.old_value.blank? + content += "新建了关联的#{new_value}" + else + if detail.value.nil? || detail.value.blank? + content += "删除了关联的#{old_value}" else - if detail.value.nil? || detail.value.blank? - content += "删除了关联的疑修 #{old_value}" - else - content += "新建了关联的疑修 #{new_value}" - end - end - else - 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 detail.old_value.nil? || detail.old_value.blank? - content += "新建了关联的工作项#{new_value}" - else - if detail.value.nil? || detail.value.blank? - content += "删除了关联的工作项#{old_value}" - else - content += "新建了关联的工作项#{new_value}" - end + content += "新建了关联的#{new_value}" end end + content.gsub!('1', "需求") + content.gsub!('2', "任务") + content.gsub!('3', "缺陷") return content when 'tag_link_issue' - if i.pm_issue_type.nil? && i.pm_project_id.nil? - 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 detail.old_value.nil? || detail.old_value.blank? - content += "关联了疑修 #{new_value}" + old_value = Issue.where(id: detail.old_value.to_s.split(",")).map{|i| i.pm_issue_type.nil? && i.pm_project_id.nil? ? "疑修 【#{i.subject}】" : "工作项 [#{i.pm_issue_type}]-<#{i.subject}>"}.join("、") + new_value = Issue.where(id: detail.value.to_s.split(",")).map{|i| i.pm_issue_type.nil? && i.pm_project_id.nil? ? "疑修 【#{i.subject}】" : "工作项 [#{i.pm_issue_type}]-<#{i.subject}>"}.join("、") + if detail.old_value.nil? || detail.old_value.blank? + content += "关联了#{new_value}" + else + if detail.value.nil? || detail.value.blank? + content += "取消了关联的#{old_value}" else - if detail.value.nil? || detail.value.blank? - content += "取消了关联的疑修 #{old_value}" - else - content += "关联了疑修 #{new_value}" - end + content += "关联了#{new_value}" end - content.gsub!('1', "需求") - content.gsub!('2', "任务") - content.gsub!('3', "缺陷") - return content - else - 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 detail.old_value.nil? || detail.old_value.blank? - content += "关联了工作项#{new_value}" - else - if detail.value.nil? || detail.value.blank? - content += "取消了关联的工作项#{old_value}" - else - content += "关联了工作项#{new_value}" - end - end - content.gsub!('1', "需求") - content.gsub!('2', "任务") - content.gsub!('3', "缺陷") - return content end + content.gsub!('1', "需求") + content.gsub!('2', "任务") + content.gsub!('3', "缺陷") + return content when 'issue' issue = self.issue case issue.pm_issue_type From 95f49450b06210922cbecfbbfc96e8ff401ec2d7 Mon Sep 17 00:00:00 2001 From: yystopf Date: Fri, 1 Aug 2025 15:36:59 +0800 Subject: [PATCH 09/12] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=85=B3?= =?UTF-8?q?=E8=81=94=E7=9A=84=E7=96=91=E4=BF=AE=E6=93=8D=E4=BD=9C=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/issue.rb | 14 ++++++++++++++ app/models/journal.rb | 14 ++++---------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/app/models/issue.rb b/app/models/issue.rb index d65646bd5..08c676b00 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -141,6 +141,20 @@ class Issue < ApplicationRecord end end + def pm_issue_type_chinese_string + case pm_issue_type + when 1 + "需求" + when 2 + "任务" + when 3 + "缺陷" + else + "疑修" + 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 9b3e7dbc6..2baef42e0 100644 --- a/app/models/journal.rb +++ b/app/models/journal.rb @@ -483,8 +483,8 @@ class Journal < ApplicationRecord end return content when 'link_issue' - old_value = Issue.where(id: detail.old_value.to_s.split(",")).map{|i| i.pm_issue_type.nil? && i.pm_project_id.nil? ? "疑修 【#{i.subject}】" : "工作项 [#{i.pm_issue_type}]-<#{i.subject}>"}.join("、") - new_value = Issue.where(id: detail.value.to_s.split(",")).map{|i| i.pm_issue_type.nil? && i.pm_project_id.nil? ? "疑修 【#{i.subject}】" : "工作项 [#{i.pm_issue_type}]-<#{i.subject}>"}.join("、") + old_value = Issue.where(id: detail.old_value.to_s.split(",")).map{|i| i.pm_issue_type.nil? && i.pm_project_id.nil? ? "疑修 【#{i.subject}】" : "工作项 [#{i.pm_issue_type_chinese_string}]-<#{i.subject}>"}.join("、") + new_value = Issue.where(id: detail.value.to_s.split(",")).map{|i| i.pm_issue_type.nil? && i.pm_project_id.nil? ? "疑修 【#{i.subject}】" : "工作项 [#{i.pm_issue_type_chinese_string}]-<#{i.subject}>"}.join("、") if detail.old_value.nil? || detail.old_value.blank? content += "新建了关联的#{new_value}" else @@ -494,13 +494,10 @@ class Journal < ApplicationRecord content += "新建了关联的#{new_value}" end end - content.gsub!('1', "需求") - content.gsub!('2', "任务") - 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.nil? && i.pm_project_id.nil? ? "疑修 【#{i.subject}】" : "工作项 [#{i.pm_issue_type}]-<#{i.subject}>"}.join("、") - new_value = Issue.where(id: detail.value.to_s.split(",")).map{|i| i.pm_issue_type.nil? && i.pm_project_id.nil? ? "疑修 【#{i.subject}】" : "工作项 [#{i.pm_issue_type}]-<#{i.subject}>"}.join("、") + old_value = Issue.where(id: detail.old_value.to_s.split(",")).map{|i| i.pm_issue_type.nil? && i.pm_project_id.nil? ? "疑修 【#{i.subject}】" : "工作项 [#{i.pm_issue_type_chinese_string}]-<#{i.subject}>"}.join("、") + new_value = Issue.where(id: detail.value.to_s.split(",")).map{|i| i.pm_issue_type.nil? && i.pm_project_id.nil? ? "疑修 【#{i.subject}】" : "工作项 [#{i.pm_issue_type_chinese_string}]-<#{i.subject}>"}.join("、") if detail.old_value.nil? || detail.old_value.blank? content += "关联了#{new_value}" else @@ -510,9 +507,6 @@ class Journal < ApplicationRecord content += "关联了#{new_value}" end end - content.gsub!('1', "需求") - content.gsub!('2', "任务") - content.gsub!('3', "缺陷") return content when 'issue' issue = self.issue From a85534b394165564b6601163050ac81a87218b18 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Tue, 19 Aug 2025 10:12:57 +0800 Subject: [PATCH 10/12] =?UTF-8?q?fixed=20=E6=B5=81=E6=B0=B4=E7=BA=BF?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/api/pm/pipelines_controller.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/controllers/api/pm/pipelines_controller.rb b/app/controllers/api/pm/pipelines_controller.rb index 933417ff2..1ad0fe085 100644 --- a/app/controllers/api/pm/pipelines_controller.rb +++ b/app/controllers/api/pm/pipelines_controller.rb @@ -23,7 +23,6 @@ class Api::Pm::PipelinesController < Api::Pm::BaseController pipeline = Action::Pipeline.find_or_initialize_by(pipeline_name: file.to_s.gsub(".yml", "").gsub(".yaml", ""), file_name: ".gitea/workflows/#{file}", branch: project.default_branch, - is_graphic_design: false, disable: false, project_id: project.id) interactor = Repositories::EntriesInteractor.call(@owner, project.identifier, ".gitea/workflows/#{file}", ref: project.default_branch) From 754ed999592a33eb7858d127cf52dc758266b82f Mon Sep 17 00:00:00 2001 From: yystopf Date: Wed, 27 Aug 2025 15:07:04 +0800 Subject: [PATCH 11/12] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E8=A1=8C=E4=B8=BA=E6=9E=84=E5=BB=BA=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/project_action.rb | 24 +++++++++++ app/models/project_actions/fork_event.rb | 30 ++++++++++++++ .../project_actions/issue_comment_event.rb | 29 +++++++++++++ app/models/project_actions/issues_event.rb | 33 +++++++++++++++ .../project_actions/pull_request_event.rb | 41 +++++++++++++++++++ .../pull_request_review_comment_event.rb | 29 +++++++++++++ app/models/project_actions/release_event.rb | 29 +++++++++++++ app/models/project_actions/star_event.rb | 24 +++++++++++ .../20250825061956_create_project_actions.rb | 12 ++++++ 9 files changed, 251 insertions(+) create mode 100644 app/models/project_action.rb create mode 100644 app/models/project_actions/fork_event.rb create mode 100644 app/models/project_actions/issue_comment_event.rb create mode 100644 app/models/project_actions/issues_event.rb create mode 100644 app/models/project_actions/pull_request_event.rb create mode 100644 app/models/project_actions/pull_request_review_comment_event.rb create mode 100644 app/models/project_actions/release_event.rb create mode 100644 app/models/project_actions/star_event.rb create mode 100644 db/migrate/20250825061956_create_project_actions.rb diff --git a/app/models/project_action.rb b/app/models/project_action.rb new file mode 100644 index 000000000..df212b521 --- /dev/null +++ b/app/models/project_action.rb @@ -0,0 +1,24 @@ +# == Schema Information +# +# Table name: project_actions +# +# id :integer not null, primary key +# project_id :integer +# type :string(255) +# user_id :integer +# event_extra :text(65535) +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_project_actions_on_project_id (project_id) +# + +class ProjectAction < ApplicationRecord + + belongs_to :project + belongs_to :user, optional: true + + serialize :event_extra, Hash +end diff --git a/app/models/project_actions/fork_event.rb b/app/models/project_actions/fork_event.rb new file mode 100644 index 000000000..0d9bb99b0 --- /dev/null +++ b/app/models/project_actions/fork_event.rb @@ -0,0 +1,30 @@ +# == Schema Information +# +# Table name: project_actions +# +# id :integer not null, primary key +# project_id :integer +# type :string(255) +# user_id :integer +# event_extra :text(65535) +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_project_actions_on_project_id (project_id) +# + + +class ProjectActions::ForkEvent < ProjectAction + def self.build(project, user, fork_project) + project_action = new(project: project, user: user) + project_action.event_extra = { + forkee_id: fork_project.id, + forkee_name: fork_project.identifier, + forkee_owner_id: fork_project.owner.id, + forkee_owner_login: fork_project.owner.login + } + project_action.save! + end +end diff --git a/app/models/project_actions/issue_comment_event.rb b/app/models/project_actions/issue_comment_event.rb new file mode 100644 index 000000000..2a5a73fdd --- /dev/null +++ b/app/models/project_actions/issue_comment_event.rb @@ -0,0 +1,29 @@ +# == Schema Information +# +# Table name: project_actions +# +# id :integer not null, primary key +# project_id :integer +# type :string(255) +# user_id :integer +# event_extra :text(65535) +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_project_actions_on_project_id (project_id) +# + + +class ProjectActions::IssueCommentEvent < ProjectAction + def self.build(project, user, issue, journal) + project_action = new(project: project, user: user) + project_action.event_extra = { + issue_id: issue.id, + issue_number: issue.project_issues_index, + body: journal.notes + } + project_action.save! + end +end diff --git a/app/models/project_actions/issues_event.rb b/app/models/project_actions/issues_event.rb new file mode 100644 index 000000000..a51536a35 --- /dev/null +++ b/app/models/project_actions/issues_event.rb @@ -0,0 +1,33 @@ +# == Schema Information +# +# Table name: project_actions +# +# id :integer not null, primary key +# project_id :integer +# type :string(255) +# user_id :integer +# event_extra :text(65535) +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_project_actions_on_project_id (project_id) +# + + +class ProjectActions::IssuesEvent < ProjectAction + def self.build(project, user, issue, action) + project_action = new(project: project, user: user) + project_action.event_extra = { + issue_id: issue.id, + issue_number: issue.project_issues_index, + issue_author_id: issue.author_id, + issue_author_login: issue.user.login, + title: issue.subject, + body: issue.description, + action: action + } + project_action.save! + end +end diff --git a/app/models/project_actions/pull_request_event.rb b/app/models/project_actions/pull_request_event.rb new file mode 100644 index 000000000..b27e43c41 --- /dev/null +++ b/app/models/project_actions/pull_request_event.rb @@ -0,0 +1,41 @@ +# == Schema Information +# +# Table name: project_actions +# +# id :integer not null, primary key +# project_id :integer +# type :string(255) +# user_id :integer +# event_extra :text(65535) +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_project_actions_on_project_id (project_id) +# + + +class ProjectActions::PullRequestEvent < ProjectAction + def self.build(project, user, pull_request, action) + project_action = new(project: project, user: user) + gitea_pull_request = Gitea::PullRequest::FilesService.call(project.owner.login, project.identifier, pull_request.gitea_number, project&.owner&.gitea_token) + project_action.event_extra = { + action: action, + pull_id: pull_request.id, + pull_number: pull_request.gitea_number, + title: pull_request.title, + body: pull_request.body, + git_diff: gitea_pull_request, + additions: gitea_pull_request['TotalAddition'], + deletions: gitea_pull_request['TotalDeletion'], + changed_files: gitea_pull_request['NumFiles'], + merged: pull_request.status == 1, + base_ref: pull_request.base, + head_repo_id: pull_request.is_original ? pull_request.fork_project_id : pull_request.project_id, + head_repo_name: pull_request.project&.identifier, + head_ref: pull_request.head + } + project_action.save! + end +end diff --git a/app/models/project_actions/pull_request_review_comment_event.rb b/app/models/project_actions/pull_request_review_comment_event.rb new file mode 100644 index 000000000..a1a2fa0f6 --- /dev/null +++ b/app/models/project_actions/pull_request_review_comment_event.rb @@ -0,0 +1,29 @@ +# == Schema Information +# +# Table name: project_actions +# +# id :integer not null, primary key +# project_id :integer +# type :string(255) +# user_id :integer +# event_extra :text(65535) +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_project_actions_on_project_id (project_id) +# + + +class ProjectActions::PullRequestReviewCommentEvent < ProjectAction + def self.build(project, user, pull_request, journal) + project_action = new(project: project, user: user) + project_action.event_extra = { + pull_id: pull_request.id, + pull_number: pull_request.gitea_number, + body: journal.notes + } + project_action.save! + end +end diff --git a/app/models/project_actions/release_event.rb b/app/models/project_actions/release_event.rb new file mode 100644 index 000000000..2505d1603 --- /dev/null +++ b/app/models/project_actions/release_event.rb @@ -0,0 +1,29 @@ +# == Schema Information +# +# Table name: project_actions +# +# id :integer not null, primary key +# project_id :integer +# type :string(255) +# user_id :integer +# event_extra :text(65535) +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_project_actions_on_project_id (project_id) +# + + +class ProjectActions::ReleaseEvent < ProjectAction + def self.build(project, user, version_release) + project_action = new(project: project, user: user) + project_action.event_extra = { + tag_name: version_release.tag_name, + name: version_release.name, + body: version_release.body + } + project_action.save! + end +end diff --git a/app/models/project_actions/star_event.rb b/app/models/project_actions/star_event.rb new file mode 100644 index 000000000..87e33650f --- /dev/null +++ b/app/models/project_actions/star_event.rb @@ -0,0 +1,24 @@ +# == Schema Information +# +# Table name: project_actions +# +# id :integer not null, primary key +# project_id :integer +# type :string(255) +# user_id :integer +# event_extra :text(65535) +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_project_actions_on_project_id (project_id) +# + +class ProjectActions::StarEvent < ProjectAction + def self.build(project, user) + project_action = new(project: project, user: user) + project_action.save! + end + +end diff --git a/db/migrate/20250825061956_create_project_actions.rb b/db/migrate/20250825061956_create_project_actions.rb new file mode 100644 index 000000000..d2b72823d --- /dev/null +++ b/db/migrate/20250825061956_create_project_actions.rb @@ -0,0 +1,12 @@ +class CreateProjectActions < ActiveRecord::Migration[5.2] + def change + create_table :project_actions do |t| + t.references :project + t.string :type + t.integer :user_id + t.text :event_extra + + t.timestamps + end + end +end From 6a8ef3ac3bfb69a56d6c2361a3f76b3ee3ddd6bd Mon Sep 17 00:00:00 2001 From: yystopf Date: Wed, 27 Aug 2025 16:04:08 +0800 Subject: [PATCH 12/12] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E9=A1=B9=E7=9B=AE=E8=A1=8C=E4=B8=BA=E6=9E=84=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/projects/pulls/pulls_controller.rb | 1 + app/controllers/journals_controller.rb | 2 +- app/controllers/pull_requests_controller.rb | 4 +++- app/controllers/version_releases_controller.rb | 1 + app/controllers/watchers_controller.rb | 3 +++ app/services/api/v1/issues/create_service.rb | 3 +++ app/services/api/v1/issues/journals/create_service.rb | 2 +- app/services/api/v1/issues/update_service.rb | 10 ++++++++++ app/services/projects/fork_service.rb | 3 ++- 9 files changed, 25 insertions(+), 4 deletions(-) diff --git a/app/controllers/api/v1/projects/pulls/pulls_controller.rb b/app/controllers/api/v1/projects/pulls/pulls_controller.rb index c8a1d0cab..65b7d78f7 100644 --- a/app/controllers/api/v1/projects/pulls/pulls_controller.rb +++ b/app/controllers/api/v1/projects/pulls/pulls_controller.rb @@ -24,6 +24,7 @@ class Api::V1::Projects::Pulls::PullsController < Api::V1::BaseController else @result_object = Api::V1::Projects::Pulls::ReopenService.call(@project, @pull_request, current_user) if @result_object + ProjectActions::PullRequestEvent.build(@project, current_user, @pull_request, "reopened") render_ok else render_error("合并请求重新打开失败!") diff --git a/app/controllers/journals_controller.rb b/app/controllers/journals_controller.rb index 6b9abd5c6..03cf61750 100644 --- a/app/controllers/journals_controller.rb +++ b/app/controllers/journals_controller.rb @@ -48,7 +48,7 @@ class JournalsController < ApplicationController AtmeService.call(current_user, @atme_receivers, journal) if @atme_receivers.size > 0 TouchWebhookJob.set(wait: 5.seconds).perform_later('PullRequestComment', @issue&.id, current_user.id, journal.id, 'created', {}) # @issue.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "journal") - + ProjectActions::PullRequestReviewCommentEvent.build(@issue.project, current_user, @issue.pull_request, journal) if @issue.issue_classify == "pull_request" # author: zxh # 调用上链API push_activity_2_blockchain("issue_comment_create", journal) if Site.has_blockchain? && @project.use_blockchain diff --git a/app/controllers/pull_requests_controller.rb b/app/controllers/pull_requests_controller.rb index dd10ddad1..27ca1372f 100644 --- a/app/controllers/pull_requests_controller.rb +++ b/app/controllers/pull_requests_controller.rb @@ -75,7 +75,7 @@ class PullRequestsController < ApplicationController SendTemplateMessageJob.perform_later('ProjectPullRequest', current_user.id, @pull_request&.id) if Site.has_notice_menu? Rails.logger.info "[ATME] maybe to at such users: #{@atme_receivers.pluck(:login)}" AtmeService.call(current_user, @atme_receivers, @pull_request) if @atme_receivers.size > 0 - + ProjectActions::PullRequestEvent.build(@project, current_user, @pull_request, "opened") # author: zxh # 调用上链API push_activity_2_blockchain("pull_request_create", @pull_request) if Site.has_blockchain? && @project.use_blockchain @@ -177,6 +177,7 @@ class PullRequestsController < ApplicationController # 合并请求下issue处理为关闭 @issue&.update_attributes!({status_id:5}) SendTemplateMessageJob.perform_later('PullRequestClosed', current_user.id, @pull_request.id) if Site.has_notice_menu? + ProjectActions::PullRequestEvent.build(@project, current_user, @pull_request, "closed") normal_status(1, "已拒绝") else normal_status(-1, '合并失败') @@ -247,6 +248,7 @@ class PullRequestsController < ApplicationController # 合并请求下issue处理为关闭 @issue&.update_attributes!({status_id:5}) + ProjectActions::PullRequestEvent.build(@project, current_user, @pull_request, "closed") SendTemplateMessageJob.perform_later('PullRequestMerged', current_user.id, @pull_request.id) if Site.has_notice_menu? normal_status(1, "合并成功") else diff --git a/app/controllers/version_releases_controller.rb b/app/controllers/version_releases_controller.rb index dd80bf6ab..29be84266 100644 --- a/app/controllers/version_releases_controller.rb +++ b/app/controllers/version_releases_controller.rb @@ -56,6 +56,7 @@ class VersionReleasesController < ApplicationController if params[:attachment_ids].present? create_attachments(params[:attachment_ids], version_release) end + ProjectActions::ReleaseEvent.build(@project, current_user, version_release) normal_status(0, "发布成功") else normal_status(-1, "发布失败") diff --git a/app/controllers/watchers_controller.rb b/app/controllers/watchers_controller.rb index b0305ce81..4d5b5a799 100644 --- a/app/controllers/watchers_controller.rb +++ b/app/controllers/watchers_controller.rb @@ -27,6 +27,9 @@ class WatchersController < ApplicationController def follow begin return normal_status(2, "你已关注了") if current_user.watched?(@target) + if @target.is_a?(Project) + ProjectActions::StarEvent.build(@target, current_user) + end current_user.watch!(@target) render_ok({watchers_count: @target.watchers_count, watched: true}) rescue Exception => e diff --git a/app/services/api/v1/issues/create_service.rb b/app/services/api/v1/issues/create_service.rb index fdbdc71ed..b0056aced 100644 --- a/app/services/api/v1/issues/create_service.rb +++ b/app/services/api/v1/issues/create_service.rb @@ -97,6 +97,9 @@ class Api::V1::Issues::CreateService < ApplicationService # @信息发送 AtmeService.call(current_user, @atme_receivers, @created_issue) unless receivers_login.blank? + # 项目行为构建 + ProjectActions::IssuesEvent.build(@project, current_user, @created_issue, 'opened') + # 发消息 if Site.has_notice_menu? SendTemplateMessageJob.perform_later('IssueAssigned', current_user.id, @created_issue&.id, assigner_ids) unless assigner_ids.blank? diff --git a/app/services/api/v1/issues/journals/create_service.rb b/app/services/api/v1/issues/journals/create_service.rb index 5f57c4f07..c04011610 100644 --- a/app/services/api/v1/issues/journals/create_service.rb +++ b/app/services/api/v1/issues/journals/create_service.rb @@ -40,7 +40,7 @@ class Api::V1::Issues::Journals::CreateService < ApplicationService @issue.save! push_activity_2_blockchain("issue_comment_create", @created_journal) if Site.has_blockchain? && @issue.project&.use_blockchain - + ProjectActions::IssueCommentEvent.build(@issue.project, current_user, @issue, @created_journal) # @信息发送 AtmeService.call(current_user, @atme_receivers, @created_journal) unless receivers_login.blank? TouchWebhookJob.set(wait: 5.seconds).perform_later('IssueComment', @issue&.id, @current_user.id, @created_journal.id, 'created', {}) diff --git a/app/services/api/v1/issues/update_service.rb b/app/services/api/v1/issues/update_service.rb index dbdebf932..a28ff8324 100644 --- a/app/services/api/v1/issues/update_service.rb +++ b/app/services/api/v1/issues/update_service.rb @@ -98,6 +98,7 @@ class Api::V1::Issues::UpdateService < ApplicationService build_after_issue_journal_details if @updated_issue.previous_changes.present? # 操作记录 build_previous_issue_changes build_issue_project_trends if status_id.present? # 开关时间记录 + build_project_actions build_cirle_blockchain_token if blockchain_token_num.present? unless @project.id.zero? # @信息发送 @@ -185,6 +186,15 @@ class Api::V1::Issues::UpdateService < ApplicationService end end + def build_project_actions + if @updated_issue.previous_changes["status_id"].present? && @updated_issue.previous_changes["status_id"][1] == 5 + ProjectActions::IssuesEvent.build(@project, current_user, @updated_issue, 'closed') + end + if @updated_issue.previous_changes["status_id"].present? && @updated_issue.previous_changes["status_id"][0] == 5 + ProjectActions::IssuesEvent.build(@project, current_user, @updated_issue, 'reopened') + end + end + def build_after_issue_journal_details begin # 更改标题 diff --git a/app/services/projects/fork_service.rb b/app/services/projects/fork_service.rb index 63475f2b4..0ec3bfabf 100644 --- a/app/services/projects/fork_service.rb +++ b/app/services/projects/fork_service.rb @@ -39,7 +39,8 @@ class Projects::ForkService < ApplicationService ForkUser.create(project_id: @project.id, fork_project_id: clone_project.id, user_id: clone_project.user_id) SendTemplateMessageJob.perform_later('ProjectForked', @target_owner.id, @project.id) if Site.has_notice_menu? - + ProjectActions::ForkEvent.build(@project, @target_owner, clone_project) + clone_project end rescue => e