callback.php 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684
  1. <?php
  2. defined('IN_WEB') or die('Include Error!');
  3. /**
  4. * 好友召回活动相关逻辑
  5. */
  6. class ModelCallback {
  7. public $rids=[
  8. ["id"=>1,"ext"=>"偷金币"],
  9. ["id"=>2,"ext"=>"攻打岛屿"],
  10. ["id"=>3,"ext"=>"消耗体力数量"],
  11. ["id"=>4,"ext"=>"签到"],
  12. ["id"=>5,"ext"=>"分享"],
  13. ["id"=>6,"ext"=>"fb邀请"],
  14. ["id"=>7,"ext"=>"召回分享"],
  15. ["id"=>8,"ext"=>"建造完成"],
  16. ["id"=>9,"ext"=>"赠送好友体力"],
  17. ["id"=>10,"ext"=>"赠送好友金币"],
  18. ["id"=>11,"ext"=>"赠送好友卡牌"],
  19. ["id"=>31,"ext"=>"好友绑定"],
  20. ["id"=>32,"ext"=>"好友签到"],
  21. ];
  22. const TASK_STEAL = 1; //偷金币
  23. const TASK_ATTACK = 2; //攻打岛屿
  24. const TASK_SPINS = 3; //消耗体力数量
  25. const TASK_DAILYSIGN = 4; //签到
  26. const TASK_SHARE = 5; //分享
  27. const TASK_INVITE = 6; //fb邀请
  28. const TASK_CALLBACK = 7; //召回分享
  29. const TASK_BUILD = 8; //建造完成
  30. const TASK_SENDSPINS = 9; //赠送好友体力
  31. const TASK_SENDMONEY = 10; //赠送好友金币
  32. const TASK_SENDCard = 11; //赠送好友卡牌
  33. const SCOREKEY = 'callback_score';
  34. const DEFAULTSCORE = 1;
  35. public function getTaskTypes() {
  36. return [
  37. self::TASK_STEAL,
  38. self::TASK_ATTACK,
  39. self::TASK_SPINS,
  40. self::TASK_DAILYSIGN,
  41. self::TASK_SHARE,
  42. self::TASK_INVITE,
  43. self::TASK_CALLBACK,
  44. self::TASK_BUILD,
  45. self::TASK_SENDSPINS,
  46. self::TASK_SENDMONEY,
  47. self::TASK_SENDCard,
  48. ];
  49. }
  50. /**
  51. * 获取当前激活的活动
  52. * @return array
  53. */
  54. public function getCurrentActivity($uid){
  55. return (array)oo::commonOprModel('activitynew')->getBindActivity($uid,self::SCOREKEY,true);
  56. }
  57. /**
  58. * 检查是否满足活动召回条件
  59. * @param int $uid
  60. * @param int $fid
  61. * @param array $conf
  62. * @return array
  63. */
  64. public function checkCanCallback($uid, $fid, $activity = [],$lastTime=0) {
  65. if($uid == $fid){ //不能召回自己
  66. return ['canCallback' => false];
  67. }
  68. if(empty($activity)){
  69. $activity = $this->getCurrentActivity($uid);
  70. }
  71. if(empty($activity)){
  72. return ['canCallback' => false];
  73. }
  74. //排序
  75. $extraData = !empty($activity['extraData'])?(array)json_decode($activity['extraData'],true):[];
  76. if(empty($extraData)){ //未配数据
  77. return ['canCallback' => false];
  78. }
  79. //玩家当前rfm分组
  80. $groupId = oo::commonOprModel('config')->getUserGroupIdByCid($fid, 2);
  81. if(!$lastTime){
  82. $lastTime = oo::commonOprModel('member')->getUserInfo($fid)['lasttime'];
  83. }
  84. $levelId = oo::commonOprModel('member')->getUserLevelId($fid);
  85. $canCallback = false;
  86. foreach($extraData as $v){
  87. //好友分组
  88. if(!empty($v['gid']) && !in_array(0, $v['gid'])){
  89. $gids = (array)$v['gid'];
  90. if(!in_array($groupId, $gids)){
  91. continue;
  92. }
  93. }
  94. if(!isset($v['level'], $v['level']['start']) && $levelId < $v['level']['start']){
  95. continue;
  96. }
  97. if(!isset($v['level'], $v['level']['end']) && $levelId > $v['level']['end']){
  98. continue;
  99. }
  100. //不在线时间段
  101. if(!empty($v['lastDays'])){
  102. if(time() - $lastTime <24 * 3600 * (int)$v['lastDays']){
  103. continue;
  104. }
  105. }
  106. $cid = $v['id'];//好友所在对象类id
  107. $canCallback = true;
  108. break;
  109. }
  110. return ['canCallback' => $canCallback, 'groupId' => $groupId, 'lasttime' => $lastTime, 'levelId' => $levelId,'cid'=>$cid];
  111. }
  112. /**
  113. * Notes:获取回归礼包列表
  114. * User: wsc
  115. * Time: 2021/3/24 16:57
  116. * @param $uid
  117. * @param $aid
  118. * @return array
  119. */
  120. public function getGift($uid,$aid){
  121. $giftListJson = oo::commonOprRedis('common')->hGetAll(okeys::callbackGift());
  122. $giftList = funs::getArrFromJsonArr($giftListJson);
  123. $groupId = oo::commonOprModel('config')->getUserGroupIdByCid($uid, 2);//用户付费分组
  124. $userBindInfo = oo::commonOprRedis('activity')->hGetAll(okeys::callbackBindUserInfo($aid,$uid));
  125. foreach ($giftList as $k=>$v){
  126. $ext=$v['ext'];
  127. if(!$ext['group']||in_array($groupId,$ext['group'])){//只赛选无分组条件,或 分组条件满足的礼包
  128. if($ext['isOnlyBack']==1&&!$userBindInfo['fid']){//赛选 设置为召回限制的礼包
  129. continue;
  130. }
  131. $gift[] = $k;
  132. }
  133. }
  134. return $gift;
  135. }
  136. /////////////////////////////////////////////////////
  137. /////////////////////////////////////////////////////
  138. //固定积分+额外分组积分+签到分组奖励获取积分,召回者//
  139. //任务积分(被召回)
  140. //召回积分和被召回积分
  141. //回归奖励,分割奖励配置
  142. /////////////////////////////////////////////////////
  143. /////////////////////////////////////////////////////
  144. /**
  145. * 获取玩家当前可以召回的好友列表
  146. * @param $uid
  147. * @return array
  148. */
  149. public function getUserCallbackList($uid) {
  150. $activity = oo::commonOprModel('activitynew')->getBindActivity($uid, self::SCOREKEY, true);
  151. $friends = oo::commonOprModel('friend')->getUserAllFriend($uid);
  152. $aid = $activity['id'];
  153. //成功召回的好友
  154. $successIds = oo::commonOprRedis('activity')->hGetAll(okeys::activitySuccCallBackList($aid, $uid));
  155. $list = [];
  156. if(time()<$activity['reward_time']){//在领奖期之前才有完整列表返回
  157. foreach($friends as $fid){
  158. $checkInfo = $this->checkCanCallback($uid, $fid, $activity);
  159. if(!$checkInfo['canCallback']&&!isset($successIds[$fid])){//不满足被召回条件,且不是被召回的玩家
  160. continue;
  161. }
  162. $fInfo = oo::commonOprModel('member')->getUserBasic($fid);
  163. $info = [
  164. 'uid' => $fInfo['uid'], 'nick' => $fInfo['nick'], 's_picture'=> $fInfo['s_picture'],'star'=>$fInfo['star']
  165. ];
  166. if(isset($successIds[$fid])){
  167. $info['status'] = $successIds[$fid]; //0:已召回,1可领奖,2:已领奖
  168. $info['score'] = oo::commonOprRedis('activity')->hGet(okeys::callbackBindUserCanGetList($aid,$uid),$fid);
  169. }else{
  170. $info['status'] = 0; //可召回
  171. $info['score'] = 0;
  172. }
  173. $list[] = $info;
  174. }
  175. }else{//只返回已找回或已领奖的用户
  176. if(!empty($successIds)){
  177. foreach ($successIds as $fid=>$v){
  178. $fInfo = oo::commonOprModel('member')->getUserBasic($fid);
  179. $info = [
  180. 'uid' => $fInfo['uid'], 'nick' => $fInfo['nick'], 's_picture'=> $fInfo['s_picture'],'star'=>$fInfo['star']
  181. ];
  182. $info['status'] = $successIds[$fid];
  183. $info['score'] = oo::commonOprRedis('activity')->hGet(okeys::callbackBindUserCanGetList($aid,$uid),$fid);
  184. $list[] = $info;
  185. }
  186. }
  187. }
  188. //活动附加信息-(任务天数,固定积分)
  189. $extra_reward = oo::commonOprModel('activitynew')->getActReward($activity['id'])['extra_reward'];
  190. //当前积分情况
  191. $scoreInfo = oo::commonOprRedis('activity')->hGetAll(okeys::actCallbackScore($aid,$uid));
  192. $returnTask = null;
  193. //被召回的人信息
  194. $userBindInfo = oo::commonOprRedis('activity')->hGetAll(okeys::callbackBindUserInfo($aid,$uid));
  195. //距离第一次绑定活动已经开始了多少天
  196. $curDay = !empty($userBindInfo['bindLastTime'])?(strtotime(date('Y-m-d',time()))-strtotime(date('Y-m-d',$userBindInfo['bingBackTime'])))/86400+1:0;
  197. if(isset($userBindInfo['bindCid'])&&$extra_reward['days']>=$curDay){//玩家是被召回者,且被召回天数小于任务天数时
  198. $returnTask =[
  199. 'score' => intval($scoreInfo[2]),
  200. 'totalDay' => $extra_reward['days'],
  201. 'curDay' => $curDay>$extra_reward['days']?$extra_reward['days']:$curDay,
  202. 'list' => $this->getTaskList($uid,$activity),//任务列表
  203. 'reward' => $this->getRateReward($uid,$aid,2),
  204. 'fid' =>intval($userBindInfo['bindFid']),
  205. 'gidList' =>$this->getGift($uid,$aid),
  206. ];
  207. }
  208. //基础配置
  209. return [
  210. //回归数据
  211. 'returnTask' => $returnTask,
  212. //召回数据
  213. 'recallTask' => [
  214. 'list' => $list,
  215. 'score' => intval($scoreInfo[1]),
  216. 'reward' => $this->getRateReward($uid,$aid,1),
  217. 'oneScore' =>$extra_reward['score'],
  218. ],
  219. ];
  220. }
  221. /**
  222. * 添加召回好友记录
  223. * @param int $uid
  224. * @param int $fid
  225. * @return array
  226. */
  227. public function callbackFriend($uid, $fid, $activity) {
  228. $aid = $activity['id'];
  229. $key = okeys::activityBeCallBackFriend($aid,$fid);
  230. if(oo::commonOprRedis('activity')->hGet($key, $uid)){
  231. return true;
  232. }
  233. oo::commonOprModel('callback')->doTask($uid, 7, 1);
  234. // $aid = $activity['id'];
  235. $expire = oo::redisRandomExpire($activity['end_time'] + 600);
  236. $friendInfo = oo::commonOprModel('member')->getUserInfo($fid);
  237. $lasttime= $friendInfo['lasttime'];
  238. //添加被召回记录,成功后,让玩家选择是哪个uid召回我的,并记录当时我的最后登录的时间(用于我被好友召回后取绑定对象配置用)
  239. oo::commonOprRedis('activity')->hSet($key,$uid,$lasttime);
  240. oo::commonOprRedis('activity')->expireAt($key, $expire);
  241. oo::commonOprModel('ta')->setEventData($fid,'recalled_user',['recalled_user'=>$uid]);
  242. return true;
  243. }
  244. /**
  245. * Notes:设置成功绑定信息
  246. * User: wsc
  247. * Time: 2021/3/17 10:45
  248. * @param $uid int 被召回人
  249. * @param $fid int 召回发起者
  250. * @param array $activity 活动信息
  251. * @return bool
  252. */
  253. public function setCallbackSuccess($uid, $fid, $activity = []) {
  254. $aid = $activity['id'];
  255. $expire = oo::redisRandomExpire($activity['end_time'] - time() + 600);
  256. $key = okeys::callbackBindUserInfo($aid,$uid);
  257. $key2 = okeys::activitySuccCallBackList($aid, $fid);
  258. $keys3 = okeys::callbackBindUserCanGetList($aid,$fid);
  259. $userBindInfo = oo::commonOprRedis('activity')->hGetAll($key);
  260. if($userBindInfo['bindFid']){
  261. return oo::response(errorCode::OVER_RECEIVE_REWARD,[],'已经领过奖');
  262. }
  263. $extra_reward = oo::commonOprModel('activitynew')->getActReward($aid)['extra_reward'];
  264. $cid = $userBindInfo['bindCid'];
  265. $groupInfo = $this->getUserCallBackGroupInfo($uid,$activity,$cid);
  266. //给自己绑定召回自己的人
  267. oo::commonOprRedis('activity')->hSet($key,'bindFid',$fid);
  268. //给自己发奖
  269. foreach ($groupInfo['reward'] as $prop){
  270. $ret = oo::commonOprModel('member')->sendReward($uid,$prop['propsId'],$prop['num'],222,"召回活动:{$aid}:{$cid}",$prop['value']);
  271. }
  272. //给邀请发起人绑定信息
  273. oo::commonOprRedis('activity')->hset($key2, $uid, 1);//领取状态(0:可召回,1:可领奖,2:已领取
  274. //给邀请发起人发uid的签到任务积分
  275. $score = 0;
  276. if($userBindInfo['bindSignDay']){//当uid已完成签到
  277. $groupInfo =$this->getUserCallBackGroupInfo($uid,$activity,$userBindInfo['bindCid']);
  278. $signCfg = array_column($groupInfo['groupInfo']['sign'],null,'day');
  279. foreach ($signCfg as $day=>$info){
  280. if($day<=$userBindInfo['bindSignDay']&&$info['score']>0){
  281. // $this->addScore($fid,$info['score'],$aid,1,'32',"{$uid}签到{$day}天,给{$fid}补发奖励:{$info['score']}积分");
  282. $score += intval($info['score']);
  283. }
  284. }
  285. };
  286. //给邀请发起人发积分可领状态并记录值
  287. $score += intval($extra_reward['score']+$groupInfo['groupInfo']['extraScore']);
  288. oo::commonOprRedis('activity')->hSet($keys3,$uid,$score);//设置可领积分值
  289. $this->sendInform($fid,$aid,1);//发可领积分通知
  290. if(oo::commonOprRedis('activity')->hlen($key2) <= 1){
  291. oo::commonOprRedis('activity')->expire($key2, $expire);
  292. oo::commonOprRedis('activity')->expire($keys3, $expire);
  293. }
  294. return oo::response(errorCode::SUCCESS,$groupInfo['reward']);
  295. }
  296. /**
  297. * Notes:写回归记录
  298. * User: wsc
  299. * Time: 2021/3/19 11:58
  300. * @param $uid
  301. * @param $lastTime
  302. * @param $version
  303. */
  304. public function callBackLog($uid,$lastTime,$version){
  305. if(oo::compareVersion($version,'1.8.4')){
  306. $activity = $this->getCurrentActivity($uid);
  307. if(!empty($activity)&&$lastTime<$activity['reward_time']){
  308. $key = okeys::callbackBindUserInfo($activity['id'],$uid);
  309. $check = $this->checkCanCallback(1,$uid,$activity,$lastTime);
  310. if(intval($check['cid'])<1){
  311. return false;
  312. }
  313. $bindInfo = ['bindCid'=>$check['cid'],'bindLastTime'=>$lastTime,'bingBackTime'=>time()];
  314. oo::commonOprRedis('activity')->hMset($key,$bindInfo);
  315. $expire = oo::redisRandomExpire($activity['end_time'] - time());
  316. oo::commonOprRedis('activity')->expire($key,$expire);
  317. return $activity['id'];
  318. }
  319. }
  320. return false;
  321. }
  322. /**
  323. * Notes:被召回者获取召回对象组信息
  324. * User: wsc
  325. * Time: 2021/3/17 10:00
  326. * @param $uid
  327. * @param $activity
  328. * @param int $cid 被召回者所在对象组
  329. * @return array
  330. */
  331. public function getUserCallBackGroupInfo($uid,$activity,$cid=1){
  332. $data = $props = [];
  333. $rewardInfo =json_decode($activity['reward_pro'],true);
  334. $rewardInfo = array_column($rewardInfo,null,'stage');
  335. $reward =$rewardInfo[1];
  336. $lv = oo::commonOprModel('member')->getUserLevel($uid)['levelId'];
  337. $bet =oo::commonOprModel('activitynew')->getCoinRewardByTypeAndLevel('collect',$lv);
  338. foreach ($reward['prize'] as $prize){
  339. $props[] = oo::commonOprModel('activitynew')->getFormattingProps($uid,$activity['id'],$prize,$bet);
  340. }
  341. $data['reward'] = $props;//对象组对应的奖励信息
  342. $gScoreInfo = json_decode($activity['extraData'],true);
  343. $gScoreInfo = array_column($gScoreInfo,null,'id');
  344. $data['groupInfo'] =$gScoreInfo[$cid]?$gScoreInfo[$cid]:$gScoreInfo[1];//对象组配置信息
  345. return $data;
  346. }
  347. /**
  348. * Notes:获取任务列表
  349. * User: wsc
  350. * Time: 2021/3/17 20:54
  351. * @param $uid
  352. * @param $activity
  353. * @return array
  354. */
  355. public function getTaskList($uid,$activity){
  356. $data =[];
  357. $tmp = isset($activity['reward_conf']) ? array_values((array)json_decode($activity['reward_conf'],true)) : [];
  358. $userTaskInfo = oo::commonOprRedis('activity')->hGetAll(okeys::callbackUserTaskInfo($activity['id'],$uid));
  359. $overList = !empty($userTaskInfo['overReceive'])?json_decode($userTaskInfo['overReceive'],true):[];
  360. foreach ($tmp as $k=>$v){
  361. $data[$k]['id'] = $v['id'];
  362. $data[$k]['type'] = $v['type'];
  363. $data[$k]['score'] = $v['score'];
  364. $data[$k]['maxLimit'] = $v['num'];
  365. $data[$k]['limit'] = intval($userTaskInfo[$v['type']]);
  366. $data[$k]['status'] = in_array($v['type'],$overList)?2:(isset($userTaskInfo["score_{$v['type']}"])?1:0);
  367. }
  368. $data = array_values($data);
  369. return $data;
  370. }
  371. /**
  372. * Notes:添加积分
  373. * User: wsc
  374. * Time: 2021/3/17 11:16
  375. * @param $uid
  376. * @param $score int 积分
  377. * @param $aid int 活动id
  378. * @param int $type 积分类型 1作为召回者积分 2作为被召回者积分
  379. * @return int
  380. */
  381. public function addScore($uid,$score,$aid,$type=1,$rid='',$ext=''){
  382. $score = abs(intval($score));
  383. $key = okeys::actCallbackScore($aid, $uid);
  384. $count = oo::commonOprRedis('activity')->hIncrBy($key,$type,$score);
  385. //活动积分流水
  386. $stype =$type==1?'call_score':'be_call_score';
  387. oo::commonOprModel('currency')->actlog($aid,$uid,$stype,'+',$score,$count,$rid,$ext);
  388. return $count;
  389. }
  390. /**
  391. * Notes:积分领取通知
  392. * User: wsc
  393. * Time: 2021/3/19 15:00
  394. * @param $uid
  395. * @param $aid
  396. * @param $type
  397. */
  398. public function sendInform($uid,$aid,$type){
  399. //是否满足领取积分通知
  400. $data =[
  401. "actId" =>oo::commonOprModel('activitynew')->act_type['callback_score']['rcid'],
  402. "aid" =>$aid,
  403. "type" =>$type,
  404. ];
  405. oo::commonOprModel('Workerman')->push($uid,ocmd::$send['ActivityFlush'],$data); //推送可领积分
  406. }
  407. /**
  408. * Notes:领取好友绑定积分
  409. * User: wsc
  410. * Time: 2021/3/17 11:35
  411. * @param $uid
  412. * @param $fid
  413. * @return string
  414. */
  415. public function receiveBindScore($uid,$fid){
  416. $aid = oo::commonOprModel('activitynew')->activityLock($uid,'callback_score');
  417. if(!$aid){
  418. return oo::response(errorCode::NOT_FOUND_ACTIVITY,[],'活动不存在');
  419. }
  420. $key = okeys::callbackBindUserCanGetList($aid,$uid);
  421. $key2 = okeys::activitySuccCallBackList($aid, $uid);
  422. $score = intval(oo::commonOprRedis('activity')->hGet($key,$fid));
  423. if($score<1){
  424. return oo::response(errorCode::NONE_REWARD,[],'没有可领取的积分');
  425. }
  426. if(intval(oo::commonOprRedis('activity')->hGet($key2,$fid))==2){
  427. return oo::response(errorCode::OVER_RECEIVE_REWARD,[],'已经领取过领取的积分');
  428. }
  429. oo::commonOprRedis('activity')->hset($key2, $fid, 2);//标记好友奖励积分已领取
  430. oo::commonOprRedis('activity')->hSet($key,$fid,0);//清空可领积分
  431. $count = $this->addScore($uid,$score,$aid,1,31,"好友{$fid}绑定奖励");
  432. return oo::response(1,["score"=>$count]);
  433. }
  434. /**
  435. * Notes:领取任务积分
  436. * User: wsc
  437. * Time: 2021/3/17 17:33
  438. * @param $uid
  439. * @param $tid
  440. * @return string
  441. */
  442. public function receiveTaskScore($uid,$id){
  443. $actInfo= $this->getCurrentActivity($uid);
  444. $aid =$actInfo['id'];
  445. if(!$aid){
  446. return oo::response(errorCode::NOT_FOUND_ACTIVITY,[],'活动不存在');
  447. }
  448. $reward_conf = json_decode($actInfo['reward_conf'],1);
  449. $taskCfg = array_column($reward_conf,null,'id');
  450. $tid = $taskCfg[$id]['type'];;
  451. $key = okeys::callbackUserTaskInfo($aid,$uid);
  452. $score = oo::commonOprRedis('activity')->hGet($key,"score_{$tid}");
  453. if($score<1){
  454. return oo::response(errorCode::NONE_REWARD,[],'没有积分可领取');
  455. }
  456. $overReceiveJSon = oo::commonOprRedis('activity')->hGet($key,'overReceive');
  457. $overReceiveList = $overReceiveJSon?json_decode($overReceiveJSon,1):[];
  458. if(in_array($tid,$overReceiveList)){//已经领取过
  459. return oo::response(errorCode::OVER_RECEIVE_REWARD,[],'已经领取');
  460. }
  461. //发放积分
  462. $count = $this->addScore($uid,$score,$aid,2,$tid,"任务:{$tid}");
  463. //写领取记录
  464. array_push($overReceiveList,$tid);
  465. oo::commonOprRedis('activity')->hSet($key,'overReceive',json_encode($overReceiveList));
  466. return oo::response(1,["score"=>$count]);
  467. }
  468. /**
  469. * Notes:做任务
  470. * User: wsc
  471. * Time: 2021/3/17 15:23
  472. * @param $uid
  473. * @param $tid
  474. * @return bool
  475. */
  476. public function doTask($uid,$tid,$num=1){
  477. $aid = oo::commonOprModel('activitynew')->activityLock($uid,'callback_score');
  478. if(!$aid){
  479. return false;
  480. }
  481. if(oo::commonOprRedis('activity')->hGet(okeys::callbackUserTaskInfo($aid,$uid),"score_{$tid}")){//该任务存在可领取的积分
  482. return false;
  483. }
  484. $key = okeys::callbackBindUserInfo($aid,$uid);
  485. $userBindInfo = oo::commonOprRedis('activity')->hGetAll($key);
  486. if(!isset($userBindInfo['bindCid'])){//作为判断回归条件
  487. return false;
  488. }
  489. $actInfo = oo::commonOprModel('activitynew')->getActivity($aid);
  490. $extra_reward = oo::commonOprModel('activitynew')->getActReward($aid)['extra_reward'];
  491. $thisDay = !empty($userBindInfo['bindLastTime'])?(strtotime(date('Y-m-d',time()))-strtotime(date('Y-m-d',$userBindInfo['bingBackTime'])))/86400+1:0;
  492. if($thisDay>$extra_reward['days']){//已用完可以任务的天数
  493. return false;
  494. }
  495. if($tid==4){//给邀请者发签到积分
  496. $day = intval($userBindInfo['bindSignDay'])+1;
  497. oo::commonOprRedis('activity')->hSet($key,'bindSignDay',$day);//设置签到累计日期
  498. $fid = $userBindInfo['bindFid'];
  499. $groupInfo =$this->getUserCallBackGroupInfo($uid,$actInfo,$userBindInfo['bindCid']);
  500. $signCfg = array_column($groupInfo['groupInfo']['sign'],null,'day');
  501. if(isset($signCfg[$day])&&$signCfg[$day]['score']>0&&$fid){//配置日有签到奖励积分,则发起人加可积分可领
  502. // $this->addScore($fid,$signCfg[$day]['score'],$aid,1,'32',"{$uid}签到{$day}天,给{$fid}奖励:{$signCfg[$day]['score']}积分");
  503. oo::commonOprRedis('activity')->hIncrBy(okeys::callbackBindUserCanGetList($aid,$fid),$uid,$signCfg[$day]['score']);
  504. oo::commonOprRedis('activity')->hset(okeys::activitySuccCallBackList($aid, $fid), $uid, 1);//设置为可领取状态
  505. $this->sendInform($fid,$aid,1);//发可领积分通知
  506. }
  507. }
  508. $key2 = okeys::callbackUserTaskInfo($aid,$uid);
  509. $reward_conf = json_decode($actInfo['reward_conf'],1);
  510. $taskCfg = array_column($reward_conf,null,'type');
  511. if($num>$taskCfg[$tid]['num']){
  512. $num = $taskCfg[$tid]['num'];
  513. }
  514. $count = oo::commonOprRedis('activity')->hIncrBy($key2,$tid,$num);//累计完成次数
  515. if($count>=$taskCfg[$tid]['num']){//达到领取积分条件
  516. oo::commonOprRedis('activity')->hSet($key2,"score_{$tid}",$taskCfg[$tid]['score']);//写任务积分可领缓存
  517. $this->sendInform($uid,$aid,2);//发可领积分通知
  518. }
  519. if(oo::commonOprRedis('activity')->ttl($key2)<0){//未设置过期则设置到凌晨过期
  520. oo::commonOprRedis('activity')->expire($key2,oo::todayDeadline());
  521. }
  522. return true;
  523. }
  524. /**
  525. * Notes:获取阶段进度奖励
  526. * User: wsc
  527. * Time: 2021/3/17 15:55
  528. * @param $uid
  529. * @param $aid
  530. * @param int $utype
  531. * @return array
  532. */
  533. public function getRateReward($uid,$aid,$utype=1){
  534. $datas =[];
  535. $type = 'callback_score';
  536. $rewardInfo =oo::commonOprModel('activitynew')->getActReward($aid)['reward'];
  537. $overNum =oo::commonOprRedis('activity')->hGetAll(okeys::actCallbackScore($aid, $uid))[$utype];
  538. $lv = oo::commonOprModel('member')->getUserLevel($uid)['levelId'];
  539. $bet =oo::commonOprModel('activitynew')->getCoinRewardByTypeAndLevel($type,$lv);
  540. if($utype==2){
  541. $reward = $rewardInfo['becallback'];
  542. $key2 = okeys::actBeCallbackReward($aid,$uid);
  543. }else{
  544. $reward = $rewardInfo['callback'];
  545. $key2 = okeys::actCallbackReward($aid,$uid);
  546. }
  547. foreach ($reward as $k=>$v){
  548. $data['stage'] =$v['stage'];
  549. $data['stepnum'] = intval($v['stepnum']);
  550. $data['props'] = [];
  551. foreach ($v['prize'] as $val){
  552. $data['props'][] = oo::commonOprModel('activitynew')->getFormattingProps($uid,$aid,$val,$bet);
  553. }
  554. $data['status'] =0;
  555. if($overNum>=$data['stepnum']){
  556. $data['status'] =1;
  557. }
  558. $stage_status = intval(oo::commonOprRedis('activity')->hGet($key2,$data['stage']));
  559. if($stage_status>0){
  560. $data['status'] =2;
  561. }
  562. $datas[] = $data;
  563. }
  564. return $datas;
  565. }
  566. /**
  567. * Notes:领取进度阶段奖励
  568. * User: wsc
  569. * Time: 2021/3/17 15:55
  570. * @param $uid
  571. * @param $aid
  572. * @param $type
  573. * @param $stage
  574. * @param int $utype
  575. * @return string
  576. */
  577. public function receiveRateReward($uid,$stage,$utype=1){
  578. $type = 'callback_score';
  579. $data = [];
  580. $aid = oo::commonOprModel('activitynew')->activityLock($uid,$type);
  581. if(!$aid){
  582. return oo::response(errorCode::NOT_FOUND_ACTIVITY,$data,"活动不存在");
  583. }
  584. $rewardInfo = $this->getRateReward($uid,$aid,$utype);
  585. $reward = array_column($rewardInfo,null,'stage');
  586. if(empty($reward[$stage])){
  587. return oo::response(errorCode::CONDITION_NOT_RNOUGH,$data,"没有可领取的奖励");
  588. }
  589. if($reward[$stage]['status']==2){
  590. return oo::response(errorCode::OVER_RECEIVE_REWARD,$data,"已领过该阶段奖励");
  591. }
  592. if($reward[$stage]['status']!=1){
  593. return oo::response(errorCode::CONDITION_NOT_RNOUGH,$data,"未达领奖条件");
  594. }
  595. if($utype==2){
  596. $key = okeys::actBeCallbackReward($aid,$uid);
  597. $rid = 224;
  598. }else{
  599. $key = okeys::actCallbackReward($aid,$uid);
  600. $rid = 223;
  601. }
  602. foreach ($reward[$stage]['props'] as $k=>$v){
  603. $result = oo::commonOprModel('member')->sendReward($uid,$v['propsId'],$v['num'],$rid,"活动:{$type}:{$aid}:".$stage,$v['value'],$v);
  604. $reward[$stage]['props'][$k]['value'] = $result;
  605. }
  606. oo::commonOprRedis('activity')->hSet($key,$stage,time());
  607. $data = $reward[$stage]['props'];
  608. return oo::response(errorCode::SUCCESS,$data);
  609. }
  610. public function clearUserCache($uid,$aid,$doFid=0){
  611. $key[0] = okeys::activitySuccCallBackList($aid, $uid);//uid成功召回的用户列表情况0已找回2领奖
  612. $key[1] = okeys::callbackBindUserCanGetList($aid,$uid);//被uid召回的fid列表及待领取积分
  613. $key[] = okeys::actCallbackReward($aid,$uid);//uid领取阶段奖励记录
  614. $key[] = okeys::actBeCallbackReward($aid,$uid);//uid作为fid领取阶段奖励记录
  615. $key[] = okeys::actCallbackScore($aid, $uid);//uid的积分情况 1作为uid的积分 2作为fid的积分
  616. $key[] = okeys::activityBeCallBackFriend($aid,$uid);
  617. $key[] = okeys::callbackBindUserInfo($aid,$uid);
  618. $key[] = okeys::callbackUserTaskInfo($aid,$uid);
  619. if($doFid){
  620. $fids = oo::commonOprRedis('activity')->hGetAll($key[1]);//被uid召回的所有fid 及状态
  621. foreach ($fids as $fid=>$status){
  622. $key[] = okeys::activityBeCallBackFriend($aid,$fid);//fid绑定的 召回fid的uid列表 及fid的最后登录时间
  623. $key[] = okeys::callbackBindUserInfo($aid,$fid);//fid绑定的uid及自己所在对象组id信息
  624. $key[] = okeys::callbackUserTaskInfo($aid,$fid);//fid的任务详情
  625. $key[] = okeys::actBeCallbackReward($aid,$fid);//fid的阶段奖励领取记录
  626. $key[] = okeys::actCallbackScore($aid, $fid);//fid的积分情况,1作为uid的积分 2作为fid的积分
  627. }
  628. }
  629. oo::commonOprRedis('activity')->delete($key);
  630. }
  631. }