AIProjectHelper.cs 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796
  1. using log4net;
  2. using Microsoft.AspNetCore.Mvc;
  3. using Microsoft.AspNetCore.Mvc.RazorPages;
  4. using Newtonsoft.Json;
  5. using Newtonsoft.Json.Linq;
  6. using RabbitMQ.Client;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Net.Http;
  11. using System.Net.Http.Headers;
  12. using System.Security.Principal;
  13. using System.Text;
  14. using System.Threading.Tasks;
  15. namespace Ropin.Inspection.Common.Helper
  16. {
  17. public class AIProjectHelper
  18. {
  19. private readonly IHttpClientFactory _httpClientFactory;
  20. private static readonly ILog log = LogManager.GetLogger(typeof(AIProjectHelper));
  21. public static AILoginOutput loginResult;
  22. public AIProjectHelper(IHttpClientFactory httpClientFactory)
  23. {
  24. _httpClientFactory = httpClientFactory;
  25. }
  26. /// <summary>
  27. /// AI会话
  28. /// </summary>
  29. /// <returns></returns>
  30. public async Task<AIResponse> AiConversation(AIConversationSearch search)
  31. {
  32. AIResponse result = null;
  33. string url = "http://124.71.132.255:85/v1/chat-messages";
  34. string apiKey = "app-gcL3l4vVMcrUrA6HLOk5e4Fi";
  35. using (var client = _httpClientFactory.CreateClient())
  36. { // 设置默认请求头
  37. client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");
  38. // Set a custom timeout, for example, 300 seconds
  39. client.Timeout = TimeSpan.FromSeconds(600);
  40. var str = JsonConvert.SerializeObject(search);
  41. var request = new HttpRequestMessage(HttpMethod.Post, url)
  42. {
  43. Content = new StringContent(str, System.Text.Encoding.UTF8, "application/json")
  44. };
  45. request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  46. try
  47. {
  48. var response = await client.SendAsync(request);
  49. response.EnsureSuccessStatusCode(); // 确保响应状态码为成功
  50. if (response.IsSuccessStatusCode)
  51. {
  52. var strReturn = await response.Content.ReadAsStringAsync();
  53. result = JsonConvert.DeserializeObject<AIResponse>(strReturn);
  54. }
  55. }
  56. catch (Exception ex)
  57. {
  58. log.Info($"获取AiConversation时发生未知异常【{ex.Message}】");
  59. }
  60. }
  61. return result;
  62. }
  63. /// <summary>
  64. /// 获取token
  65. /// </summary>
  66. /// <returns></returns>
  67. public async Task<AILoginOutput> GetToken()
  68. {
  69. if (loginResult != null)
  70. {
  71. return loginResult;
  72. }
  73. AILoginOutput token = null;
  74. //string url = string.Format(AIConst.ApiUrl+ AIConst.loginUrl);
  75. string url =AIConst.ApiUrl + AIConst.loginUrl;
  76. using (var client = _httpClientFactory.CreateClient())
  77. {
  78. var login = new
  79. {
  80. Account = AIConst.userName,
  81. Password = AIConst.userPwd
  82. };
  83. var loginStr = JsonConvert.SerializeObject(login);
  84. var request = new HttpRequestMessage(HttpMethod.Post, url)
  85. {
  86. Content = new StringContent(loginStr, System.Text.Encoding.UTF8, "application/json")
  87. };
  88. request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  89. try
  90. {
  91. var response = await client.SendAsync(request);
  92. response.EnsureSuccessStatusCode(); // 确保响应状态码为成功
  93. if (response.IsSuccessStatusCode)
  94. {
  95. var strReturn = await response.Content.ReadAsStringAsync();
  96. AIModel<AILoginOutput> tencentToken = JsonConvert.DeserializeObject<AIModel<AILoginOutput>>(strReturn);
  97. if (tencentToken != null && tencentToken.code=="200")
  98. {
  99. token = tencentToken.result;
  100. }
  101. }
  102. }
  103. catch (HttpRequestException ex)
  104. {
  105. log.Info($"AItoken异常【{ex.Message}】");
  106. }
  107. catch (JsonException ex)
  108. {
  109. log.Info($"解析AIToken响应异常【{ex.Message}】");
  110. }
  111. catch (Exception ex)
  112. {
  113. log.Info($"获取AIToken时发生未知异常【{ex.Message}】");
  114. }
  115. }
  116. loginResult = token;
  117. return token;
  118. }
  119. /// <summary>
  120. /// 获取历史报警记录
  121. /// </summary>
  122. /// <returns></returns>
  123. public async Task<AISqlSugarPagedList<AlmRecordOutput>> GetHistoricAlmrecord(string Devno, int Page = 1, int pageSize = 10,long? entityId=null)
  124. {
  125. if (loginResult == null)
  126. {
  127. loginResult = await GetToken();
  128. }
  129. if (loginResult==null|| loginResult.RefreshToken==null)
  130. {
  131. log.Info($"AI-获取历史报警记录-token 为空");
  132. return null;
  133. }
  134. AISqlSugarPagedList<AlmRecordOutput> almData= null;
  135. string url = AIConst.ApiUrl + AIConst.HistoricAlmrecord;
  136. using (var client = _httpClientFactory.CreateClient())
  137. {
  138. entityId = entityId ?? AIConst.AIEntityId;
  139. // 设置请求头,添加 token
  140. client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", loginResult.AccessToken);
  141. var data = new
  142. {
  143. isPage= Page==0?false:true,
  144. Page= Page,
  145. PageSize=pageSize,
  146. SearchKey = Devno,
  147. EntityId= entityId,
  148. ThirdParty = "",
  149. Device_Type="",
  150. Event_Code = "",
  151. Mistake=false,
  152. //StartTimeRange = ["",""]
  153. };
  154. var dataStr = JsonConvert.SerializeObject(data);
  155. var request = new HttpRequestMessage(HttpMethod.Post, url)
  156. {
  157. Content = new StringContent(dataStr, System.Text.Encoding.UTF8, "application/json")
  158. };
  159. request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  160. try
  161. {
  162. var response = await client.SendAsync(request);
  163. response.EnsureSuccessStatusCode(); // 确保响应状态码为成功
  164. if (response.IsSuccessStatusCode)
  165. {
  166. var strReturn = await response.Content.ReadAsStringAsync();
  167. AIModel<AISqlSugarPagedList<AlmRecordOutput>> ResponseRestult = JsonConvert.DeserializeObject<AIModel<AISqlSugarPagedList<AlmRecordOutput>>>(strReturn);
  168. if (ResponseRestult != null && ResponseRestult.code == "200")
  169. {
  170. almData = ResponseRestult.result;
  171. }
  172. }
  173. }
  174. catch (HttpRequestException ex)
  175. {
  176. log.Info($"AI-获取历史报警记录-异常【{ex.Message}】");
  177. }
  178. catch (JsonException ex)
  179. {
  180. log.Info($"解析AI-获取历史报警记录-响应异常【{ex.Message}】");
  181. }
  182. catch (Exception ex)
  183. {
  184. log.Info($"获取AI-获取历史报警记录-时发生未知异常【{ex.Message}】");
  185. }
  186. }
  187. return almData;
  188. }
  189. /// <summary>
  190. /// 获取报警处理
  191. /// </summary>
  192. /// <returns></returns>
  193. public async Task<AISqlSugarPagedList<AlmRecordOutput>> GetAlmDispose(string Devno, int Page = 1, int pageSize = 10, long? entityId = null)
  194. {
  195. if (loginResult == null)
  196. {
  197. loginResult = await GetToken();
  198. }
  199. if (loginResult == null || loginResult.RefreshToken == null)
  200. {
  201. log.Info($"AI-获取历史报警记录-token 为空");
  202. return null;
  203. }
  204. AISqlSugarPagedList<AlmRecordOutput> almData = null;
  205. string url = AIConst.ApiUrl + AIConst.AlmDispose;
  206. using (var client = _httpClientFactory.CreateClient())
  207. {
  208. entityId = entityId ?? AIConst.AIEntityId;
  209. // 设置请求头,添加 token
  210. client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", loginResult.AccessToken);
  211. var data = new
  212. {
  213. isPage = Page == 0 ? false : true,
  214. Page = Page,
  215. PageSize = pageSize,
  216. SearchKey = Devno,
  217. EntityId = entityId,
  218. ThirdParty = "",
  219. Device_Type = "",
  220. Event_Code = "",
  221. Mistake = false,
  222. //StartTimeRange = ["",""]
  223. };
  224. var dataStr = JsonConvert.SerializeObject(data);
  225. var request = new HttpRequestMessage(HttpMethod.Post, url)
  226. {
  227. Content = new StringContent(dataStr, System.Text.Encoding.UTF8, "application/json")
  228. };
  229. request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  230. try
  231. {
  232. var response = await client.SendAsync(request);
  233. response.EnsureSuccessStatusCode(); // 确保响应状态码为成功
  234. if (response.IsSuccessStatusCode)
  235. {
  236. var strReturn = await response.Content.ReadAsStringAsync();
  237. AIModel<AISqlSugarPagedList<AlmRecordOutput>> ResponseRestult = JsonConvert.DeserializeObject<AIModel<AISqlSugarPagedList<AlmRecordOutput>>>(strReturn);
  238. if (ResponseRestult != null && ResponseRestult.code == "200")
  239. {
  240. almData = ResponseRestult.result;
  241. }
  242. }
  243. }
  244. catch (HttpRequestException ex)
  245. {
  246. log.Info($"AI-获取历史报警记录-异常【{ex.Message}】");
  247. }
  248. catch (JsonException ex)
  249. {
  250. log.Info($"解析AI-获取历史报警记录-响应异常【{ex.Message}】");
  251. }
  252. catch (Exception ex)
  253. {
  254. log.Info($"获取AI-获取历史报警记录-时发生未知异常【{ex.Message}】");
  255. }
  256. }
  257. return almData;
  258. }
  259. /// <summary>
  260. /// AI报警修改
  261. /// </summary>
  262. /// <returns></returns>
  263. public async Task<bool> UpdateAlm(string dataStr)
  264. {
  265. if (loginResult == null)
  266. {
  267. loginResult = await GetToken();
  268. }
  269. if (loginResult == null || loginResult.RefreshToken == null)
  270. {
  271. log.Info($"AI-AI报警修改-token 为空");
  272. return false;
  273. }
  274. bool result = false;
  275. string url = AIConst.ApiUrl + AIConst.AlmUpdateDispose;
  276. using (var client = _httpClientFactory.CreateClient())
  277. {
  278. // 设置请求头,添加 token
  279. client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", loginResult.AccessToken);
  280. //var data = new
  281. //{
  282. // Id = AlmId
  283. //};
  284. //var dataStr = JsonConvert.SerializeObject(data);
  285. var request = new HttpRequestMessage(HttpMethod.Post, url)
  286. {
  287. Content = new StringContent(dataStr, System.Text.Encoding.UTF8, "application/json")
  288. };
  289. request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  290. try
  291. {
  292. var response = await client.SendAsync(request);
  293. response.EnsureSuccessStatusCode(); // 确保响应状态码为成功
  294. if (response.IsSuccessStatusCode)
  295. {
  296. var strReturn = await response.Content.ReadAsStringAsync();
  297. AIModel<object> ResponseRestult = JsonConvert.DeserializeObject<AIModel<object>>(strReturn);
  298. if (ResponseRestult != null && ResponseRestult.code == "200")
  299. {
  300. result = true;
  301. }
  302. else
  303. {
  304. log.Info($"AI报警修改-失败【{strReturn}】");
  305. }
  306. }
  307. }
  308. catch (HttpRequestException ex)
  309. {
  310. log.Info($"AI报警修改-异常【{ex.Message}】");
  311. }
  312. catch (JsonException ex)
  313. {
  314. log.Info($"AI报警修改-响应异常【{ex.Message}】");
  315. }
  316. catch (Exception ex)
  317. {
  318. log.Info($"AI报警修改-时发生未知异常【{ex.Message}】");
  319. }
  320. }
  321. return result;
  322. }
  323. /// <summary>
  324. /// AI报警软删除
  325. /// </summary>
  326. /// <returns></returns>
  327. public async Task<bool> UpdateAlmIsDelete(long AlmId)
  328. {
  329. if (loginResult == null)
  330. {
  331. loginResult = await GetToken();
  332. }
  333. if (loginResult == null || loginResult.RefreshToken == null)
  334. {
  335. log.Info($"AI-AI报警软删除-token 为空");
  336. return false;
  337. }
  338. bool result=false;
  339. string url = AIConst.ApiUrl + AIConst.AlmDeleteDispose;
  340. using (var client = _httpClientFactory.CreateClient())
  341. {
  342. // 设置请求头,添加 token
  343. client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", loginResult.AccessToken);
  344. var data = new
  345. {
  346. Id= AlmId
  347. };
  348. var dataStr = JsonConvert.SerializeObject(data);
  349. var request = new HttpRequestMessage(HttpMethod.Post, url)
  350. {
  351. Content = new StringContent(dataStr, System.Text.Encoding.UTF8, "application/json")
  352. };
  353. request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  354. try
  355. {
  356. var response = await client.SendAsync(request);
  357. response.EnsureSuccessStatusCode(); // 确保响应状态码为成功
  358. if (response.IsSuccessStatusCode)
  359. {
  360. var strReturn = await response.Content.ReadAsStringAsync();
  361. AIModel<object> ResponseRestult = JsonConvert.DeserializeObject<AIModel<object>>(strReturn);
  362. if (ResponseRestult != null && ResponseRestult.code == "200")
  363. {
  364. result =true;
  365. }
  366. }
  367. }
  368. catch (HttpRequestException ex)
  369. {
  370. log.Info($"AI报警软删除-异常【{ex.Message}】");
  371. }
  372. catch (JsonException ex)
  373. {
  374. log.Info($"AI报警软删除-响应异常【{ex.Message}】");
  375. }
  376. catch (Exception ex)
  377. {
  378. log.Info($"AI报警软删除-时发生未知异常【{ex.Message}】");
  379. }
  380. }
  381. return result;
  382. }
  383. }
  384. public class AIConversationSearch
  385. {
  386. public object inputs { get; set; }
  387. public string user { get; set; }
  388. public string query { get; set; }
  389. }
  390. public class Usage
  391. {
  392. public int prompt_tokens { get; set; }
  393. public string prompt_unit_price { get; set; }
  394. public string prompt_price_unit { get; set; }
  395. public string prompt_price { get; set; }
  396. public int completion_tokens { get; set; }
  397. public string completion_unit_price { get; set; }
  398. public string completion_price_unit { get; set; }
  399. public string completion_price { get; set; }
  400. public int total_tokens { get; set; }
  401. public string total_price { get; set; }
  402. public string currency { get; set; }
  403. public double latency { get; set; }
  404. }
  405. // 定义 Metadata 类
  406. public class Metadata
  407. {
  408. public Usage usage { get; set; }
  409. }
  410. // 定义响应数据类
  411. public class AIResponse
  412. {
  413. public string @event { get; set; }
  414. public string task_id { get; set; }
  415. public string id { get; set; }
  416. public string message_id { get; set; }
  417. public string conversation_id { get; set; }
  418. public string mode { get; set; }
  419. public string answer { get; set; }
  420. public Metadata metadata { get; set; }
  421. public long created_at { get; set; }
  422. }
  423. public class AIModel<T>
  424. {
  425. public string code { get; set; }
  426. public string type { get; set; }
  427. public string message { get; set; }
  428. public T result { get; set; }
  429. public string extras { get; set; }
  430. public string time { get; set; }
  431. }
  432. /// <summary>
  433. /// 用户登录结果
  434. /// </summary>
  435. public class AILoginOutput
  436. {
  437. /// <summary>
  438. /// 令牌Token
  439. /// </summary>
  440. public string AccessToken { get; set; }
  441. /// <summary>
  442. /// 刷新Token
  443. /// </summary>
  444. public string RefreshToken { get; set; }
  445. private long UserId { get; set; }
  446. public void SetUserId(long userId)
  447. {
  448. UserId = userId;
  449. }
  450. public long GetUserId()
  451. {
  452. return UserId;
  453. }
  454. }
  455. /// <summary>
  456. /// 报警记录表输出参数
  457. /// </summary>
  458. public class AlmRecordOutput
  459. {
  460. /// <summary>
  461. /// 主键Id
  462. /// </summary>
  463. public long Id { get; set; }
  464. /// <summary>
  465. /// 第三方
  466. /// </summary>
  467. public string ThirdParty { get; set; }
  468. public string ThirdPartyName { get; set; }
  469. /// <summary>
  470. /// 设备Id
  471. /// </summary>
  472. public string Device_Id { get; set; }
  473. /// <summary>
  474. /// AI设备名称
  475. /// </summary>
  476. public string AIDevName { get; set; }
  477. /// <summary>
  478. /// 通道ID
  479. /// </summary>
  480. public string? MonitorChannel { get; set; }
  481. /// <summary>
  482. /// 通道设备ID
  483. /// </summary>
  484. public string? MonitorDevice { get; set; }
  485. /// <summary>
  486. /// 设备通道在线状态
  487. /// </summary>
  488. public string? MonitorChannelStatus { get; set; }
  489. /// <summary>
  490. /// 烟感设备名称
  491. /// </summary>
  492. public string IotDevName { get; set; }
  493. /// <summary>
  494. /// 关联Id
  495. /// </summary>
  496. public string? Relation_Id { get; set; }
  497. /// <summary>
  498. /// 设备类型
  499. /// </summary>
  500. public string? Device_Type { get; set; }
  501. /// <summary>
  502. /// 设备类型名称
  503. /// </summary>
  504. public string? Device_TypeName { get; set; }
  505. /// <summary>
  506. /// 事件Id
  507. /// </summary>
  508. public string? Event_Id { get; set; }
  509. /// <summary>
  510. /// 事件代码
  511. /// </summary>
  512. public string Event_Code { get; set; }
  513. /// <summary>
  514. /// 事件名称
  515. /// </summary>
  516. public string Event_Name { get; set; }
  517. /// <summary>
  518. /// 是否确认
  519. /// </summary>
  520. public bool? Confirmed { get; set; }
  521. /// <summary>
  522. /// 是否关闭
  523. /// </summary>
  524. public bool? Closed { get; set; }
  525. /// <summary>
  526. /// 是否误报
  527. /// </summary>
  528. public bool? Mistake { get; set; }
  529. /// <summary>
  530. /// 是否通知
  531. /// </summary>
  532. public string? Notified { get; set; }
  533. /// <summary>
  534. /// 发生时间
  535. /// </summary>
  536. public DateTime? StartTime { get; set; }
  537. /// <summary>
  538. /// 确认时间
  539. /// </summary>
  540. public DateTime? ConfirmTime { get; set; }
  541. /// <summary>
  542. /// 关闭时间
  543. /// </summary>
  544. public DateTime? EndTime { get; set; }
  545. /// <summary>
  546. /// 确认者Id
  547. /// </summary>
  548. public long? ConfirmUserId { get; set; }
  549. /// <summary>
  550. /// 确认者姓名
  551. /// </summary>
  552. public string? ConfirmUserName { get; set; }
  553. /// <summary>
  554. /// 关闭者Id
  555. /// </summary>
  556. public long? CloseUserId { get; set; }
  557. /// <summary>
  558. /// 关闭者姓名
  559. /// </summary>
  560. public string? CloseUserName { get; set; }
  561. /// <summary>
  562. /// 确认内容
  563. /// </summary>
  564. public string? ConfrimContent { get; set; }
  565. /// <summary>
  566. /// 处理内容
  567. /// </summary>
  568. public string? CloseContent { get; set; }
  569. /// <summary>
  570. /// 备注
  571. /// </summary>
  572. public string? Remark { get; set; }
  573. /// <summary>
  574. /// 所属实体
  575. /// </summary>
  576. public long? EntityId { get; set; }
  577. /// <summary>
  578. /// 实体
  579. /// </summary>
  580. public string? EntityName { get; set; }
  581. /// <summary>
  582. /// 区域Id
  583. /// </summary>
  584. public long? AreaId { get; set; }
  585. /// <summary>
  586. /// 区域
  587. /// </summary>
  588. public string? AreaName { get; set; }
  589. /// <summary>
  590. /// 全景图ID
  591. /// </summary>
  592. public string? PanoramaId { get; set; }
  593. /// <summary>
  594. /// 全景图Url
  595. /// </summary>
  596. public string? PanoramaUrl { get; set; }
  597. /// <summary>
  598. /// Roi框
  599. /// </summary>
  600. public string? RoiJson { get; set; }
  601. /// <summary>
  602. /// NonRoi框
  603. /// </summary>
  604. public string? NonRoiJson { get; set; }
  605. /// <summary>
  606. /// 检测框
  607. /// </summary>
  608. public string? DetectionFrameJson { get; set; }
  609. /// <summary>
  610. /// 安装地址
  611. /// </summary>
  612. public string? Address { get; set; }
  613. /// <summary>
  614. /// 安装位置
  615. /// </summary>
  616. public string? Position { get; set; }
  617. /// <summary>
  618. /// 租户Id
  619. /// </summary>
  620. public long? TenantId { get; set; }
  621. /// <summary>
  622. /// 创建时间
  623. /// </summary>
  624. public DateTime? CreateTime { get; set; }
  625. /// <summary>
  626. /// 更新时间
  627. /// </summary>
  628. public DateTime? UpdateTime { get; set; }
  629. /// <summary>
  630. /// 创建者Id
  631. /// </summary>
  632. public long? CreateUserId { get; set; }
  633. /// <summary>
  634. /// 创建者姓名
  635. /// </summary>
  636. public string? CreateUserName { get; set; }
  637. /// <summary>
  638. /// 修改者Id
  639. /// </summary>
  640. public long? UpdateUserId { get; set; }
  641. /// <summary>
  642. /// 修改者姓名
  643. /// </summary>
  644. public string? UpdateUserName { get; set; }
  645. /// <summary>
  646. /// 软删除
  647. /// </summary>
  648. public bool IsDelete { get; set; }
  649. }
  650. /// <summary>
  651. /// 分页泛型集合
  652. /// </summary>
  653. /// <typeparam name="TEntity"></typeparam>
  654. public class AISqlSugarPagedList<TEntity>
  655. {
  656. /// <summary>
  657. /// 页码
  658. /// </summary>
  659. public int Page { get; set; }
  660. /// <summary>
  661. /// 页容量
  662. /// </summary>
  663. public int PageSize { get; set; }
  664. /// <summary>
  665. /// 总条数
  666. /// </summary>
  667. public int Total { get; set; }
  668. /// <summary>
  669. /// 总页数
  670. /// </summary>
  671. public int TotalPages { get; set; }
  672. /// <summary>
  673. /// 当前页集合
  674. /// </summary>
  675. public IEnumerable<TEntity> Items { get; set; }
  676. /// <summary>
  677. /// 是否有上一页
  678. /// </summary>
  679. public bool HasPrevPage { get; set; }
  680. /// <summary>
  681. /// 是否有下一页
  682. /// </summary>
  683. public bool HasNextPage { get; set; }
  684. }
  685. public class AlmImage
  686. {
  687. /// <summary>
  688. /// 全景图ID
  689. /// </summary>
  690. public string? PanoramaId { get; set; }
  691. /// <summary>
  692. /// 全景图Url
  693. /// </summary>
  694. public string? PanoramaUrl { get; set; }
  695. /// <summary>
  696. /// Roi框
  697. /// </summary>
  698. public string? RoiJson { get; set; }
  699. /// <summary>
  700. /// NonRoi框
  701. /// </summary>
  702. public string? NonRoiJson { get; set; }
  703. /// <summary>
  704. /// 检测框
  705. /// </summary>
  706. public string? DetectionFrameJson { get; set; }
  707. }
  708. public static class AIConst
  709. {
  710. /// <summary>
  711. /// 用户名-cszg
  712. /// </summary>
  713. public const string userName1 = "cszg";
  714. /// <summary>
  715. /// 密码-cszg
  716. /// </summary>
  717. public const string userPwd1 = "04aac704c9490f242acf2d9b6e211da5bfae117737a627eacbc0d064414b13ad454833d6d4d38bc3fddd5108319960e38923e94b3f574616f43e8aaff09817e3d25b551b1e5e26c3a402ba1e42e4b58efdbc83357b62ac4f4369b2ce84ca5481541b5b2c683d52d32b6b";
  718. /// <summary>
  719. /// 用户名-yszh
  720. /// </summary>
  721. public const string userName2 = "yszh";
  722. /// <summary>
  723. /// 密码-yszh
  724. /// </summary>
  725. public const string userPwd2 = "cf8d0e72832c74b3e566aa83f677c4a35c28fdc3b091cce608949806339a44fb5f523729c1d22fc824e2ea411ab8cae7e373762ccba8641dd2050f04f27d1373c8326f6877668bec57e1c8deace9b2ac1398a5cb5b9eee04c996d8c774ad9c55946708db089e6416cf";
  726. /// <summary>
  727. /// 用户名-ropin
  728. /// </summary>
  729. public const string userName = "ropin";
  730. /// <summary>
  731. /// 密码-ropin
  732. /// </summary>
  733. public const string userPwd = "cfa965675d4efbbb0d4a8d5fadf08bad0f780759ab55a414564b87652a015ba44cd8a9ab79dbde503995f7fbffa6a3b1f6322e3d94a4309bed578d8c262e4a3702a4574d20d00d6d54194c7c09b7f4d54cd9d347640de197b1a8f35663c89019b6054415ec7bbb33ef458ecb";
  734. public const long AIEntityId = 40124884581189;
  735. public const string ApiUrl = "https://ropiniot.com/prod-api/api";
  736. public const string AIImageUrl = "https://www.ropintech.cn/ai_service";
  737. public const string ApiUrl1 = "http://localhost:5005/api";
  738. public const string loginUrl = "/sysAuth/loginNoCode";
  739. public const string HistoricAlmrecord = "/AlmRecord/HistoryPage";
  740. public const string AlmDispose = "/AlmRecord/NotPage";
  741. public const string AlmDeleteDispose = "/AlmRecord/Delete";
  742. public const string AlmUpdateDispose = "/AlmRecord/AlmRecordUpdate";
  743. }
  744. }