using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Rhea.Common; using SqlSugar; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Security.Policy; using System.Threading; using System.Threading.Tasks; using Tiger.IBusiness; using Tiger.Model; using Tiger.Model.Sharetronic.Shelf; namespace Tiger.Business.WMS.Sharetronic.Shelf { /// /// 智能料架数据接口 /// public class Api { private static int WaitingTime = Biz.SysParam["Shelf_OperationWaitingTime"].PARAM_VALUE.ToInt32(30); private static async Task RunAsync(string url, object obj = null) { try { //http://10.0.12.137:8733/SmartMaterialRackWG/WebHttpService var action = await HttpHelper.PostAsync(url, obj, null, 10000); JObject resultJson = JObject.Parse(action.Message.IsNullOrEmpty("{}")); var result = JsonConvert.DeserializeObject(resultJson.First?.First?.ToString() ?? ""); return result; } catch (System.Exception ex) { Logger.Shelf.Fatal(ex, $"Shelf Exception[{url}]\r\nJson:[{JsonConvert.SerializeObject(obj)}]\r\n"); return new ShelfApiResult { IsSuccess = false, ResultValue = $"Shelf Exception[{url}]: {ex.Message}" }; } } /// /// 获取料槽信息 /// public class GetChuteInfo { public const string Method = "Post"; public string Url => $"/GetChuteInfo"; public async Task Execute(GetChuteInfoEntity entity, string url) => await RunAsync(url + Url, entity); public async Task Execute(List list) { var entity = new GetChuteInfoEntity() { waitSeconds = 10 }; list = list.Where(q => !q.IsNullOrEmpty() && !q.SHELF_ID.IsNullOrEmpty()).ToList(); var shelfs = Biz.Db.Queryable().Where(q => list.Select(s => s.SHELF_ID).Contains(q.ID)).ToList(); var urls = shelfs.Select(q => q.WEBHOOK_URL).Distinct().ToList(); if (urls.Count == 1) { foreach (var item in list) { var shelfCode = shelfs.First(s => s.ID == item.SHELF_ID).SHELF_CODE; if (!entity.shelfLedAddressList.Any(q => q.shelfNo == shelfCode)) { entity.shelfLedAddressList.Add(new() { shelfNo = shelfCode, shelfType = "sensor_shelf" }); } var leds = entity.shelfLedAddressList.First(q => q.shelfNo == shelfCode); leds.ledAddressList.Add(new() { ledAddress = item.LEDID }); } return await Execute(entity, urls.Single()); } else { return new() { IsSuccess = false, ResultValue = $"不允许同时访问的不同服务地址的货架,{string.Join(" 和 ", urls.Select(q => $"[{q}]"))} 之间的不明确引用" }; } } public async Task Execute(WMS_SHELF shelf) { var id = shelf?.ID; var list = Biz.Db.Queryable().Where(q => q.SHELF_ID == id).ToList(); return await Execute(list); } public async Task Execute(WMS_LOCATION location) =>await Execute(new List { location }); } /// /// 所有灯全亮 /// public class LightAll { public const string Method = "Post"; public string Url => $"/LightAll"; public async Task Execute(LightAllEntity entity, string url) => await RunAsync(url + Url, entity); public async Task Execute(string shelfCode, LedColor color) { var urls = Biz.Db.Queryable().Where(q => q.SHELF_CODE == shelfCode).Select(q => q.WEBHOOK_URL).ToList(); if (urls.Count == 1) { var entity = new LightAllEntity() { shelfNo = shelfCode, color = color.GetValue(), isCover = 1, shelfType = "sensor_shelf" }; return await Execute(entity, urls.Single()); } else { return new() { IsSuccess = false, ResultValue = $"不允许同时访问的不同服务地址的货架,{string.Join(" 和 ", urls.Select(q => $"[{q}]"))} 之间的不明确引用" }; } } public async Task Execute(WMS_SHELF shelf, LedColor color) { var entity = new LightAllEntity() { shelfNo = shelf?.SHELF_CODE, color = color.GetValue(), isCover = 1, shelfType = "sensor_shelf" }; return await Execute(entity, shelf?.WEBHOOK_URL); } public async Task Execute(WMS_LOCATION location, LedColor color) { var id = location?.SHELF_ID; var shelf = Biz.Db.Queryable().Where(q => q.ID == id).First(); var entity = new LightAllEntity() { shelfNo = shelf?.SHELF_CODE, color = color.GetValue(), isCover = 1, shelfType = "sensor_shelf" }; return await Execute(entity, shelf?.WEBHOOK_URL); } } /// /// 所有灯全灭 /// public class DownAll { public const string Method = "Post"; public string Url => $"/DownAll"; public async Task Execute(DownAllEntity entity, string url) => await RunAsync(url + Url, entity); public async Task Execute(string shelfCode) { var urls = Biz.Db.Queryable().Where(q => q.SHELF_CODE == shelfCode).Select(q => q.WEBHOOK_URL).ToList(); if (urls.Count == 1) { var entity = new DownAllEntity() { shelfNo = shelfCode, shelfType = "sensor_shelf" }; return await Execute(entity, urls.Single()); } else { return new() { IsSuccess = false, ResultValue = $"不允许同时访问的不同服务地址的货架,{string.Join(" 和 ", urls.Select(q => $"[{q}]"))} 之间的不明确引用" }; } } public async Task Execute(WMS_SHELF shelf) { var entity = new DownAllEntity() { shelfNo = shelf?.SHELF_CODE, shelfType = "sensor_shelf" }; return await Execute(entity, shelf?.WEBHOOK_URL); } public async Task Execute(WMS_LOCATION location) { var id = location?.SHELF_ID; var shelf = Biz.Db.Queryable().Where(q => q.ID == id).First(); var entity = new DownAllEntity() { shelfNo = shelf?.SHELF_CODE, shelfType = "sensor_shelf" }; return await Execute(entity, shelf?.WEBHOOK_URL); } } /// /// 多灯亮 /// public class LightMulti { public const string Method = "Post"; public string Url => $"/LightMulti"; public async Task Execute(LightMultiEntity entity, string url) { entity.shelfLedAddressList = entity.shelfLedAddressList.OrderBy(q => q.shelfNo).ToList(); foreach (var shelf in entity.shelfLedAddressList) { shelf.ledAddressList = shelf.ledAddressList.OrderBy(q => q.ledAddress).ToList(); } return await RunAsync(url + Url, entity); } public async Task Execute(string pdaId, LedColor color, string shelfCode, List ledidList) { var urls = Biz.Db.Queryable().Where(q => q.SHELF_CODE == shelfCode).Select(q => q.WEBHOOK_URL).ToList(); if (urls.Count == 1) { var entity = new LightMultiEntity() { parameters = new() { pdaid = pdaId, }, color = color.GetValue(), isCover = 1, operateType = 0, }; foreach (var item in ledidList.Where(q => !q.IsNullOrEmpty()).OrderBy(q => q)) { if (!entity.shelfLedAddressList.Any(q => q.shelfNo == shelfCode)) { entity.shelfLedAddressList.Add(new() { shelfNo = shelfCode, shelfType = "sensor_shelf" }); } var leds = entity.shelfLedAddressList.First(q => q.shelfNo == shelfCode); leds.ledAddressList.Add(new() { ledAddress = item }); } return await Execute(entity, urls.Single()); } else { return new() { IsSuccess = false, ResultValue = $"不允许同时访问的不同服务地址的货架,{string.Join(" 和 ", urls.Select(q => $"[{q}]"))} 之间的不明确引用" }; } } public async Task Execute(string pdaId, LedColor color, List list) { var entity = new LightMultiEntity() { parameters = new() { pdaid = pdaId, }, color = color.GetValue(), isCover = 1, operateType = 0, }; list = list.Where(q => !q.IsNullOrEmpty() && !q.SHELF_ID.IsNullOrEmpty()).ToList(); var shelfs = Biz.Db.Queryable().Where(q => list.Select(s => s.SHELF_ID).Contains(q.ID)).ToList(); var urls = shelfs.Select(q => q.WEBHOOK_URL).Distinct().ToList(); if (urls.Count == 1) { foreach (var item in list) { var shelfCode = shelfs.First(s => s.ID == item.SHELF_ID).SHELF_CODE; if (!entity.shelfLedAddressList.Any(q => q.shelfNo == shelfCode)) { entity.shelfLedAddressList.Add(new() { shelfNo = shelfCode, shelfType = "sensor_shelf" }); } var leds = entity.shelfLedAddressList.First(q => q.shelfNo == shelfCode); leds.ledAddressList.Add(new() { ledAddress = item.LEDID }); } return await Execute(entity, urls.Single()); } else { return new() { IsSuccess = false, ResultValue = $"不允许同时访问的不同服务地址的货架,{string.Join(" 和 ", urls.Select(q => $"[{q}]"))} 之间的不明确引用" }; } } public async Task Execute(string pdaId, LedColor color, WMS_SHELF shelf) { var id = shelf?.ID; var list = Biz.Db.Queryable().Where(q => q.SHELF_ID == id).ToList(); return await Execute(pdaId, color, list); } public async Task Execute(string pdaId, LedColor color, WMS_LOCATION location) => await Execute(pdaId, color, new List { location }); } /// /// 多灯灭 /// public class DownMulti { public const string Method = "Post"; public string Url => $"/DownMulti"; public async Task Execute(DownMultiEntity entity, string url) { entity.shelfLedAddressList = entity.shelfLedAddressList.OrderBy(q => q.shelfNo).ToList(); foreach (var shelf in entity.shelfLedAddressList) { shelf.ledAddressList = shelf.ledAddressList.OrderBy(q => q.ledAddress).ToList(); } return await RunAsync(url + Url, entity); } public async Task Execute(string pdaId, List list) { var entity = new DownMultiEntity() { parameters = new() { pdaid = pdaId, }, color = 0, isCover = 1, operateType = 0, }; list = list.Where(q => !q.IsNullOrEmpty() && !q.SHELF_ID.IsNullOrEmpty()).ToList(); var shelfs = Biz.Db.Queryable().Where(q => list.Select(s => s.SHELF_ID).Contains(q.ID)).ToList(); var urls = shelfs.Select(q => q.WEBHOOK_URL).Distinct().ToList(); if (urls.Count == 1) { foreach (var item in list) { var shelfCode = shelfs.First(s => s.ID == item.SHELF_ID).SHELF_CODE; if (!entity.shelfLedAddressList.Any(q => q.shelfNo == shelfCode)) { entity.shelfLedAddressList.Add(new() { shelfNo = shelfCode, shelfType = "sensor_shelf" }); } var leds = entity.shelfLedAddressList.First(q => q.shelfNo == shelfCode); leds.ledAddressList.Add(new() { ledAddress = item.LEDID }); } return await Execute(entity, urls.Single()); } else { return new() { IsSuccess = false, ResultValue = $"不允许同时访问的不同服务地址的货架,{string.Join(" 和 ", urls.Select(q => $"[{q}]"))} 之间的不明确引用" }; } } public async Task Execute(string pdaId,string shelfCode, List list) { var urls = Biz.Db.Queryable().Where(q => q.SHELF_CODE == shelfCode).Select(q => q.WEBHOOK_URL).ToList(); if (urls.Count == 1) { var entity = new DownMultiEntity() { parameters = new() { pdaid = pdaId, }, color = 0, isCover = 1, operateType = 0, }; foreach (var item in list) { if (!entity.shelfLedAddressList.Any(q => q.shelfNo == shelfCode)) { entity.shelfLedAddressList.Add(new() { shelfNo = shelfCode, shelfType = "sensor_shelf" }); } var leds = entity.shelfLedAddressList.First(q => q.shelfNo == shelfCode); leds.ledAddressList.Add(new() { ledAddress = item }); } return await Execute(entity, urls.Single()); } else { return new() { IsSuccess = false, ResultValue = $"不允许同时访问的不同服务地址的货架,{string.Join(" 和 ", urls.Select(q => $"[{q}]"))} 之间的不明确引用" }; } } public async Task Execute(string pdaId, WMS_SHELF shelf) { var id = shelf?.ID; var list = Biz.Db.Queryable().Where(q => q.SHELF_ID == id).ToList(); return await Execute(pdaId, list); } public async Task Execute(string pdaId, WMS_LOCATION location) => await Execute(pdaId, new List { location }); } /// /// 单灯亮 /// public class LightSingle { public const string Method = "Post"; public string Url => $"/LightSingle"; public async Task Execute(LightSingleEntity entity, string url) => await RunAsync(url + Url, entity); public async Task Execute(string pdaId, LedColor color, WMS_LOCATION location) { var id = location?.SHELF_ID; var shelf = Biz.Db.Queryable().Where(q => q.ID == id).First(); var entity = new LightSingleEntity() { shelfNo = shelf?.SHELF_CODE, ledAddr = location.LEDID, color = color.GetValue(), isCover = 1, shelfType = "sensor_shelf" }; return await Execute(entity, shelf?.WEBHOOK_URL); } } /// /// 单灯灭 /// public class DownSingle { public const string Method = "Post"; public string Url => $"/DownSingle"; public async Task Execute(DownSingleEntity entity, string url) => await RunAsync(url + Url, entity); public async Task Execute(string pdaId, WMS_LOCATION location) { var id = location?.SHELF_ID; var shelf = Biz.Db.Queryable().Where(q => q.ID == id).First(); var entity = new DownSingleEntity() { shelfNo = shelf?.SHELF_CODE, ledAddr = location.LEDID, shelfType = "sensor_shelf" }; return await Execute(entity, shelf?.WEBHOOK_URL); } } /// /// 控制灯塔亮灭 /// public class OperateTowerLight { public const string Method = "Post"; public string Url => $"/OperateTowerLight"; public async Task Execute(OperateTowerLightEntity entity, string url) => await RunAsync(url + Url, entity); public async Task Execute(TowerColor color, WMS_SHELF shelf) { var entity = new OperateTowerLightEntity() { shelfNo = shelf?.SHELF_CODE, color = color.GetValue(), operEnum = TowerColor.NoColor == color ? 0 : 1, shelfType = "sensor_shelf" }; return await Execute(entity, shelf?.WEBHOOK_URL); } public async Task Execute(TowerColor color, WMS_LOCATION location) { var id = location?.SHELF_ID; var shelf = Biz.Db.Queryable().Where(q => q.ID == id).First(); var entity = new OperateTowerLightEntity() { shelfNo = shelf?.SHELF_CODE, color = color.GetValue(), operEnum = TowerColor.NoColor == color ? 0 : 1, shelfType = "sensor_shelf" }; return await Execute(entity, shelf?.WEBHOOK_URL); } } /// /// 上架 /// public class PutOn { public const string Method = "Post"; public string Url => $"/OperateConfig"; public string WaitUrl => $"/GetOperateChuteChangeInfo"; public async Task Execute(string pdaId, WMS_SHELF shelf, WMS_ITEM curItem) { //发起操作 var entity = new OperateConfigEntity { shelfNo = shelf?.SHELF_CODE, operateType = 1, pdaid = pdaId, keepSeconds = WaitingTime <= 0 ? 30 : WaitingTime, uniqueNumber = curItem.SN, }; var result = await RunAsync(shelf?.WEBHOOK_URL + Url, entity); if (result.IsSuccess) { //等待操作 var waitEntity = new OperateConfigEntity { shelfNo = shelf?.SHELF_CODE, operateType = 1, }; var begin = DateTime.Now; do { result = await RunAsync(shelf?.WEBHOOK_URL + WaitUrl, waitEntity); if (result.IsSuccess) { var data = result.GetData(); if (data.IsNullOrEmpty() || data.uniqueNumber != curItem.SN || data.shelfNo != shelf?.SHELF_CODE) { result.IsSuccess = false; } } Thread.Sleep(300); } while (!result.IsSuccess && (DateTime.Now - begin).TotalSeconds < WaitingTime); if (!result.IsSuccess) { result.ResultValue = $"Shelf[{shelf?.SHELF_CODE}] PutOn Material[{curItem.SN}] TimeOut : " + result.ResultValue; } //结束操作 var closeEntity = new OperateConfigEntity { shelfNo = shelf?.SHELF_CODE, operateType = 7, pdaid = pdaId, keepSeconds = WaitingTime <= 0 ? 30 : WaitingTime, uniqueNumber = curItem.SN, }; await RunAsync(shelf?.WEBHOOK_URL + Url, closeEntity); } return result; } } } public static class ShelfApiExtension { public static WMS_LOCATION GetLocation(this ShelfChangeModel entity) => Biz.Db.Queryable().Where(q => SqlFunc.Subqueryable().Where(s => s.SHELF_CODE == entity.shelfNo && s.ID == q.SHELF_ID).Any() && q.LEDID == entity.ledAddr).First(); } }