Files
liche/api/controllers/plan/Syt.php
T
2022-11-09 16:47:51 +08:00

475 lines
21 KiB
PHP

<?php
/**
* Notes:私域通
* Created on: 2020/11/30 17:00
* Created by: dengbw
*/
defined('BASEPATH') OR exit('No direct script access allowed');
require_once(COMMPATH . "/third_party/WeChat/WechatServer.php");
class Syt extends CI_Controller
{
private $log_file = 'plan_syt.log';
private $log_dir = 'market/sylive';
private $options;
public function __construct()
{
parent::__construct();
$this->options = [
'token' => '',
'appid' => 'wxbdec8558931efffd',
'appsecret' => '583b3cd0d8e145009eda61ece003ca14',
'encodingaeskey' => '',
'debug' => false
];
$this->load->model('market/market_sylive_activity_model');
$this->load->model('live/Live_polyv_session_model', 'mdPolyvSession');
$this->load->model('live/Live_polyv_viewlog_model', 'mdPolyvViewlog');
$this->load->library('PolyvApi');
}
/**
* Notes:发送一次性订阅
* Created on: 2020/11/30 17:02
* Created by: dengbw
* https://liche-api-dev.xiaoyu.com/plan/syt/subscribemsg
* https://api.liche.cn/plan/syt/subscribemsg
*/
public function subscribemsg()
{
$this->load->model('market/market_sylive_subscribemsg_model', 'mdSytSubscribemsg');
$date = date('Y-m-d H:i:s', strtotime('+10 minute'));//提前10分钟发送
$where['timeStart<='] = $date;
$where['status'] = 0;
$res = $this->mdSytSubscribemsg->select($where, 'id asc', 1, 200);
$log = array();
if ($res) {
$wechatS = new WechatServer($this->options);
$wechatS->checkAuth();
$act_ids = implode(',',array_unique(array_column($res,'activityId')));
$act_rows = [];
if($act_ids){
$where = [
"activityId in ($act_ids)" => null
];
$act_rows = $this->market_sylive_activity_model->map('activityId','',$where,'',0,0,'activityId,title');
}
foreach ($res as $key => $value) {
$act = $act_rows['activityId'] ? $act_rows['activityId'][0] : [];
if ($act) {
$content = '您预约“' . $act['title'] . '”直播已经开始啦!赶紧进入直播间观看直播领取福利吧~';
$temp_arr = array(
'touser' => $value['openId'],
'template_id' => $value['templateId'],
'url' => $value['url'],
'scene' => $value['scene'],
'title' => '开播提醒',
'data' => array(
'content' => array('value' => $content)
)
);
$re = $wechatS->subscribeTemplateMessage($temp_arr);
if ($re) {//errcode 0(发送成功) 43101(已发送过)
$this->mdSytSubscribemsg->update(['status' => 1], ['id' => $value['id']]);
if ($re['errcode'] == 0) {
$log[] = $value['a_id'] . '=' . $value['openid'];
}
}
}else{
$this->mdSytSubscribemsg->update(['status' => -1], ['id' => $value['id']]);
}
}
}
echo '<br>数据库获取:';
echo json_encode($res, JSON_UNESCAPED_UNICODE);
echo '<br><br>成功发送:';
$log && print_r($log);
$total = count($res);
$do = count($log);
debug_log("[info] " . __FUNCTION__ . "# date:{$date}; total:{$total}; do:{$do};", $this->log_file);
}
/**
* Notes:私域通直播间数据同步
* https://liche-api-dev.xiaoyu.com/plan/syt/syn_polyv
* https://api.liche.cn/plan/syt/syn_polyv
* Created on: 2022/9/30 15:05
* Created by: dengbw
*/
public function syn_polyv()
{
$a_id = $this->input->get('a_id');
$where = [
'status' => 0,
"channelId <> ''" => null,
"timeStart<" => date('Y-m-d H:i:s'),
"timeStart>" => date('Y-m-d H:i:s', strtotime("-1 day"))
];
$a_id && $where = ['activityId' => $a_id];
$rows = $this->market_sylive_activity_model->select($where, 'activityId desc', 1, 20, 'activityId,channelId,timeStart,timeEnd');
if ($rows) {
foreach ($rows as $item) {
debug_log("开始同步{$item['activityId']}活动直播", $this->log_file, $this->log_dir);
$polyv = new PolyvApi(['channel_id' => $item['channelId']]);
$pl_where = [
'startTime' => strtotime($item['timeStart']) * 1000,
'endTime' => strtotime($item['timeEnd']) * 1000
];
$results = $polyv->getSessionStats($pl_where);
if ($results['status'] == 'success') {
foreach ($results['data']['list'] as $key => $value) {
$re = $this->mdPolyvSession->get(['channelId' => $item['channelId'], 'sessionId' => $value['sessionId']]);
$data = [
'channelId' => $value['channelId'], 'sessionId' => $value['sessionId'], 'name' => $value['name'],
'startTime' => $value['startTime'], 'endTime' => $value['endTime'], 'duration' => $value['duration'],
'liveUV' => $value['liveUV'], 'livePV' => $value['livePV'], 'playbackUV' => $value['playbackUV'],
'playbackPV' => $value['playbackPV'], 'totalPlayDuration' => $value['totalPlayDuration'],
'session_time' => date('Y-m-d H:i:s'),
];
if ($re) {//同步更新数据
$session['id'] = $re['id'];
$this->mdPolyvSession->update($data, ['id' => $re['id']]);
} else {//新增
$data['c_time'] = time();
$session['id'] = $this->mdPolyvSession->add($data);
}
}
$msg = "同步成功:" . json_encode($results, JSON_UNESCAPED_UNICODE);
echo $msg . "<br>";
} else {
$msg = "接口错误:" . $results['message'];
echo $msg . "<br>";
}
debug_log($msg, $this->log_file, $this->log_dir);
}
} else {
echo "暂无同步数据";
}
}
/**
* Notes:同步保利威分页查询频道直播观看详情数据
* Created on: 2022/9/30 14:56
* Created by: dengbw
* @param $session
*/
public function api_viewlog()
{
$session_id = $this->input->get('session_id');
$redis = &load_cache('redis');
$ckey = 'PLV_SESSION_LASTID';
$t1 = 'lc_live_polyv_session';
$t2 = 'lc_market_sylive_activity';
$where = [
"$t2.activityId>" => 0
];
if($session_id){
$where["{$t1}.id"] = $session_id;
}else{
$last_id = $redis->get($ckey);
$last_id && $where["{$t1}.id>"] = $last_id;
}
$fileds = "{$t1}.*,{$t2}.activityId";
$rows = $this->db->select($fileds)->from("$t1")
->join("$t2", "{$t2}.channelId={$t1}.channelId", 'left')
->where($where)->order_by("{$t1}.id asc")->limit(1, 0)
->get()->result_array();
if($rows){
foreach ($rows as $key => $val) {
$p_ckey = "PLV_CID{$val['channelId']}_{$val['sessionId']}_{$val}"; //分页缓存
$page = $redis->get($p_ckey);
!$page && $page = 1;
$s_msg = "开始同步{$val['activityId']}活动直播,频道id:{$val['channelId']},场次id:{$val['sessionId']},分页{$page}";
debug_log($s_msg, $this->log_file, $this->log_dir);
echo $s_msg."<br>";
$params = [
'channelId' => $val['channelId'],
'sessionId' => $val['sessionId'],
'startTime' => $val['startTime'],
'endTime' => $val['endTime'],
'page' => $page,
'pageSize' => 100
];
$results = $this->getViewLog($params);
if ($results['status'] == 'success') {
if(!$results['data']['lastPage'] && $results['data']['pageNumber'] != $results['data']['nextPageNumber']){
$redis->save($p_ckey,$results['data']['nextPageNumber'],24*60*60);
$left_page = $results['data']['totalPages'] - $page;
$msg = "第:{$page}页同步完成,剩余:{$left_page}";
}else{ //执行结束
$redis->save($ckey,$val['id']);
$msg = "同步完成";
}
debug_log($msg, $this->log_file, $this->log_dir);
echo $msg."<br>";
}else{
$msg = "接口错误:" . $results['message'];
echo $msg . "<br>";
}
}
}else{
echo "不存在需要同步数据";
}
}
/**
* Notes:增加观看日志
* Created on: 2022/9/30 14:56
* Created by: dengbw
* @param $params
* @return bool|string
*/
private function getViewLog($params)
{
$this->load->library('PolyvApi');
$polyv = new PolyvApi(['channel_id' => $params['channelId']]);
$results = $polyv->getViewLog($params);
if ($results['status'] == 'success') {
$addData = [];
foreach ($results['data']['contents'] as $key => $value) {
$re = $this->mdPolyvViewlog->get(['playId' => $value['playId']]);
$data = [
'channelId' => $value['channelId'], 'sessionId' => $value['sessionId'], 'playId' => $value['playId'],
'userId' => $value['userId'], 'playDuration' => $value['playDuration'], 'stayDuration' => $value['stayDuration'],
'flowSize' => $value['flowSize'], 'param1' => $value['param1'], 'param2' => $value['param2'],
'param3' => $value['param3'], 'param4' => $value['param4'], 'param5' => $value['param5'], 'ptype' => $value['ptype'],
'ipAddress' => $value['ipAddress'], 'country' => $value['country'], 'province' => $value['province'],
'city' => $value['city'], 'isp' => $value['isp'], 'referer' => $value['referer'], 'userAgent' => $value['userAgent'],
'operatingSystem' => $value['operatingSystem'], 'browser' => $value['browser'], 'isMobile' => $value['isMobile'],
'currentDay' => $value['currentDay'], 'createdTime' => $value['createdTime'], 'lastModified' => $value['lastModified'],
];
if ($re) {//同步更新数据
$this->mdPolyvViewlog->update($data, ['id' => $re['id']]);
} else {//新增
$data['c_time'] = time();
$addData[] = $data;
}
}
if ($addData && count($addData)) {//新增数据
$this->mdPolyvViewlog->add_batch($addData);
}
}
return $results;
}
//订单过期
public function out_time(){
$this->load->model('market/market_sylive_activity_orders_model','mdSytActivityOrders');
$this->load->model('market/market_sylive_order_model');
//商家订单过期
$where = [
'expireTime>' => 0,
'expireTime<' => time(),
'status' => 0
];
$this->mdSytActivityOrders->update(['status'=>-1],$where);
//用户订单过期
$where = [
'expireTime>' => 0,
'expireTime<' => time(),
'status' => 0,
];
$rows = $this->market_sylive_order_model->select($where,'id asc',1,20);
if($rows){
foreach ($rows as $key => $val) {
$res = $this->market_sylive_order_model->update(['status'=>-1],['id'=>$val['id']]);
if($res){
$up_data = [
'stock = stock+1' => null
];
$this->market_sylive_activity_model->update($up_data,['activityId'=>$val['itemId']]);
}
}
}
}
//关联观看日志
public function union_user(){
$this->load->library('market/sylive_entity');
$this->load->model('market/market_sylive_user_model', 'user_model');
$this->load->model('market/market_sylive_activity_user_model', 'act_user_model');
$this->load->model('market/market_sylive_viewlog_model');
$size = 30;
$t1 = 'lc_live_polyv_viewlog';
$t2 = 'lc_market_sylive_activity';
$t3 = 'lc_market_sylive_viewlog';
$where = [
"$t2.activityId>" => 0,
"$t3.id is null" => null
];
$fileds = "{$t1}.*,{$t2}.activityId";
$rows = $this->db->select($fileds)->from("$t1")
->join("$t2", "{$t2}.channelId={$t1}.channelId", 'left')
->join("$t3", "{$t3}.vlogId={$t1}.id", 'left')
->where($where)->order_by("{$t1}.id asc")->limit($size, 0)
->get()->result_array();
if (!$rows) {
echo "不存在直播日志数据";
}else{
foreach ($rows as $key => $value) {
$ac_user = $p_user = '';
$addData = [
'vlogId' => $value['id'],
'activityId' => $value['activityId'],
'playId' => $value['playId'],
'playDuration' => $value['playDuration'],
'stayDuration' => $value['stayDuration'],
'createTime' => time()
];
$user = $this->user_model->get(['unionid'=>$value['param1']]);
$user && $ac_user = $this->act_user_model->get(['activityId'=>$value['activityId'],'userId'=>$user['userId']]);
if($ac_user['channelId']){
$p_user = $this->user_model->get(['userId'=>$ac_user['channelId']]);
}
if($p_user['teamId']){
$addData['type'] = 1;
$team_lists = $this->sylive_entity->get_team_lists($p_user['teamId']);
$area_id = $team_lists[0]['teamId']; //大团长id
$biz_id = $team_lists[1]['teamId']; //团长id
$addData['cfUserId'] = $p_user['userId'];
}
if($p_user['organizationId']){
$addData['type'] = 0;
$team_lists = $this->sylive_entity->get_level_lists($p_user['organizationId']);
$area_id = $team_lists[0]['teamId']; //大团长id
$biz_id = $team_lists[1]['teamId']; //团长id
$addData['cfUserId'] = $p_user['userId'];
}
$area_id && $addData['areaId'] = $area_id;
$biz_id && $addData['bizId'] = $biz_id;
$user && $addData['userId'] = $user['userId'];
$this->market_sylive_viewlog_model->add($addData);
}
}
}
//更新活动用户表信息
public function tmp(){
$this->load->library('market/sylive_entity');
$this->load->model('market/market_sylive_user_model', 'user_model');
$this->load->model('market/market_sylive_activity_user_model', 'act_user_model');
$this->load->model('market/market_sylive_activity_kpidata_model','mdSytActivityKpiData');
$page = $this->input->get('page');
$size = $this->input->get('size');
!$page && $page = 1;
!$size && $size = 20;
$where = [
'activityId>' => 0,
'userId>' => 0
];
$total = $this->act_user_model->count($where);
$filed = 'id,userId,activityId';
$rows = $this->act_user_model->select($where,'id asc',$page,$size,$filed);
if(!$rows){
echo "执行完毕";exit;
}
echo $total.'<br>';
$user_ids = implode(',',array_column($rows,'userId'));
$where = ["userId in ({$user_ids})"=>null];
$users = $this->user_model->map('userId','',$where);
foreach ($rows as $item) {
$user = $users[$item['userId']] ? $users[$item['userId']][0] : [];
if($user){
$update = [
'organizationId' => $user['organizationId'],
'teamId' => $user['teamId'],
];
if($update['organizationId']){
$level_lists = $this->sylive_entity->get_level_lists($update['organizationId']);
if($level_lists){
$area_id = $level_lists[1]['organizationId'];//获取大区id
$biz_id = $level_lists[2]['organizationId'];//获取店铺id
}
$type = 0;
}
if($update['teamId']){
$team_lists = $this->sylive_entity->get_team_lists($update['teamId']);
if($team_lists) {
$area_id = $team_lists[0]['teamId']; //大团长id
$biz_id = $team_lists[1]['teamId']; //团长id
}
$type = 1;
}
if($update['teamId']||$update['organizationId']){
$where = [
'type' => $type,
'activityId' => $item['activityId'],
'cfUserId' => $item['userId']
];
$where['kpi'] = 'browse';
$browse = $this->mdSytActivityKpiData->count($where);
$where['kpi'] = 'subscribe';
$subscribe = $this->mdSytActivityKpiData->count($where);
$where['kpi'] = 'order';
$orderTotal = $this->mdSytActivityKpiData->count($where);
$where['kpi'] = 'watch';
$watch = $this->mdSytActivityKpiData->count($where);
}
$area_id && $update['areaId'] = $area_id;
$biz_id && $update['bizId'] = $biz_id;
$browse && $update['browse'] = $browse;
$subscribe && $update['subscribe'] = $subscribe;
$orderTotal && $update['orderTotal'] = $orderTotal;
$watch && $update['watch'] = $watch;
$this->act_user_model->update($update,['userId'=>$item['userId']]);
echo "用户id:{$item['userId']}更新成功:".json_encode($update,JSON_UNESCAPED_UNICODE)."<br>";
}
}
}
//临时更新kpi时间
public function tmp_day(){
$this->load->model('market/market_sylive_activity_kpidata_model','mdSytActivityKpiData');
$page = $this->input->get('page');
$size = $this->input->get('size');
!$page && $page = 1;
!$size && $size = 100;
$where = [
'createTime>' => 0,
'day' => '0000-00-00',
];
$total = $this->mdSytActivityKpiData->count($where);
echo '总数:'.$total.'<br>';
if($total){
$rows = $this->mdSytActivityKpiData->select($where,'id asc',$page,$size,'id,createTime');
foreach ($rows as $item) {
$update = [
'day' => date('Y-m-d',$item['createTime']),
];
$this->mdSytActivityKpiData->update($update,['id'=>$item['id']]);
}
}
echo '更新完成';
}
//更新经销商地址
public function tem_bizinfo(){
require_once COMMPATH . '/third_party/PHPExcel/IOFactory.php';
$this->load->model('market/market_sylive_activity_bizinfo_model');
$file = FCPATH.'pdf/bizinfo.xlsx';
$reader = \PHPExcel_IOFactory::createReader('Excel2007'); // 读取 excel 文档
$PHPExcel = $reader->load($file); // 文档名称
$objWorksheet = $PHPExcel->getActiveSheet();
$rowCnt = $objWorksheet->getHighestRow(); //获取总行数
for ($i = 2; $i <= $rowCnt; $i++) { //读取内容
$areaName = $objWorksheet->getCell('A' . $i)->getValue();
$bizName = $objWorksheet->getCell('B' . $i)->getValue();
$provinceName = $objWorksheet->getCell('C' . $i)->getValue();
$cityName = $objWorksheet->getCell('D' . $i)->getValue();
$addData = [
'activityId' => 4,
'areaName' => $areaName,
'bizName' => $bizName,
'provinceName' => $provinceName,
'cityName' => $cityName,
];
if(!$this->market_sylive_activity_bizinfo_model->count($addData)){
$addData['createTime'] = date('Y-m-d H:i:s');
$this->market_sylive_activity_bizinfo_model->add($addData);
}
}
echo '执行结束';
}
}