CustomtaskCronService.class.php 4.8 KB
<?php
/**
 * Created by PhpStorm.
 * User: liyifei2012it
 * Date: 17/5/18
 * Time: 11:36
 */
namespace Common\Service;

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

class CustomtaskCronService extends AbstractService
{
    // 构造方法
    public function __construct()
    {
        parent::__construct();
        $this->_d = new CustomtaskCronModel();
    }

    /**
     * @desc 创建定时发送常规任务的计划任务
     * @author tangxingguo
     * @param array $cunstomtask 常规任务信息
     * @return bool
     */
    public function sendCustomtask($cunstomtask)
    {
        if ($cunstomtask['start_time'] <= MILLI_TIME) {
            return false;
        }

        // 创建计划任务
        $cronSdk = new Cron(Service::instance());
        $cronTime = rgmdate($cunstomtask['start_time'], '0 i H d m ? Y');
        $result = $cronSdk->add([
            'crRemark' => sprintf('%s/%s/%s/SendCustomtask', QY_DOMAIN, APP_IDENTIFIER, $cunstomtask['customtask_id']),
            'crDescription' => '定时发布常规任务',
            'crReqUrl' => oaUrl('Frontend/Callback/SendCustomtask/Index', ['customtask_id' => $cunstomtask['customtask_id']]),
            'crMethod' => 'GET',
            'crCron' => $cronTime,
        ]);

        // 记录计划任务
        if (is_array($result) && isset($result['crId'])) {
            $this->insert([
                'customtask_id' => $cunstomtask['customtask_id'],
                'cron_id' => $result['crId'],
            ]);

            // 更新计划任务回调地址
            $cronSdk->update([
                'crId' => $result['crId'],
                'crMethod' => 'GET',
                'crReqUrl' => oaUrl('Frontend/Callback/SendCustomtask/Index', ['customtask_id' => $cunstomtask['customtask_id'], 'cron_id' => $result['crId']]),
            ]);
            return true;
        }

        return false;
    }

    /**
     * @desc 创建定时终止常规任务的计划任务
     * @author tangxingguo
     * @param array $cunstomtask 常规任务信息
     * @return bool
     */
    public function stopCustomtask($cunstomtask)
    {
        if ($cunstomtask['end_time'] <= MILLI_TIME) {
            return false;
        }

        // 创建计划任务
        $cronSdk = new Cron(Service::instance());
        $cronTime = rgmdate($cunstomtask['end_time'], '0 i H d m ? Y');
        $result = $cronSdk->add([
            'crRemark' => sprintf('%s/%s/%s/StopCustomtask', QY_DOMAIN, APP_IDENTIFIER, $cunstomtask['customtask_id']),
            'crDescription' => '定时终止常规任务',
            'crReqUrl' => oaUrl('Frontend/Callback/StopCustomtask/Index', ['customtask_id' => $cunstomtask['customtask_id']]),
            'crMethod' => 'GET',
            'crCron' => $cronTime,
        ]);

        // 记录计划任务
        if (is_array($result) && isset($result['crId'])) {
            $this->insert([
                'customtask_id' => $cunstomtask['customtask_id'],
                'cron_id' => $result['crId'],
            ]);
            // 更新计划任务回调地址
            $cronSdk->update([
                'crId' => $result['crId'],
                'crMethod' => 'GET',
                'crReqUrl' => oaUrl('Frontend/Callback/StopCustomtask/Index', ['customtask_id' => $cunstomtask['customtask_id'], 'cron_id' => $result['crId']]),
            ]);
            return true;
        }

        return false;
    }

    /**
     * @desc 删除计划任务
     * @author tangxingguo
     * @param string $cronId 计划任务ID
     * @return bool
     */
    public function deleteCron_deprecated($cronId)
    {
        // 删除UC计划任务
        $cronSdk = new Cron(Service::instance());
        $cronSdk->delete($cronId);

        // 删除本地计划任务表
        $this->delete_by_conds(['cron_id' => $cronId]);
    }

    /**
     * 删除计划任务
     * @author zhonglei
     * @param int $customtask_id 常规任务ID
     * @param string $cron_id 计划任务ID,不传则删除常规任务下所有计划任务
     * @return bool
     */
    public function deleteCron($customtask_id, $cron_id = '')
    {
        $conds = ['customtask_id' => $customtask_id];

        if (!empty($cron_id)) {
            $conds['cron_id'] = $cron_id;
        }

        $list = $this->list_by_conds($conds);

        if (!empty($list)) {
            $cronSdk = new Cron(Service::instance());

            foreach ($list as $v) {
                $this->delete($v['customtask_cron_id']);

                try {
                    $cronSdk->delete($v['cron_id']);
                } catch (\Exception $e) {
                    Log::record("customtask cron delete fail, customtask_id: {$customtask_id}, cron_id: {$v['cron_id']}", Log::ERR);
                }
            }

            return true;
        }

        return false;
    }
}