redmine定时将任务状态更新为进行中


使用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

文章作者: TerSup
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 TerSup !
  目录