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();
}
}