使用Rake任务+系统Cron
用Redmine内置的Rake任务配合系统Cron来实现:
1. 创建Rake任务文件
# 创建文件
vim /opt/redmine/lib/tasks/auto_update_status.rake
2. 添加以下内容:
# /opt/redmine/lib/tasks/auto_update_status.rake
namespace :redmine do
namespace :auto_update do
desc "自动将开始日期已到且状态为新建的任务改为进行中"
task :update_status => :environment do
puts "开始执行自动状态更新任务: #{Time.now}"
# 获取状态ID(请根据您的实际ID调整)
new_status_id = 1 # 新建状态ID
in_progress_status_id = 2 # 进行中状态ID
# 查询需要更新的任务
issues = Issue.where(status_id: new_status_id)
.where("start_date IS NOT NULL AND start_date <= ?", Date.today)
puts "找到 #{issues.count} 个需要更新的任务"
updated_count = 0
issues.find_each do |issue| # 使用find_each分批处理,避免内存问题
begin
# 更新状态
issue.init_journal(User.anonymous, "【系统自动】任务开始日期已到,状态自动变更为'进行中'")
issue.status_id = in_progress_status_id
if issue.save
updated_count += 1
puts "成功更新任务 ##{issue.id}: #{issue.subject}"
else
puts "更新任务 ##{issue.id} 失败: #{issue.errors.full_messages}"
end
rescue => e
puts "处理任务 ##{issue.id} 时出错: #{e.message}"
end
end
puts "任务执行完成,共更新 #{updated_count} 个任务"
end
end
end
3. 设置Cron定时任务
# 编辑cron
crontab -e
# 添加以下行(每天凌晨2点执行)
0 2 * * * cd /opt/redmine && /usr/local/bin/bundle exec rake redmine:auto_update:update_status RAILS_ENV=production >> /opt/redmine/log/auto_update.log 2>&1
# 或者每15分钟执行一次
# */15 * * * * cd /path/to/redmine && /usr/local/bin/bundle exec rake redmine:auto_update:update_status RAILS_ENV=production >> /path/to/redmine/log/auto_update.log 2>&1
4. 测试任务
# 手动执行测试
cd /path/to/redmine
RAILS_ENV=production bundle exec rake redmine:auto_update:update_status
# 查看日志
tail -f /path/to/redmine/log/auto_update.log