<?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); } } }