value('icon'); Cache::set($symbol, $icon); } $defStatus = [ 'progress'=> 0, 'symbol'=>$symbol, 'icon'=>$icon, 'total'=> 0, 'ts' => time(), ]; if ($symbol) { $mymining = UserHash::mining_get($uid) ?? $defStatus; if ($mymining['progress'] > 0) { $mining = $this->calcMining($uid, $mymining); UserHash::mining_set($uid, $mining); } } // 跑马灯 $carousel = SystemCarousel::getFirst(20); return JsonService::successful(compact('unread', 'mining', 'carousel')); } /** * 根据上次挖矿状态, 和过去的时长, 计算当前的状态 * @param $p * @return mixed */ protected function calcMining($uid, $p) { if ($p['progress'] <= 0) { return $p; } if (!isset($p['ts'])) { return $p; } $now = time(); $secs_passed = $now - $p['ts']; $secs_unit = Config::get('app.mining_sec_unit'); $reward_unit = Config::get('app.mining_num_per_unit'); $hours = Config::get('app.mining_time'); if (count($hours) != 2 || $hours[0] > $hours[1]) { Log::warning('app.mining_time config error.'); return $p; } $hour = random_int($hours[0], $hours[1]); $secs = $hour * 60 * 60; // if ($secs_passed >= $secs) { // 挖矿结束 $p['progress'] = 0; // 本次个数 $count = floatval(bcmul(bcdiv($secs, $secs_unit, 8), $reward_unit, 8)); // save to database if (!UserCoinTransfer::addMining($uid, $p['order_id'], $p['symbol'], $count)) { Log::error("user<$uid> save transfer failed, amount<$count>"); } $p['total'] += $count; return $p; } $count = floatval(bcmul(bcdiv($secs_passed, $secs_unit, 8), $reward_unit, 8)); $p['progress'] = $count; return $p; } }