| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- <?php
- namespace app\common\logic;
- use app\common\model\Config;
- use app\common\model\ProductLists;
- use app\common\model\ProductOrder;
- use app\common\model\UserAirdrop;
- use app\api\logic\WelfareLoginc;
- use app\common\model\ProductPopular;
- use app\common\model\UserModel;
- use app\common\model\UserPathModel;
- use app\common\model\UserWelfare;
- use fast\Action;
- use fast\Asset;
- use fast\MembershipLevel;
- use think\Cache;
- use think\Db;
- use think\Log;
- use think\Model;
- use think\console\Output;
- use fast\Http;
- /**
- * 空投奖励发放逻辑
- * 定时任务,定时发放,每天一次,一般在凌晨12一过开始
- */
- class AirdropLogic
- {
- /**
- * 奖励名称及类型ID
- * @var array
- */
- private array $rewards_type = [
- 1 => '空投奖励',
- ];
- /**
- * 空投发放
- */
- public function setAirdropRewards()
- {
- //查找会员资产列表
- $info_list = UserAirdrop::where('type_id', '<=' , UserAirdrop::TypeRwa)->where('status', UserAirdrop::Normal)->find();
- if(empty($info_list)){
- (new Output())->writeln("本次没有空投发放数据:");
- return false;
- }
-
- //向固定用户空投
- if($info_list->type_id == UserAirdrop::TypeUser){
- WelfareLoginc::setUserProductOrder($info_list->num, 0, 0, 0, $info_list->product_id, $info_list->user_id, ProductOrder::Airdrop);
- }else{
- // 向超过Rwa数空投
- WelfareLoginc::setUserExRwaNum(
- $info_list['rwa_num'],
- $info_list['product_id'],
- $info_list['rwa_product_id'],
- 0, $info_list->id , 0,
- $info_list['rwa_mod'],
- $info_list['num']
- );
- }
-
-
- // 更新信息列表的状态和备注
- $info_list->status = UserAirdrop::Stop;
- $info_list->remark = '总发放'.$info_list->total_num.'套';
- // 保存更新后的信息列表
- return $info_list->save();
- }
- /**
- * 超级福利发放层级奖励
- *
- * 分享 3 个拿 10 层,分享 10 个拿 31 层
- */
- public function setParentRewards()
- {
- //
- $info = UserAirdrop::where('type_id', UserAirdrop::TypeSuperWeal)
- ->where('user_id', '>', 0)
- ->where('status', UserAirdrop::Normal)
- ->find();
- if(empty($info)){
- (new Output())->writeln("本次没有层级奖励数据:");
- return false;
- }
- $user_welfare = UserWelfare::getIsWelfare();
- if(empty($user_welfare)){
- (new Output())->writeln("空投参数未配置:");
- return false;
- }
- if($user_welfare['is_super'] == 0){
- (new Output())->writeln("超级福利未开启:");
- return false;
- }
- $num = $user_welfare['parent_rate'];
- if(!($num > 0)){
- (new Output())->writeln("上级发放比例配置有误:" . $num);
- return false;
- }
- $user_info = UserModel::where('id', $info['user_id'])->find();
- if($user_info->is_super != 2){
- (new UserAirdrop)->updateDate($info['id'], UserAirdrop::Stop, '会员未领超级福利');
- return false;
- }
- if($user_info->parent_id == 0){
- (new UserAirdrop)->updateDate($info['id'], UserAirdrop::Stop, '会员无上级');
- return false;
- }
- $parents_info = UserPathModel::where('p.user_id', $info['user_id'])
- ->alias('p')
- ->join('user u', 'u.id = p.parent_id', 'left')
- ->field('u.id, u.address_level, u.direct_super,u.parent_id, p.distance')
- ->where('u.is_super',2)
- ->order('p.distance asc')
- ->select();
- if(empty($parents_info)){
- (new UserAirdrop)->updateDate($info['id'], UserAirdrop::Stop, '所有上级无超级福利');
- }
- $level = 0;
- $send_user_ids = [];//需要发放的会员ID列表
- //分享 3 个拿 10 层,分享 10 个拿 31 层
- foreach ($parents_info as $parent){
- if($parent['direct_super'] >= 3 && $parent['distance'] <= 10){
- $send_user_ids[] = $parent['id'];
- }else if($parent['direct_super'] >= 10 && $parent['distance'] <= 31){
- $send_user_ids[] = $parent['id'];
- }
- }
- if(empty($send_user_ids)){
- (new UserAirdrop)->updateDate($info['id'], UserAirdrop::Stop, '所有上级都未满足发放条件');
- return false;
- }
- // 获取指定产品的热门信息
- $result = (new ProductLists())->where('id', $user_welfare['super_product_id'])->find();
- // $result = ProductPopular::getPopularByTime($user_welfare['super_product_id'], 'zh', $info->create_time);
- // $stock = $result->stock - $result->num - $result->init_num;
- // 检查库存是否足够
- // if(!$result || count($send_user_ids) > $stock) {
- // // 如果库存不足,输出信息并返回false
- // (new Output())->writeln("本次执行库存不足:应发发".count($send_user_ids) * $num."套,库存:" . $stock);
- // return false;
- // }
- foreach ($send_user_ids as $user_id){
- $rs = WelfareLoginc::setUserProductOrder($num, false, $info['user_id'], 0, $result['id'], $user_id, ProductOrder::Super);
- // if($rs && $result['price'] >= config('min_rwa_price')){
- // (new UserModel())->updateForRwaNum($user_id, UserModel::getByParentId($user_id), $num, '+');
- // }
- }
- // 更新信息列表的状态和备注
- $info->status = UserAirdrop::Stop;
- $info->remark = '共'.count($send_user_ids).'人,总发放'.count($send_user_ids) * $num.'套';
- // 保存更新后的信息列表
- return $info->save();
- }
- /**
- * 获取可用日期
- * @var array
- */
- protected function getExeDate($type_id = 1)
- {
- $today = date('Y-m-d',strtotime("-1day"));//当前时间减一天为最后一次可用时间
- $dateInfo = DB::table('timed_task_log')
- ->where('type_id' ,$type_id)
- ->where('status', 1)
- ->order('date_time', 'desc')
- ->find();
- if(empty($dateInfo)){//首次
- return $today;
- }
- $new_date = date('Y-m-d',strtotime("+1day",strtotime($dateInfo['date_time'])));//最后一次发放日期+1天为本次执行时间
- if($new_date > $today){//超过今天
- return "";
- }
- return $new_date;
- }
- }
|