ProjectUpdateTdk.php 2.8 KB
<?php
/**
 * @remark :
 * @name   :ProjectUpdateTdk.php
 * @author :lyh
 * @method :post
 * @time   :2023/11/8 11:18
 */

namespace App\Models\Project;

use App\Helper\Arr;
use App\Models\Base;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

class ProjectUpdateTdk extends Base
{
    //设置关联表名
    protected $table = 'gl_project_update_tdk';

    const STATUS_PENDING = 0;
    const STATUS_SUCCESS = 1;
    const STATUS_FAIL = 2;

    /**
     * 新建任务
     * @param $project_id
     * @author zbj
     * @date 2023/11/9
     */
    public static function add_task($project_id){
        $model = new self();
        $model->project_id = $project_id;
        $model->save();
    }

    /**
     * 获取待处理任务
     * @return mixed
     * @author zbj
     * @date 2023/11/9
     */
    public static function getPendingTask(){
       return self::where('status', self::STATUS_PENDING)->orderBy('id', 'asc')->first();
    }

    /**
     * 重试任务
     * @param $id
     * @param $remark
     * @author zbj
     * @date 2023/11/9
     */
    public static function retry($id, $remark)
    {
        DB::beginTransaction();
        try {
            //行锁 避免脏读写
            $data = self::where('id', $id)->lockForUpdate()->first();
            $data->retry = $data->retry + 1;
            if ($data->retry > 3) {
                $data->status = self::STATUS_FAIL;
            }else{
                $data->status = self::STATUS_PENDING;
            }
            $data->remark = mb_substr($remark, 0, 250);
            $data->save();

            DB::commit();
        } catch (\Exception $e) {
            DB::rollback();
            Log::error('project_update_tdk retry error:' . $e->getMessage());
        }
    }

    /**
     * 完成
     * @param $id
     * @param $update_data
     * @author zbj
     * @date 2023/11/9
     */
    public static function finish($id, $update_data){
        DB::beginTransaction();
        try {
            //行锁 避免脏读写
            $data = self::where('id', $id)->lockForUpdate()->first();
            $data->status = self::STATUS_SUCCESS;

            foreach($update_data as $field => $item){
                $old_date = Arr::s2a($data->$field);
                $new_data = [];
                foreach($item as $k=>$v){
                    if($k == 'total_page'){
                        $new_data[$k] = $v;
                    }else{
                        $new_data[$k] = $v + ($old_date[$k] ?? 0);
                    }
                }
                $data->$field = $new_data;
            }

            $data->save();

            DB::commit();
        } catch (\Exception $e) {
            DB::rollback();
            Log::error('project_update_tdk finish error:' . $e->getMessage());
        }
    }
}