Files
digital_doctor/digital_doctor/application/index/controller/Offlineprizetimer.php
2024-07-10 17:40:31 +08:00

205 lines
7.2 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/*
* description
* authorwh
* email
* createTime{2024/6/3} {15:56}
*/
namespace app\index\controller;
use app\common\model\TabConf;
use think\Db;
use think\Exception;
use wanghua\general_utility_tools_php\Mmodel;
use wanghua\general_utility_tools_php\SundryConfig;
use wanghua\general_utility_tools_php\tool\Tools;
/**
* 离线奖励计算任务
*
* Class Offlineprizetimer
* @package app\index\controller
*/
class Offlineprizetimer
{
/**
* desc定时计算任务每小时执行一次
* authorwh
*/
function count()
{
$this->countOfflinePrize();
$this->recoveryPower();
$this->recoveryPowerTimes();
}
/**
* desc计算离线奖励并写入离线奖励表
*
* 每1小时执行一次
*
* index/Offlineprizetimer/count
*
* authorwh
*/
private function countOfflinePrize(){
Tools::log_to_write_txt(['开始计算离线奖励']);
return Mmodel::catchJson(function (){
//一定时间内可领取的离线奖励次数
$time_inner_get_prize_times = SundryConfig::val('time_inner_get_prize_times');
$exp_arr = explode('-',$time_inner_get_prize_times);
$max_hours = $exp_arr[0];
$limit_time = time()-$max_hours * 3600;//n小时以内的离线用户
//$can_get_times = $exp_arr[1];//可领取次数
//所有离线时间大于 $max_hours 的用户
$all_users = Db::table(TabConf::$fa_users)
->where('offline_time','egt',date('Y-m-d H:i:s',$limit_time))//规定离线时间内
->where('clientid','')//已离线
->select();
//每离线N小时可获得奖励
$offline_n_hour_gift_can_prize = SundryConfig::val('offline_n_hour_gift_can_prize');
//计算奖励
foreach ($all_users as &$user){
if(empty($user['offline_time'])){
//刚注册,未离线
continue;
}
if($user['clientid']){
//在线
continue;
}
/** 下方是已离线用户↓ **/
//查询最近计算奖励的时间
$last_prize_time = Db::table(TabConf::$fa_user_offline_prize)
->where('openid',$user['openid'])
->order('id desc')
->find();
$offline_time = '';
if($last_prize_time){
//如果最近领取了奖励则以最近领取时间为准
$offline_time = $last_prize_time['create_time'];
}else{
//取离线时间
$offline_time = $user['offline_time'];
}
//离线时间超过3小时才能计算奖励
if(time() - strtotime($offline_time) < 3*3600 ){
//上次计算奖励的时间到现在还没到3小时
continue;
}
if(time()-$max_hours*3600 < strtotime($offline_time)){//在72小时以内
//减去领奖时间
$offline_time_hours = (time() - strtotime($offline_time)) / 3600;//得到小时数
$prize_num = floor($offline_time_hours / $offline_n_hour_gift_can_prize);//得到本次可领取的奖品数量
}else{//在72小时以外按72小时计算
$prize_num = floor($max_hours / $offline_n_hour_gift_can_prize);//得到本次可领取的奖品数量
}
if($prize_num<=0){
//离线时间不足,不计算奖励
continue;
}
//离线奖励获得数值
$offline_prize_got_num_value = SundryConfig::val('offline_prize_got_num_value');
//随机一个奖品
$prop_id = $this->random_prop('id');
//离线奖励可被偷取的百分比
$lose_percent = SundryConfig::val('offline_prize_can_lose_percent');
$prize_all_num = $prize_num * $offline_prize_got_num_value;
$can_lose_num = floor($prize_all_num * $lose_percent);
$self_got_num = $prize_all_num - $can_lose_num;
//计算奖品数值
$gameprop_arr = [
'openid'=>$user['openid'],
//奖品
'gameprop_id'=>$prop_id,
//奖品总数量
'prize_all_num'=>$prize_all_num,
//可被偷取的数量
'can_lose_num'=>$can_lose_num,//被偷取时,该值减少
//自己保底所得数量
'self_got_num'=>$self_got_num?:0,
];
Db::table(TabConf::$fa_user_offline_prize)
->insert($gameprop_arr);
}
Tools::log_to_write_txt(['结束计算离线奖励']);
return Tools::set_ok('ok');
});
}
private function random_prop($key=''){
$count = Db::table(TabConf::$fa_gameprop)
->count('id');
$id = mt_rand(1,$count);
$p = Db::table(TabConf::$fa_gameprop)->where('id',$id)->find();
if(empty($p)){
$id = mt_rand(1,$count);
$p = Db::table(TabConf::$fa_gameprop)->where('id',$id)->find();
}
if(empty($p)){
throw new Exception('道具获取失败');
}
return $key?$p[$key]:$p;
}
/**
* desc每小时恢复一点体力上限5点
* authorwh
*/
private function recoveryPower(){
return Mmodel::catchJson(function (){
$users = Db::table(TabConf::$fa_users)
->where('power','<',5)
->select();
foreach ($users as $user){
try {
Db::table(TabConf::$fa_users)
->where('id',$user['id'])
->setInc('power',1);
}catch (\Exception $e){
continue;
}
}
});
}
/**
* 每日凌晨恢复看广告增加体力次数和消耗金币增加体力次数
*/
private function recoveryPowerTimes(){
return Mmodel::catchJson(function (){
//判断当前时间是否是零点
$now_time = date('H');
if($now_time !== '00'){
return '';
}
$per_day_coin_add_power_times = SundryConfig::val('per_day_coin_add_power_times');
$per_day_look_ad_add_power_times = SundryConfig::val('per_day_look_ad_add_power_times');
$users = Db::table(TabConf::$fa_users)->select();
foreach ($users as $user){
try {
Db::table(TabConf::$fa_users)
->where('id',$user['id'])
->data([
'coin_power_times'=>$per_day_coin_add_power_times,
'ad_power_times'=>$per_day_look_ad_add_power_times,
]);
}catch (\Exception $e){
continue;
}
}
});
}
}