using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime; using System; using System.Collections.Generic; using System.Linq; using System.Reflection.Emit; using System.Text; using System.Threading.Tasks; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_Core; using WIDESEAWCS_Core.BaseRepository; using WIDESEAWCS_Core.BaseServices; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_DTO; using WIDESEAWCS_DTO.AGV.HIKROBOT; using WIDESEAWCS_IBasicInfoService; using WIDESEAWCS_Model.Models; namespace WIDESEAWCS_BasicInfoService { public class AGVCartInfoService : ServiceBase>, IAGVCartInfoService { IApiInfoService _repository; ITrackloginfoService _trackloginfoService; public AGVCartInfoService(IRepository BaseDal, IApiInfoService repository, ITrackloginfoService ITrackloginfo) : base(BaseDal) { _repository = repository; _trackloginfoService = ITrackloginfo; } public IRepository Repository => BaseDal; /// /// 查海康小车在那个楼层 /// /// /// public WebResponseContent CheckTheCar() { WebResponseContent content = new WebResponseContent(); List dataList = new List(); HIKROBOTReturn hIKROBOTReturn = null; var apiInfo = _repository.Repository.QueryFirst(it => it.ApiCode == nameof(HIKROBOTQuery)); if (apiInfo == null) { throw new Exception("未找到海康小车信息接口配置信息!请检查接口配置!"); } try { var agvInfo = Repository.QueryData(); if (agvInfo == null || !agvInfo.Any()) { content.Error("未查询到AGV小车信息"); return content; } List failedAgvCodes = new List(); List successMessages = new List(); foreach (var item in agvInfo) { var headers = new Dictionary { { "X-lr-request-id", DateTimeOffset.Now.ToUnixTimeSeconds().ToString() + item.AGVCode } }; HIKROBOTQuery hIKROBOTQuery = new HIKROBOTQuery() { singleRobotCode = item.AGVCode }; string requestData = hIKROBOTQuery.Serialize(); try { string response = HttpHelper.Post(apiInfo.ApiAddress, requestData, headers: headers); hIKROBOTReturn = response.DeserializeObject(); // 判断接口返回是否成功 if (hIKROBOTReturn != null && hIKROBOTReturn.code == "SUCCESS" && hIKROBOTReturn.message == "成功") { // 将 data 反序列化为具体的 HIKROBOTQueryData 类型 var queryData = Newtonsoft.Json.JsonConvert.DeserializeObject( Newtonsoft.Json.JsonConvert.SerializeObject(hIKROBOTReturn.data) ); dataList.Add(new HIKROBOTQueryData { singleRobotCode = item.AGVCode, mapCode = queryData?.mapCode ?? string.Empty }); successMessages.Add($"AGV小车-{item.AGVCode}所在楼层{queryData?.mapCode}查询成功"); } else { // 记录失败的小车 failedAgvCodes.Add(item.AGVCode); string errorMsg = hIKROBOTReturn?.message ?? "获取小车信息失败"; } } catch (Exception ex) { // 捕获单个小车查询的异常 failedAgvCodes.Add(item.AGVCode); string errorMsg = $"查询AGV小车{item.AGVCode}时发生异常:{ex.Message}"; _trackloginfoService.AddTrackLog( requestData, new WebResponseContent { Status = false, Message = errorMsg }, $"查看海康AGV小车信息-异常-{item.AGVCode}", "", errorMsg ); } } // 根据查询结果设置返回状态 if (dataList.Any()) { if (failedAgvCodes.Any()) { // 部分成功,部分失败 string message = $"部分小车查询成功,失败的小车:{string.Join(",", failedAgvCodes)}"; content.OK(message, dataList); // 如果需要标记为部分成功,可以在这里设置额外的标志 //content.Status = true; // 保持 true,但通过 Message 告知部分失败 } else { // 全部成功 content.OK("所有AGV小车信息查询成功", dataList); } } else { // 全部失败 string errorMsg = failedAgvCodes.Any() ? $"所有AGV小车查询失败,失败列表:{string.Join(",", failedAgvCodes)}" : "未查询到任何AGV小车信息"; content.Error(errorMsg); } return content; } catch (Exception ex) { content.Error($"批量查询AGV小车信息失败:{ex.Message}"); return content; } } } }