VhallService.class.php 5.43 KB
<?php
/**
 * 微吼直播消息通知记录表 (防止重复推送)
 */

namespace Common\Service;

use Common\Common\Constant;
use Common\Model\VhallModel;
use Common\Model\VhMsgLogModel;
use VcySDK\Cron;
use VcySDK\Service;

class VhallService extends AbstractService
{

    // 构造方法
    public function __construct()
    {
        $this->_d = new VhallModel();

        parent::__construct();
    }

    /**
     * 获取目标范围内没有发送过消息的 uids
     * @param int $lmId
     * @param array $rangeUids 范围对象内的人员 ID
     * @param bool $rangeIsAll 如果范围是全公司
     * @return array
     */
    public function sendMsgRangeDiffUids($lmId, $rangeUids, $rangeIsAll = false)
    {
        // 获取历史消息推送记录
        $msgLogList = [];
        $msgLogServ = new MsgLogService();
        if (!empty($lmId)) {
            $msgLogConds = ['vh_id' => $lmId, 'type' => VhMsgLogModel::TYPE_LIVE_PUSH];
            $msgLogList = $msgLogServ->list_by_conds($msgLogConds);
        }

        if (!empty($msgLogList)) {
            // 有全公司 不用再发消息了
            if (in_array(Constant::RANGE_TYPE_ALL, array_column($msgLogList, 'obj_id'))) {
                return [];
            }

            // 去掉已经发过的
            foreach ($msgLogList as $item) {
                $uids = explode(',', $item['obj_id']);
                $rangeUids = array_diff($rangeUids, $uids);
            }
        }

        // 写入数据库
        if (!empty($rangeUids)) {
            // 如果是全公司
            if ($rangeIsAll) {
                $msgLogServ->insert([
                    'vh_id' => $lmId,
                    'obj_id' => Constant::RANGE_TYPE_ALL,
                    'type' => VhMsgLogModel::TYPE_LIVE_PUSH
                ]);
            } else {
                $insertLog = [];
                foreach (array_chunk($rangeUids, Constant::OBJ_ID_SINGLE_TOTAL) as $item) {
                    $insertLog[] = [
                        'vh_id' => $lmId,
                        'obj_id' => implode(',', $item),
                        'type' => VhMsgLogModel::TYPE_LIVE_PUSH
                    ];
                }
                $msgLogServ->insert_all($insertLog);
            }
        }

        return $rangeUids;
    }

    /**
     * 创建计划任务并保存
     * @param $lmId
     * @param $remark
     * @param $type
     * @param $time
     * @return bool
     */
    public function createCron($lmId, $remark, $type, $time)
    {
        $cronSdk = new Cron(Service::instance());

        // 建立 Job 发送消息
        $cronResult = $cronSdk->add([
            'crRemark' => $remark,
            'crType' => Cron::CR_TYPE_CALLBACK,
            'crParams' => json_encode([
                'lm_id' => $lmId,
                'type' => $type,
            ]),
            'crMethod' => 'POST',
            // 回调地址
            'crReqUrl' => oaUrl('Frontend/Callback/PushMsg/Index'),
            'crTimes' => 1,
            'crCron' => rgmdate((String)$time, 's i G j n ? Y'),
            'crMonitorExecution' => $cronSdk::CR_MONITOR_EXECUTION_FALSE,
            'crDescription' => '直播开始时推送消息提醒',
        ]);
        if (empty($cronResult['crId'])) {
            E(L('_ERR_CRON_OPTION_FAILED', ['option' => '创建']));
        }

        // 开始前提醒
        if (Constant::TYPE_LIVE_WILL_START == $type) {
            $data['notice_will_start_cron_id'] = $cronResult['crId'];
        }

        // 开始时提醒
        if (Constant::TYPE_LIVE_START == $type) {
            $data['notice_notice_start_cron_id'] = $cronResult['crId'];
        }

        $this->_d->update_by_conds(['vh_id' => $lmId], $data);

        return true;
    }

    /**
     * 开启或者关闭 推荐
     * @param array $data   直播详情数组
     * @param bool  $isOpen 是否开启推荐
     */
    public function openOrCloseRecommender($data, $isOpen = true)
    {
        if ($isOpen) {

            $rpcUrl = rpcUrl('/Public/Rpc/Recommender/ArticleUpdate');
            $rpcParams = [
                'app' => APP_DIR,
                'dataCategoryId' => '',
                'dataId' => $data['id'],
                'title' => $data['liveName'],
                'summary' => $data['liveDesc'],
                'attachId' => $data['liveCover'],
                'pic' => $data['liveCover'],
                'url' => 'Live/Frontend/Index/VhLive/room?liveId=' . $data['id'].'&liveVhallId='.$data['liveVhallId'],
                'endTime' => $data['liveTimeLength'],
                'dateline' => $data['liveStartTime'],
            ];

            // 推荐权限范围
            $feed_right = [];
            // 非全公司
            if (empty($data['liveScopeAll'])) {
                $feed_right['users'] = $data['liveScopeUsers'];
                $feed_right['departments'] = $data['liveScopeDepts'];
                $feed_right['jobs'] = $data['liveScopeJobs'];
                $feed_right['roles'] = $data['liveScopeRoles'];
                $feed_right['tags'] = $data['liveScopeTags'];
            }

            $rpcParams['right'] = $feed_right;

            \Com\Rpc::phprpc($rpcUrl)->invoke('Index', $rpcParams);

        } else {

            $rpcParams=[
                'app' => APP_DIR,
                'dataCategoryId' => '',
                'dataId' => $data['id'],
            ];

            \Com\Rpc::phprpc(rpcUrl('/Public/Rpc/Recommender/ArticleDelete'))->invoke('Index',$rpcParams);
        }
    }

}