p2 project
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.

142 lines
6.3 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','缺少参数');
}
// p4项目无限制调用股票分析接口
if (!isset($param['project']) || $param['project'] != 'p4') {
// 检测用户调用该接口次数,普通用户只能调用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()]);
}
}
}