ArticleService.class.php 10.3 KB
<?php
/**
 * Created by PhpStorm.
 * User: liyifei2012it
 * Date: 17/4/12
 * Time: 10:46
 */
namespace Common\Service;

use Com\Rpc;
use Common\Common\ArticleHelper;
use Common\Common\Constant;
use Common\Model\ArticleModel;
use VcySDK\Cron;
use VcySDK\Service;

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

    /**
     * 创建数据标识
     * @author zhonglei
     * @return string
     */
    public function buildDataID()
    {
        $data_id = md5(sprintf('%s_%s_%s', QY_DOMAIN, APP_DIR, MILLI_TIME));
        $count = $this->count_by_conds(['data_id' => $data_id]);

        if ($count == 0) {

            return $data_id;
        }

        return $this->buildDataID();
    }

    /**
     * @desc 课程新闻推荐
     * @author tangxingguo
     * @param int $articleId 课程ID
     * @param array $postRight 用户提交的权限数据
     * @param array $articleInfo 更新的课程信息
     * @return mixed
     */
    public function addCourseRpc($articleId, $postRight, $articleInfo = [])
    {
        // 草稿不推送
        $info = $this->get($articleId);
        if (empty($info) || Constant::ARTICLE_STATUS_DRAFT == $info['article_status']) {

            return false;
        }

        // 非首次添加的情况,使用提交的数据
        if (!empty($articleInfo)) {
            // 将课程ID,数据标识加入最新的课程信息
            $articleInfo['article_id'] = $articleId;
            $articleInfo['data_id'] = $info['data_id'];
        } else {

            $articleInfo = $info;
        }

        // 权限数据
        $articleHelper = &ArticleHelper::instance();
        $articleInfo['right'] = $articleHelper->formatRightForRPC($postRight);

        // 格式化RPC参数
        $param_arr = $this->formatRpcParams($articleInfo, 1);

        // 推送
        $url = rpcUrl('/Public/Rpc/Recommender/ArticleNew');
        $res = Rpc::phprpc($url)->invoke('Index', $param_arr);

        return $res;
    }

    /**
     * @desc 更新新闻推荐
     * @author tangxingguo
     * @param int $articleId 课程ID
     * @param array $articleInfo 更新的课程信息
     * @param array $postRight 用户提交的权限数据
     * @return mixed
     */
    public function updateCourseRpc($articleId, $articleInfo, $postRight)
    {
        // 草稿不推送
        if (Constant::ARTICLE_STATUS_DRAFT == $articleInfo['article_status']) {

            return false;
        }

        // 将课程ID,数据标识加入最新的课程信息
        $info = $this->get($articleId);
        if (empty($info)) {

            return false;
        }

        $articleInfo['article_id'] = $articleId;
        $articleInfo['data_id'] = $info['data_id'];

        // 权限数据
        $articleHelper = &ArticleHelper::instance();
        $articleInfo['right'] = $articleHelper->formatRightForRPC($postRight);

        // 格式化RPC参数
        $param_arr = $this->formatRpcParams($articleInfo, 1);

        // 推送
        $url = rpcUrl('/Public/Rpc/Recommender/ArticleUpdate');
        $res = Rpc::phprpc($url)->invoke('Index', $param_arr);

        return $res;
    }

    /**
     * @desc 删除课程推荐
     * @author tangxingguo
     * @param int $articleId 课程ID
     * @return mixed
     */
    public function delCourseRpc($articleId)
    {

        $articleInfo = $this->get($articleId);
        if (empty($articleInfo)) {

            return false;
        }

        // 格式化RPC参数
        $param_arr = $this->formatRpcParams($articleInfo, 2);

        // 推送
        $url = rpcUrl('/Public/Rpc/Recommender/ArticleDelete');
        $res = Rpc::phprpc($url)->invoke('Index', $param_arr);

        return $res;
    }

    /**
     * @desc 格式化RPC数据
     * @author tangxingguo
     * @param array $articleInfo 课程信息
     * @param int $paramType 数据类型(1=添加、更新;2=删除)
     * @return array RPC参数
     */
    private function formatRpcParams($articleInfo, $paramType)
    {
        $param_arr = [];
        switch ($paramType) {
            // 更新或添加
            case 1:
                $param_arr = [
                    // 被推荐数据所在应用模块目录标识名
                    'app'=>'Course',
                    // 被推荐数据所属的分类Id,可以为空,但必须提供该参数
                    'dataCategoryId' => $articleInfo['class_id'],
                    // 被推荐数据的原始数据 Id
                    'dataId' => $articleInfo['article_id'],
                    // 文章标题
                    'title' => $articleInfo['article_title'],
                    // 文章摘要
                    'summary' => $articleInfo['summary'],
                    // 封面图片附件 ID
                    'attachId' => $articleInfo['cover_id'],
                    // 封面图片 url
                    'pic' => $articleInfo['cover_url'],
                    // 文章链接
                    'url' => 'Course/Frontend/Index/Detail/Index?article_id=' . $articleInfo['article_id'] . '&data_id=' . $articleInfo['data_id'] . '&article_type=' . $articleInfo['article_type'],
                    // 文章发布时间戳,不设置或者为空,则以推荐时间为准
                    'dateline' => $articleInfo['update_time'],
                    // 文章阅读权限范围,为空则表示全部人员,否则需要构造数组
                    'right' => $articleInfo['right'],
                    // 数据类型
                    'dataType' => Constant::SOURCE_TYPE_VALUE[$articleInfo['source_type']],
                ];
                break;
            // 删除
            case 2:
                $param_arr = [
                    // 被推荐数据所在应用模块目录标识名
                    'app'=>'Course',
                    // 被推荐数据所属的分类Id,可以为空,但必须提供该参数
                    'dataCategoryId' => $articleInfo['class_id'],
                    // 被推荐数据的原始数据 Id
                    'dataId' => $articleInfo['article_id'],
                ];
                break;
        }

        return $param_arr;
    }

    /**
     * 根据动作Key获取策略ID
     * @author zhonglei
     * @param array $article 课程数据
     * @param string $action_key 动作Key
     * @return string
     */
    public function getStrategyID($article, $action_key)
    {
        $strategy_id = '';

        if (!is_array($article) || empty($article)) {

            return $strategy_id;
        }

        // 非自定义策略
        if ($article['strategy_setting'] != Constant::COURSE_STRATEGY_CUSTOM) {

            return $strategy_id;
        }

        // 反序列化
        if (!is_array($article['strategys'])) {

            $article['strategys'] = empty($article['strategys']) ? [] : unserialize($article['strategys']);
        }

        // 根据动作Key获取策略ID
        if (isset($article['strategys'][$action_key])) {

            $strategy_id = $article['strategys'][$action_key];
        }

        return $strategy_id;
    }

    /**
     * 根据讲师ID获取关联的课程数
     * @ahthor liyifei
     * @param array $teacher_ids 讲师ID
     * @return array
     */
    public function getTotalByTeacherIds($teacher_ids)
    {

        return $this->_d->getTotalByTeacherIds($teacher_ids);
    }

    /**
     * 增加定时任务
     * @param int $id 新闻ID
     * @param int $cronTime 执行时间
     * @return bool
     */
    public function cronAdd($id, $cronTime)
    {
        // 实例化定时任务类
        $cron_serv = new Cron(Service::instance());

        // 参数
        $conds_remind = [
            'crRemark' => 'course_cron',
            'crType' => 2,
            'crParams' => json_encode(['article_id' => $id]),
            'crMethod' => 'POST',
            'crReqUrl' => oaUrl('Frontend/Callback/Release/Index'), // 回调地址
            'crTimes' => 1,
            'crCron' => rgmdate((String)$cronTime, 's i G j n ? Y'),
            'crMonitorExecution' => 0,
            'crDescription' => '课程中心定时发布'
        ];

        // 创建定时任务
        $res_publish = $cron_serv->add($conds_remind);
        $cron_publish = $res_publish['crId'];

        $this->update($id, [
            'release_crid' => $cron_publish,
            'cron_time' => $cronTime,
            'cron_status' => Constant::ARTICLE_CRON_STATUS_OK
        ]);

        return true;
    }

    /**
     * 发布课程
     * @param int $id 课程ID
     * @return bool
     */
    public function release($id)
    {
        // 获取数据
        $data = $this->get($id);

        // 当状态不为预发布,不执行
        if ($data['article_status'] != Constant::ARTICLE_STATUS_CRON) {
            return true;
        }

        // 修改状态
        $this->update($id, ['article_status' => Constant::ARTICLE_STATUS_SEND]);

        // 消息提醒
        if ($data['is_notice'] == Constant::ARTICLE_IS_NOTICE_TRUE) {
            $articleHelper = &ArticleHelper::instance();

            // 获取分类
            $classService = new ClassService();
            $class_list = $classService->list_all();
            $class_list = array_combine_by_key($class_list, 'class_id');
            $class_id = $data['class_id'];
            if (!isset($class_list[$class_id])) {
                E('_ERR_CLASS_DATA_NOT_FOUND');
            }
            // 获取一级分类
            while ($class_list[$class_id]['parent_id'] > 0) {
                $class_id = $class_list[$class_id]['parent_id'];
            }

            // 获取推送人员
            list($uids_all, , ) = $articleHelper->getStudyData($id);

            $article_data['article_id'] = $id;
            $article_data['class_name'] = $class_list[$class_id];
            $articleHelper->sendMsg($article_data, $uids_all);
        }

        // RPC 推送
        if ($data['is_recommend'] == Constant::ARTICLE_IS_RECOMMEND_TRUE) {
            // 获取推送人数据
            $rightService = new RightService();
            $conds = ['article_id' => $id];
            $rightList = $rightService->list_by_conds($conds);
            $rights = $rightService->formatToPost($rightList);
            $this->addCourseRpc($id, $rights);
        }
        return true;
    }
}