CronService.class.php 3.62 KB
<?php
/**
 * Created by PhpStorm.
 * User: liyifei2012it
 * Date: 18/5/17
 * Time: 23:42
 */
namespace Common\Service;

use Think\Log;
use VcySDK\Cron;
use VcySDK\Service;
use Common\Model\CronModel;

class CronService extends AbstractService
{
    public function __construct()
    {
        parent::__construct();

        $this->_d = new CronModel();
    }

    /**
     * 创建并保存发放学分的计划任务
     * @author liyifei
     * @param array $article 线下课程详情
     * @return bool
     */
    public function saveCron($article)
    {
        // 是否已存在计划任务
        $article_id = $article['article_id'];
        $cronServ = new CronService();
        $cron = $cronServ->get_by_conds(['article_id' => $article_id]);

        // 计划任务参数
        $cronSdk = new Cron(Service::instance());
        $callback_url = 'Frontend/Callback/GrantCredit/Index';
        $params = [
            'crRemark' => sprintf('%s/%s/%s/GrantCredit', QY_DOMAIN, APP_IDENTIFIER, $article['article_id']),
            'crDescription' => '授课结束后定时发放学分',
            'crReqUrl' => oaUrl($callback_url, ['article_id' => $article['article_id']]),
            'crMethod' => 'POST',
            'crCron' => rgmdate($article['end_time'], '0 i H d m ? Y'),
        ];

        // 新增计划任务
        if (empty($cron)) {
            try {
                $result = $cronSdk->add($params);

                if (is_array($result) && isset($result['crId'])) {
                    // 修改计划任务回调Url,加上计划任务ID
                    $cronSdk->update([
                        'crId' => $result['crId'],
                        'crReqUrl' => oaUrl($callback_url, ['article_id' => $article['article_id'], 'cron_id' => $result['crId']]),
                    ]);

                } else {
                    Log::record('create cron fail: ' . var_export($result, true), Log::ERR);
                }

            } catch (\Exception $e) {
                Log::record('create update cron fail: ' . $e->getMessage(), Log::ERR);
            }

            // 本地保存计划任务
            if (isset($result['crId'])) {

                $cronServ->insert(['article_id' => $article['article_id'], 'cron_id' => $result['crId']]);
            }

        // 修改计划任务
        } else {
            unset($params['crReqUrl']);
            $params['crId'] = $cron['cron_id'];

            try {
                // 修改计划任务回调Url,加上计划任务ID
                $cronSdk->update($params);

            } catch (\Exception $e) {
                Log::record('update cron fail: ' . $e->getMessage(), Log::ERR);
            }
        }

        return true;
    }

    /**
     * 删除计划任务(本地+UC)
     * @author liyifei
     * @param string $cron_id UC计划任务ID
     * @param int $article_id 线下课程ID
     * @return bool
     */
    public function delCron($cron_id = '', $article_id = 0)
    {
        if (empty($cron_id) && empty($article_id)) {
            return false;
        }

        // 删除本地计划任务
        $conds = [];
        if (strlen($cron_id) > 0) {
            $conds['cron_id'] = $cron_id;
        }
        if ($article_id > 0) {
            $conds['article_id'] = $article_id;
        }
        $cronServ = new CronService();
        $cronServ->delete_by_conds($conds);

        // 删除UC计划任务
        try {
            $cronSdk = new Cron(Service::instance());
            $cronSdk->delete($cron_id);

        } catch (\Exception $e) {
            Log::record('delete uc crontab fail: ' . $e->getMessage(), Log::ERR);
        }

        return true;
    }
}