| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- <?php
- // +----------------------------------------------------------------------
- // | LARAVEL8.0 框架 [ LARAVEL ][ RXThinkCMF ]
- // +----------------------------------------------------------------------
- // | 版权所有 2017~2021 LARAVEL研发中心
- // +----------------------------------------------------------------------
- // | 官方网站: http://www.laravel.cn
- // +----------------------------------------------------------------------
- // | Author: laravel开发员 <laravel.qq.com>
- // +----------------------------------------------------------------------
- namespace App\Services\Api;
- use App\Models\PledgeOrderModel;
- use App\Models\PriceLogModel;
- use App\Services\BaseService;
- use App\Services\ConfigService;
- use App\Services\RedisService;
- /**
- * SBT价格-服务类
- * @author laravel开发员
- * @since 2020/11/11
- * @package App\Services\Api
- */
- class PriceLogService extends BaseService
- {
- protected static $instance;
- /**
- * 构造函数
- * @author laravel开发员
- * @since 2020/11/11
- */
- public function __construct()
- {
- $this->model = new PriceLogModel();
- }
- /**
- * 静态入口
- */
- public static function make()
- {
- if (!self::$instance) {
- self::$instance = new static();
- }
- return self::$instance;
- }
- /**
- * 获取最新价格
- * @param false $refresh
- * @return array|float|mixed|string
- */
- public function getSbtPrice($refresh=false)
- {
- $cacheKey = "caches:sbtPrice:price";
- $data = RedisService::get($cacheKey);
- if ($data && !$refresh) {
- return $data;
- }
- $info = $this->model->where(['status'=>1,'mark'=>1])->orderBy('date','desc')->first();
- $price = isset($info['price'])? floatval($info['price']) : 0.00;
- if($price<=0){
- $price = ConfigService::make()->getConfigByCode('sbt_price', 0.01);
- }
- RedisService::set($cacheKey, $price, rand(300,600));
- return $price;
- }
- /**
- * 更新当日价格
- * @return bool
- */
- public function updateSbtPrice($date = '')
- {
- $date = $date? $date : date('Y-m-d');
- if($this->getPriceByDate($date)){
- $this->error = 3001;
- return false;
- }
- $price = $this->getSbtPrice();
- $priceRiseRate = ConfigService::make()->getConfigByCode('sbt_price_rate', 1.5);
- $priceRiseRate = $priceRiseRate>0 && $priceRiseRate< 10? $priceRiseRate : 1.5;
- $priceRiseRange = ConfigService::make()->getConfigByCode('sbt_price_range', 0);
- $priceRiseRange = $priceRiseRange>=0 && $priceRiseRange< ($priceRiseRate-0.5)? $priceRiseRange : 0;
- $newPrice = rand(max(0, ($priceRiseRate-$priceRiseRange) * 100), ($priceRiseRate+0.1) * 100);
- $riseRate = round( $newPrice/100, 6);
- $riseRate = $riseRate>$priceRiseRate? $priceRiseRate : $riseRate;
- $newPrice = moneyFormat($price * (1 + $riseRate/100), 6);
- $data = [
- 'date'=> $date,
- 'price'=> $newPrice,
- 'price_rise'=> $riseRate,
- 'create_time'=> time(),
- 'status'=>1,
- 'mark'=>1
- ];
- if(!$this->model->insertGetId($data)){
- $this->error = 3002;
- return false;
- }
- // 清除旧价格
- RedisService::clear("caches:sbtPrice:price");
- $this->error = 3003;
- return true;
- }
- /**
- * 验证该日价格是否已更新
- * @param $date 日期 如:2024-07-20
- * @return array|mixed
- */
- public function getPriceByDate($date)
- {
- $cacheKey = "caches:sbtPrice:check_{$date}";
- $data = RedisService::get($cacheKey);
- if($data || RedisService::exists($cacheKey)){
- return $data;
- }
- $data = $this->model->where(['date'=> $date,'status'=>1,'mark'=>1])->value('id');
- if($data){
- RedisService::set($cacheKey, $data, 1.5 * 86400);
- }
- return $data;
- }
- /**
- * 质押订单统计
- * @param $userId 用户ID
- * @return array|mixed
- */
- public function getCounts($dateType=1, $refresh=false)
- {
- $cacheKey = "caches:sbtPrice:counts_{$dateType}";
- $counts = RedisService::get($cacheKey);
- if($counts && !$refresh){
- return $counts;
- }
- $priceList = $this->getDataListByDate($dateType, $refresh);
- $prices = isset($priceList['values'])? $priceList['values'] : [];
- $count = count($prices);
- $price = isset($prices[$count-1]) && $prices[$count-1]? $prices[$count-1] : 0.000000;
- $rise = isset($priceList['rise']) && $priceList['rise']? $priceList['rise'] : 0.00;
- $counts = [
- 'price' => $price>0? $price : 0.000000,
- 'price_text' => $price? $price : '0.000000',
- 'price_rise' => !empty($rise)? moneyFormat($rise, 2) : '0.00',
- 'priceLogs' => $priceList,
- ];
- RedisService::set($cacheKey, $counts, rand(3600, 7200));
- return $counts;
- }
- /**
- * 获取价格列表
- * @param int $dateType 时间类型:1-周,2-月,3-年
- * @param false $refresh
- * @return array|array[]|mixed
- */
- public function getDataListByDate($dateType=1, $refresh=false)
- {
- $cacheKey = "caches:sbtPrice:list_{$dateType}";
- $datas = RedisService::get($cacheKey);
- if($datas && !$refresh){
- return $datas;
- }
- $limit = $dateType == 1? 7 : 366;
- $lists = $this->model->where(['status'=>1,'mark'=>1])->where(function($query) use($dateType){
- $curTime = strtotime(date('Y-m-d'));
- if($dateType == 3){
- $query->where('date','>=', date('Y-01-01'));
- }else if($dateType == 2){
- $query->where('date','>=', date('Y-m-01'));
- }else{
- // $query->where('date','>=', date('Y-m-d', $curTime-7* 86400));
- }
- })->orderBy('date','asc')->limit($limit)->get();
- $lists = $lists? $lists->toArray() :[];
- $datas = ['titles'=>[],'values'=>[],'rise'=>'0.00'];
- if($lists){
- $data = end($lists);
- $datas['rise'] = isset($data['price_rise'])? $data['price_rise'] : '0.00';
- foreach ($lists as $val){
- $datas['titles'][] = date('m.d', strtotime($val['date']));
- $datas['values'][] = $val['price'];
- }
- }
- RedisService::set($cacheKey, $datas, rand(30,60));
- return $datas;
- }
- }
|