PriceLogService.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | LARAVEL8.0 框架 [ LARAVEL ][ RXThinkCMF ]
  4. // +----------------------------------------------------------------------
  5. // | 版权所有 2017~2021 LARAVEL研发中心
  6. // +----------------------------------------------------------------------
  7. // | 官方网站: http://www.laravel.cn
  8. // +----------------------------------------------------------------------
  9. // | Author: laravel开发员 <laravel.qq.com>
  10. // +----------------------------------------------------------------------
  11. namespace App\Services\Api;
  12. use App\Models\PledgeOrderModel;
  13. use App\Models\PriceLogModel;
  14. use App\Services\BaseService;
  15. use App\Services\ConfigService;
  16. use App\Services\RedisService;
  17. /**
  18. * SBT价格-服务类
  19. * @author laravel开发员
  20. * @since 2020/11/11
  21. * @package App\Services\Api
  22. */
  23. class PriceLogService extends BaseService
  24. {
  25. protected static $instance;
  26. /**
  27. * 构造函数
  28. * @author laravel开发员
  29. * @since 2020/11/11
  30. */
  31. public function __construct()
  32. {
  33. $this->model = new PriceLogModel();
  34. }
  35. /**
  36. * 静态入口
  37. */
  38. public static function make()
  39. {
  40. if (!self::$instance) {
  41. self::$instance = new static();
  42. }
  43. return self::$instance;
  44. }
  45. /**
  46. * 获取最新价格
  47. * @param false $refresh
  48. * @return array|float|mixed|string
  49. */
  50. public function getSbtPrice($refresh=false)
  51. {
  52. $cacheKey = "caches:sbtPrice:price";
  53. $data = RedisService::get($cacheKey);
  54. if ($data && !$refresh) {
  55. return $data;
  56. }
  57. $info = $this->model->where(['status'=>1,'mark'=>1])->orderBy('date','desc')->first();
  58. $price = isset($info['price'])? floatval($info['price']) : 0.00;
  59. if($price<=0){
  60. $price = ConfigService::make()->getConfigByCode('sbt_price', 0.01);
  61. }
  62. RedisService::set($cacheKey, $price, rand(300,600));
  63. return $price;
  64. }
  65. /**
  66. * 更新当日价格
  67. * @return bool
  68. */
  69. public function updateSbtPrice($date = '')
  70. {
  71. $date = $date? $date : date('Y-m-d');
  72. if($this->getPriceByDate($date)){
  73. $this->error = 3001;
  74. return false;
  75. }
  76. $price = $this->getSbtPrice();
  77. $priceRiseRate = ConfigService::make()->getConfigByCode('sbt_price_rate', 1.5);
  78. $priceRiseRate = $priceRiseRate>0 && $priceRiseRate< 10? $priceRiseRate : 1.5;
  79. $priceRiseRange = ConfigService::make()->getConfigByCode('sbt_price_range', 0);
  80. $priceRiseRange = $priceRiseRange>=0 && $priceRiseRange< ($priceRiseRate-0.5)? $priceRiseRange : 0;
  81. $newPrice = rand(max(0, ($priceRiseRate-$priceRiseRange) * 100), ($priceRiseRate+0.1) * 100);
  82. $riseRate = round( $newPrice/100, 6);
  83. $riseRate = $riseRate>$priceRiseRate? $priceRiseRate : $riseRate;
  84. $newPrice = moneyFormat($price * (1 + $riseRate/100), 6);
  85. $data = [
  86. 'date'=> $date,
  87. 'price'=> $newPrice,
  88. 'price_rise'=> $riseRate,
  89. 'create_time'=> time(),
  90. 'status'=>1,
  91. 'mark'=>1
  92. ];
  93. if(!$this->model->insertGetId($data)){
  94. $this->error = 3002;
  95. return false;
  96. }
  97. // 清除旧价格
  98. RedisService::clear("caches:sbtPrice:price");
  99. $this->error = 3003;
  100. return true;
  101. }
  102. /**
  103. * 验证该日价格是否已更新
  104. * @param $date 日期 如:2024-07-20
  105. * @return array|mixed
  106. */
  107. public function getPriceByDate($date)
  108. {
  109. $cacheKey = "caches:sbtPrice:check_{$date}";
  110. $data = RedisService::get($cacheKey);
  111. if($data || RedisService::exists($cacheKey)){
  112. return $data;
  113. }
  114. $data = $this->model->where(['date'=> $date,'status'=>1,'mark'=>1])->value('id');
  115. if($data){
  116. RedisService::set($cacheKey, $data, 1.5 * 86400);
  117. }
  118. return $data;
  119. }
  120. /**
  121. * 质押订单统计
  122. * @param $userId 用户ID
  123. * @return array|mixed
  124. */
  125. public function getCounts($dateType=1, $refresh=false)
  126. {
  127. $cacheKey = "caches:sbtPrice:counts_{$dateType}";
  128. $counts = RedisService::get($cacheKey);
  129. if($counts && !$refresh){
  130. return $counts;
  131. }
  132. $priceList = $this->getDataListByDate($dateType, $refresh);
  133. $prices = isset($priceList['values'])? $priceList['values'] : [];
  134. $count = count($prices);
  135. $price = isset($prices[$count-1]) && $prices[$count-1]? $prices[$count-1] : 0.000000;
  136. $rise = isset($priceList['rise']) && $priceList['rise']? $priceList['rise'] : 0.00;
  137. $counts = [
  138. 'price' => $price>0? $price : 0.000000,
  139. 'price_text' => $price? $price : '0.000000',
  140. 'price_rise' => !empty($rise)? moneyFormat($rise, 2) : '0.00',
  141. 'priceLogs' => $priceList,
  142. ];
  143. RedisService::set($cacheKey, $counts, rand(3600, 7200));
  144. return $counts;
  145. }
  146. /**
  147. * 获取价格列表
  148. * @param int $dateType 时间类型:1-周,2-月,3-年
  149. * @param false $refresh
  150. * @return array|array[]|mixed
  151. */
  152. public function getDataListByDate($dateType=1, $refresh=false)
  153. {
  154. $cacheKey = "caches:sbtPrice:list_{$dateType}";
  155. $datas = RedisService::get($cacheKey);
  156. if($datas && !$refresh){
  157. return $datas;
  158. }
  159. $limit = $dateType == 1? 7 : 366;
  160. $lists = $this->model->where(['status'=>1,'mark'=>1])->where(function($query) use($dateType){
  161. $curTime = strtotime(date('Y-m-d'));
  162. if($dateType == 3){
  163. $query->where('date','>=', date('Y-01-01'));
  164. }else if($dateType == 2){
  165. $query->where('date','>=', date('Y-m-01'));
  166. }else{
  167. // $query->where('date','>=', date('Y-m-d', $curTime-7* 86400));
  168. }
  169. })->orderBy('date','asc')->limit($limit)->get();
  170. $lists = $lists? $lists->toArray() :[];
  171. $datas = ['titles'=>[],'values'=>[],'rise'=>'0.00'];
  172. if($lists){
  173. $data = end($lists);
  174. $datas['rise'] = isset($data['price_rise'])? $data['price_rise'] : '0.00';
  175. foreach ($lists as $val){
  176. $datas['titles'][] = date('m.d', strtotime($val['date']));
  177. $datas['values'][] = $val['price'];
  178. }
  179. }
  180. RedisService::set($cacheKey, $datas, rand(30,60));
  181. return $datas;
  182. }
  183. }