You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
6.1 KiB
139 lines
6.1 KiB
<?php
|
|
|
|
namespace app\home\service;
|
|
|
|
use app\model\ApiCalledNumModel;
|
|
use app\model\PurchaseVipModel;
|
|
use app\model\StockMarketModel;
|
|
use app\utility\HttpHandler;
|
|
use think\facade\Log;
|
|
|
|
class StockService extends BaseHomeService
|
|
{
|
|
|
|
// 校验股票市场状态
|
|
public function checkMarketStatus($param): array
|
|
{
|
|
try {
|
|
|
|
if(empty($param['type']) || !is_numeric($param['type'])){
|
|
return $this->toData('0', 'SUCCESS', ['status' => '2']);
|
|
}
|
|
|
|
// 1 开启 2 关闭
|
|
$market = StockMarketModel::where('stock_market_type', $param['type'])->find();
|
|
if(empty($market)){
|
|
return $this->toData('0', 'SUCCESS', ['status' => '2']);
|
|
}
|
|
|
|
if($market->status == StockMarketModel::STATUS_OFF){
|
|
return $this->toData('0', 'SUCCESS', ['status' => '2', 'market' => $market->toArray()]);
|
|
}
|
|
|
|
// 如果是开启 则判断是否在开盘时间段
|
|
$date = date('H:i');
|
|
$dateTime = \DateTime::createFromFormat('H:i', $date);
|
|
$amOpenTime = \DateTime::createFromFormat('H:i', $market->am_open_time);
|
|
$pmOpenTime = \DateTime::createFromFormat('H:i', $market->pm_open_time);
|
|
$amCloseTime = \DateTime::createFromFormat('H:i', $market->am_close_time);
|
|
$pmCloseTime = \DateTime::createFromFormat('H:i', $market->pm_close_time);
|
|
|
|
// 判断 上午盘
|
|
if($amOpenTime > $amCloseTime){
|
|
// 开盘时间 大于 闭盘时间 跨天
|
|
if($dateTime >= $amOpenTime || $dateTime <= $amCloseTime){
|
|
return $this->toData('0', 'SUCCESS', ['status' => '1','market' => $market->toArray(),$dateTime,$amOpenTime,$amCloseTime,1]);
|
|
}
|
|
} else {
|
|
if($dateTime >= $amOpenTime && $dateTime <= $amCloseTime){
|
|
return $this->toData('0', 'SUCCESS', ['status' => '1','market' => $market->toArray(),$dateTime,$amOpenTime,$amCloseTime,2]);
|
|
}
|
|
}
|
|
|
|
// 下午盘
|
|
if($pmOpenTime > $pmCloseTime){
|
|
// 开盘时间 大于 闭盘时间 跨天
|
|
if($dateTime >= $pmOpenTime || $dateTime <= $pmCloseTime){
|
|
return $this->toData('0', 'SUCCESS', ['status' => '1','market' => $market->toArray(),$dateTime,$pmOpenTime,$pmCloseTime,3]);
|
|
}
|
|
} else {
|
|
if($dateTime >= $pmOpenTime && $dateTime <= $pmCloseTime){
|
|
return $this->toData('0', 'SUCCESS', ['status' => '1','market' => $market->toArray(),$dateTime,$pmOpenTime,$pmCloseTime,4]);
|
|
}
|
|
}
|
|
|
|
return $this->toData('0', 'SUCCESS', ['status' => '2','market' => $market->toArray()]);
|
|
}catch (\Exception $exception){
|
|
return $this->toData('400','System error',[$exception->getMessage()]);
|
|
}
|
|
|
|
}
|
|
|
|
public function stockAnalysis($userId,$param){
|
|
try {
|
|
if (empty($userId)) {
|
|
return $this->toData('400','用户ID不能为空');
|
|
|
|
}
|
|
if (empty($param['stock_code'])) {
|
|
return $this->toData('400','缺少参数');
|
|
}
|
|
|
|
// 检测用户调用该接口次数,普通用户只能调用5次,vip用户可以无限次调用
|
|
$apiCalledNum = ApiCalledNumModel::where(['user_id'=>$userId])->find();
|
|
if (!empty($apiCalledNum) && $apiCalledNum->stock_api >= ApiCalledNumModel::API_CALLED_LIMIT) {
|
|
$vipInfo = PurchaseVipModel::where(['user_id'=>$userId])->find();
|
|
if (empty($vipInfo)) {
|
|
return $this->toData('400', '非会员用户只能使用5次股票分析接口');
|
|
} else {
|
|
if ($vipInfo->expire <= date("Y-m-d H:i:s")) {
|
|
return $this->toData('400', '非会员用户只能使用5次股票分析接口');
|
|
}
|
|
}
|
|
}
|
|
|
|
$replaceData = [
|
|
'{stock_code}' => $param['stock_code']
|
|
];
|
|
$msgTml = "1. 获取{stock_code}的最新股价、市场情绪及相关新闻。2. 结合过去 30 天的价格走势,预测未来 7 天的短期趋势。3. 提供投资建议(买入、持有或卖出),并说明理由。4. 如果可能,引用具体数据或事件支持你的分析。";
|
|
$msg = str_replace(array_keys($replaceData), array_values($replaceData), $msgTml);
|
|
$headers = [
|
|
'Content-Type' => 'application/json',
|
|
'Authorization' => 'Bearer xai-X2H9moLMSKQaCMsfnjZxjfvHeRd0O3Q8zBfJ3I3sEOSIYd8840zsUvUWkj6g2rxy5VfRMRF87YkSsE85',
|
|
'cf-aig-authorization' => 'Bearer RCnKINIJTYVgFIbJjPznXekn0SV94GRVIait3-vO',
|
|
];
|
|
$reqData = [
|
|
'model' => 'grok-2-1212',
|
|
// 'max_tokens' => 500, //会限制输出结果长度
|
|
'temperature' => 0.6,
|
|
'messages' => [
|
|
[
|
|
'role' => 'user',
|
|
'content' => $msg
|
|
]
|
|
],
|
|
];
|
|
$url = "https://gateway.ai.cloudflare.com/v1/14aa58d158b80afdedd874eb4bc82636/chatgpt-api/grok/v1/chat/completions";
|
|
$result = HttpHandler::reqPost($url, $headers, $reqData);
|
|
if ($result['code'] != 200) {
|
|
return $this->toData('500', '数据错误,稍后再试', $result);
|
|
}
|
|
$getBody = json_decode($result['data'], true);
|
|
$getChoices = $getBody['choices'];
|
|
|
|
// 更新用户调用该接口次数
|
|
if (empty($apiCalledNum)) {
|
|
ApiCalledNumModel::create([
|
|
'user_id' => $userId,
|
|
'stock_api' => 1
|
|
]);
|
|
} else {
|
|
ApiCalledNumModel::where(['user_id'=>$userId])->inc('stock_api')->save();
|
|
}
|
|
|
|
return $this->toData('0', 'success', $getChoices);
|
|
} catch (\Exception $exception){
|
|
return $this->toData('500','System error',[$exception->getMessage()]);
|
|
}
|
|
}
|
|
}
|