Ai.php
8.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
<?php
/**
* Created by PhpStorm.
* User: YRF
* Date: 2024/6/18
* Time: 9:36
*/
namespace app\api\controller\v6;
//允许所有的跨域请求
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: *");
header('Access-Control-Allow-Methods: POST,GET,OPTIONS');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400');
date_default_timezone_set('PRC');
use think\Db;
use app\common\controller\Api;
//v6 监管端功能
class Ai extends Api
{
// 无需登录的接口,*表示全部
protected $noNeedLogin = [];
// 无需鉴权的接口,*表示全部
protected $noNeedRight = ['*'];
protected $ai_user_id = "rodneyxiong";
protected $ai_token = "xXR91v8rbM9J550OeeR4373Bp3szixUM";
protected $assistant_id = "Ct6OlatKkiEK";
protected $apiUrl = "https://open.hunyuan.tencent.com/openapi/v1/agent/chat/completions";
protected $rid = 40;
//水库信息AI分析
public function AiAsk()
{
//获得前端伟过来的数据
$msg = $this->request->post('messages/a', '');
//dump($msg);
// 定义请求头
$headers = array(
'X-Source: openapi',
'Content-Type: application/json',
'Authorization: Bearer ' . $this->ai_token
);
if (empty($msg) || !isset($msg[0]['role'])) {
//获得水库基本信息
$river = Db::name('reservoir_list')
->where(['id' => $this->rid])
->find();
//获得库容最大值
$maxkr = Db::name('warterdata_capacityof')
->where(['reservoir_id' => $river['id']])
->order('id desc')
->find();
//获得最近3天水位
// 获取前两天的日期
$twoDaysBefore = date('Y-m-d', strtotime('-2 day', time()));
$twoDaysBeforeStartTimestamp = strtotime($twoDaysBefore . ' 00:00:00');
$warerlevel = Db::name('reservoir_rain_water_level')
->alias('l')
->join("warterdata_capacityof w", "l.water_level=w.warterdata", 'left')
->where(['l.reservoir_id' => $river['id']])
->where("l.createtime>=" . $twoDaysBeforeStartTimestamp)
->order("l.id desc")
->field("l.*,w.CapacityOf")
->select();
if (isset($warerlevel[0]['water_level']) && $warerlevel[0]['water_level'] > 0) {
$nowlevel = $warerlevel[0]['water_level'];
$nowcapof = $warerlevel[0]['CapacityOf'];
} else {
$nowlevel = 0;
$nowcapof = 0;
}
$riverStr = $river['name'] . "正常水位" . $river['normal_water_level'] . "m,死水位" . $river['dead_water_level'] . "m,警戒水位" . $maxkr['warterdata'] . "m,当前水位" . $nowlevel . "m,当前库容" . $nowcapof . "万方,最大库容" . $river['under'] . "万方";
$messages = array(
array(
"type" => "text",
"text" => "以下数据是实时水库监测数据,请根据数据分析水库的水位、降雨量、渗流压力、渗流量、坝体地表位移、综合情况、以及给出当前情况的防汛方案。"
),
array(
"type" => "text",
"text" => $riverStr
)
);
//处理水位列表为文字
$levelStr = "最近几天水位列表如下:";
if (!empty($warerlevel)) {
foreach ($warerlevel as $k => $v) {
$dtime = date('Y-m-d H:i:s', $v['createtime']);
$levelStr .= $dtime . "水位" . $v['water_level'] . "m,库容" . $v['CapacityOf'] . "万方;";
}
$messages[] = array(
"type" => "text",
"text" => $levelStr
);
}
//获得最近3天的降雨量列表
$rainlist = Db::name('reservoir_rain_rainfall')
->where(['reservoir_id' => $river['id']])
->where("createtime>=" . $twoDaysBeforeStartTimestamp)
->order("id desc")
->select();
if (!empty($rainlist)) {
$rainStr = "最近几天降雨量列表如下:";
foreach ($rainlist as $v1) {
$dtime1 = date('Y-m-d H:i:s', $v1['createtime']);
$rainStr .= $dtime1 . "小时降雨量" . $v1['rainfall'] . "mm,当日总降雨量" . $v1['total_rainfall'] . "mm;";
}
$messages[] = array(
"type" => "text",
"text" => $rainStr
);
}
//渗压列表
$sy = Db::name('reservoir_dam_isotonic')
->where(['reservoir_id' => $river['id']])
->where("createtime>=" . $twoDaysBeforeStartTimestamp)
->order("id desc")
->limit(150)
->select();
if (!empty($sy)) {
$syStr = "最近几天渗流压力列表如下:";
foreach ($sy as $v2) {
$dtime2 = date('Y-m-d H:i:s', $v2['createtime']);
$syStr .= $dtime2 . "渗压值" . $v2['value'] . "kPa,浸润性深度" . $v2['dx_value'] . "m;";
}
$messages[] = array(
"type" => "text",
"text" => $syStr
);
}
//渗流量列表
$slist = Db::name('reservoir_dam_seepage')
->where(['reservoir_id' => $river['id']])
->where("createtime>=" . $twoDaysBeforeStartTimestamp)
->order("id desc")
->select();
if (!empty($slist)) {
$sStr = "最近几天渗流量值列表如下:";
foreach ($slist as $v3) {
$dtime3 = date('Y-m-d H:i:s', $v3['createtime']);
$sStr .= $dtime3 . "渗流量值" . $v3['value'] . "L/s;";
}
$messages[] = array(
"type" => "text",
"text" => $sStr
);
}
//坝体地表位移
$disp = Db::name('reservoir_dam_displacement')
->where(['reservoir_id' => $river['id']])
->where("createtime>=" . $twoDaysBeforeStartTimestamp)
->order("id desc")
->select();
if (!empty($disp)) {
$dStr = "最近几天坝体地表位移列表如下:";
foreach ($disp as $v4) {
$dtime4 = date('Y-m-d H:i:s', $v4['createtime']);
$dStr .= $dtime4 . "水平位移x" . $v4['horizontal'] . "mm,水平位移Y" . $v4['horizontalY'] . "mm,垂直位移z" . $v4['vertical'] . "mm;";
}
$messages[] = array(
"type" => "text",
"text" => $dStr
);
}
//组装数据发和回复的列表
$msg = array(
array(
"role" => "user",
"content" => $messages
),
);
}
$data = json_encode([
"assistant_id" => $this->assistant_id,
"user_id" => $this->ai_user_id,
"stream" => false,
"messages" => $msg
]);
//dump($data);die;
//发送请求
// 初始化 cURL
$ch = curl_init($this->apiUrl);
// 设置选项
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
// 发送请求并获取响应
$response = curl_exec($ch);
// 检查是否有错误发生
if (curl_errno($ch)) {
$error = curl_error($ch);
var_dump($error);
}
// 关闭 cURL 资源
curl_close($ch);
// 处理响应
$response = json_decode($response, true);
if (!empty($response['choices'][0]['message'])) {
$msg[] = array(
"role" => "assistant",
"content" => array(
array(
"type" => "text",
"text" => $response['choices'][0]['message']['content']
),
)
);
} else {
//dump($response);
$this->error("请求超时");
}
$this->success('获取成功', $msg);
}
}