dengjunjie
6 天以前 ae125b51da4ac288f24ef72bcbc9cd963980fa91
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
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<Dt_AGVCartInfo, IRepository<Dt_AGVCartInfo>>, IAGVCartInfoService
    {
 
        IApiInfoService _repository;
        ITrackloginfoService _trackloginfoService;
 
        public AGVCartInfoService(IRepository<Dt_AGVCartInfo> BaseDal, IApiInfoService repository, ITrackloginfoService ITrackloginfo) : base(BaseDal)
        {
            _repository = repository;
            _trackloginfoService = ITrackloginfo;
        }
 
        public IRepository<Dt_AGVCartInfo> Repository => BaseDal;
 
 
        /// <summary>
        /// 查海康小车在那个楼层
        /// </summary>
        /// <param name="agvcode"></param>
        /// <returns></returns>
        public WebResponseContent CheckTheCar(string hkagvType)
        {
            WebResponseContent content = new WebResponseContent();
            List<HIKROBOTQueryData> dataList = new List<HIKROBOTQueryData>();
            HIKROBOTReturn hIKROBOTReturn = null;
 
            var apiInfo = _repository.Repository.QueryFirst(it => it.ApiCode == nameof(HIKROBOTQuery));
            if (apiInfo == null)
            {
                throw new Exception("未找到海康小车信息接口配置信息!请检查接口配置!");
            }
 
            try
            {
                var agvInfo = Repository.QueryData(x => x.HkagvType == hkagvType);
                if (agvInfo == null || !agvInfo.Any())
                {
                    content.Error("未查询到AGV小车信息");
                    return content;
                }
 
                List<string> failedAgvCodes = new List<string>();
                List<string> successMessages = new List<string>();
 
                foreach (var item in agvInfo)
                {
                    var headers = new Dictionary<string, string>
                    {
                        { "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<HIKROBOTReturn>();
 
                        // 判断接口返回是否成功
                        if (hIKROBOTReturn != null && hIKROBOTReturn.code == "SUCCESS" && hIKROBOTReturn.message == "成功")
                        {
                            // 将 data 反序列化为具体的 HIKROBOTQueryData 类型
                            var queryData = Newtonsoft.Json.JsonConvert.DeserializeObject<HIKROBOTQueryData>(
                                Newtonsoft.Json.JsonConvert.SerializeObject(hIKROBOTReturn.data)
                            );
 
                            dataList.Add(new HIKROBOTQueryData
                            {
                                singleRobotCode = item.AGVCode,
                                mapCode = queryData?.mapCode ?? string.Empty,
                                CarType = item.HkagvType  // 从本地数据库获取小车类型
                            });
 
                            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;
            }
        }
 
 
 
    }
}