'空投奖励', ]; /** * 空投发放 */ 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; } // 获取指定产品的热门信息 $result = ProductPopular::getPopularByTime($info_list['product_id'], 'zh', $info_list->start_time); // 检查库存是否足够 if(!$result || $info_list->total_num > $result->stock) { // 如果库存不足,输出信息并返回false (new Output())->writeln("本次执行库存不足:"); return false; } // 更新用户福利信息 WelfareLoginc::setUserExRwaNum( $info_list['rwa_num'], $info_list['product_id'], $info_list['rwa_product_id'], $result->is_area, $result->id, $result->price, $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->address_level == 0){ (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.address_level', '>',0) ->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['parent_id']; }else if($parent['direct_super'] >= 10 && $parent['distance'] <= 31){ $send_user_ids[] = $parent['parent_id']; } } if(empty($send_user_ids)){ (new UserAirdrop)->updateDate($info['id'], UserAirdrop::Stop, '所有上级都未满足发放条件'); return false; } // 获取指定产品的热门信息 $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, $result['is_area'], $info['user_id'], $result['price'], $result['product_id'], $user_id, ProductOrder::Airdrop); 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(); } /** * 拨币 * 向会员发放qubic * 每一万算力每天收益14-15万个币 */ public function AllocateQubic() { $type_id = 2; $date = $this->getExeDate($type_id); if(empty($date)){ (new Output())->writeln("本次没有可用时间:" . $date); return ; } //创建定时任务执行日志 $log_id = (new TimedTaskLogModel())->insertGetId([ 'type_id' => $type_id, 'type_name' => $this->rewards_type[$type_id], 'date_time' => $date, 'create_time' => date('Y-m-d H:i:s'), ]); //查找会员资产列表 $info_list = DB::table('ledger_wallet') ->alias('w') ->join('user u','u.id = w.user_id') ->field('user_id,power') ->where('power', '>', 0) ->where('effective_time', '>', 0) //报单有收益 ->select(); if(empty($info_list)){ (new Output())->writeln("本次没有可用会员数据:" . $date); return $log_id; } $num =rand(120000,130000); $power_price = $num/10000;//每算力每日获得SMH的数量,算法为每一万算力每日产15万个Qubic foreach ($info_list as $info) { $amount = ($info['power']) * $power_price; $check = (new LedgerQubicChangeModel()) ->where('user_id', $info['user_id']) ->where('action', LedgerQubicChangeModel::SysSend) ->where('from_id', strtotime($date)) ->count(); if($check){ dump('用户ID:' . $info['user_id'] . '已拨过,拨币量为:' . $amount); }else{ dump(['用户ID:' . $info['user_id'],'拨币量为:' . $amount]); //发放 (new LedgerWalletModel)->changeWalletAccount($info['user_id'], Asset::QUBIC, $amount, LedgerQubicChangeModel::SysSend); } } return $log_id; } /** * 拨币 * 向会员发放qubic * 每一万算力每天收益14-15万个币 */ public function AllocateAleo() { $type_id = 11; $date = $this->getExeDate($type_id); if(empty($date)){ (new Output())->writeln("本次没有可用时间:" . $date); return ; } //创建定时任务执行日志 $log_id = (new TimedTaskLogModel())->insertGetId([ 'type_id' => $type_id, 'type_name' => $this->rewards_type[$type_id], 'date_time' => $date, 'create_time' => date('Y-m-d H:i:s'), ]); //查找会员资产列表 $info_list = DB::table('ledger_wallet') ->alias('w') ->join('user u','u.id = w.user_id') ->field('user_id,power') ->where('power', '>', 0) ->where('effective_time', '>', 0) //报单有收益 ->select(); if(empty($info_list)){ (new Output())->writeln("本次没有可用会员数据:" . $date); return $log_id; } $num = mt_rand(4030,4080) / 1000;//每一万算力每日获得Aleo的数量,算法为每一万算力每日产6.5个币,并从2024-9-20开始,每天递减5% $power_price = $num/10000;//每算力每日获得Aleo的数量,算法为每一万算力每日产6.5个币,并从2024-9-20开始,每天递减5% foreach ($info_list as $info) { $amount = ($info['power']) * $power_price; $check = (new LedgerQubicChangeModel()) ->where('user_id', $info['user_id']) ->where('action', LedgerTokenChangeModel::SysSend) ->where('from_id', strtotime($date)) ->count(); if($check){ dump('用户ID:' . $info['user_id'] . '已拨过,拨币量为:' . $amount); }else{ dump(['用户ID:' . $info['user_id'],'拨币量为:' . $amount]); //发放 (new LedgerWalletModel)->changeWalletAccount($info['user_id'], Asset::TOKEN, $amount, LedgerTokenChangeModel::SysSend); } } return $log_id; } /** * 获取可用日期 * @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; } }