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
|
{
|
/// <summary>
|
/// 智能料架数据接口
|
/// </summary>
|
public class Api
|
{
|
private static int WaitingTime = Cache.SysParam["Shelf_OperationWaitingTime"].PARAM_VALUE.ToInt32(30);
|
private static async Task<ShelfApiResult> 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<ShelfApiResult>(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}" };
|
}
|
}
|
|
/// <summary>
|
/// 获取料槽信息
|
/// </summary>
|
public class GetChuteInfo
|
{
|
public const string Method = "Post";
|
public string Url => $"/GetChuteInfo";
|
public async Task<ShelfApiResult> Execute(GetChuteInfoEntity entity, string url) => await RunAsync(url + Url, entity);
|
public async Task<ShelfApiResult> Execute(List<WMS_LOCATION> list)
|
{
|
var entity = new GetChuteInfoEntity() { waitSeconds = 10 };
|
list = list.Where(q => !q.IsNullOrEmpty() && !q.SHELF_ID.IsNullOrEmpty()).ToList();
|
var shelfs = Biz.Db.Queryable<WMS_SHELF>().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<ShelfApiResult> Execute(WMS_SHELF shelf)
|
{
|
var id = shelf?.ID;
|
var list = Biz.Db.Queryable<WMS_LOCATION>().Where(q => q.SHELF_ID == id).ToList();
|
return await Execute(list);
|
}
|
public async Task<ShelfApiResult> Execute(WMS_LOCATION location) =>await Execute(new List<WMS_LOCATION> { location });
|
}
|
|
/// <summary>
|
/// 所有灯全亮
|
/// </summary>
|
public class LightAll
|
{
|
public const string Method = "Post";
|
public string Url => $"/LightAll";
|
public async Task<ShelfApiResult> Execute(LightAllEntity entity, string url) => await RunAsync(url + Url, entity);
|
public async Task<ShelfApiResult> Execute(string shelfCode, LedColor color)
|
{
|
var urls = Biz.Db.Queryable<WMS_SHELF>().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<ShelfApiResult> 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<ShelfApiResult> Execute(WMS_LOCATION location, LedColor color)
|
{
|
var id = location?.SHELF_ID;
|
var shelf = Biz.Db.Queryable<WMS_SHELF>().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);
|
}
|
}
|
|
/// <summary>
|
/// 所有灯全灭
|
/// </summary>
|
public class DownAll
|
{
|
public const string Method = "Post";
|
public string Url => $"/DownAll";
|
public async Task<ShelfApiResult> Execute(DownAllEntity entity, string url) => await RunAsync(url + Url, entity);
|
public async Task<ShelfApiResult> Execute(string shelfCode)
|
{
|
var urls = Biz.Db.Queryable<WMS_SHELF>().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<ShelfApiResult> 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<ShelfApiResult> Execute(WMS_LOCATION location)
|
{
|
var id = location?.SHELF_ID;
|
var shelf = Biz.Db.Queryable<WMS_SHELF>().Where(q => q.ID == id).First();
|
var entity = new DownAllEntity() { shelfNo = shelf?.SHELF_CODE, shelfType = "sensor_shelf" };
|
return await Execute(entity, shelf?.WEBHOOK_URL);
|
}
|
}
|
|
/// <summary>
|
/// 多灯亮
|
/// </summary>
|
public class LightMulti
|
{
|
public const string Method = "Post";
|
public string Url => $"/LightMulti";
|
public async Task<ShelfApiResult> 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<ShelfApiResult> Execute(string pdaId, LedColor color, string shelfCode, List<int> ledidList)
|
{
|
var urls = Biz.Db.Queryable<WMS_SHELF>().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<ShelfApiResult> Execute(string pdaId, LedColor color, List<WMS_LOCATION> 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<WMS_SHELF>().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<ShelfApiResult> Execute(string pdaId, LedColor color, WMS_SHELF shelf)
|
{
|
var id = shelf?.ID;
|
var list = Biz.Db.Queryable<WMS_LOCATION>().Where(q => q.SHELF_ID == id).ToList();
|
return await Execute(pdaId, color, list);
|
}
|
public async Task<ShelfApiResult> Execute(string pdaId, LedColor color, WMS_LOCATION location) => await Execute(pdaId, color, new List<WMS_LOCATION> { location });
|
}
|
|
/// <summary>
|
/// 多灯灭
|
/// </summary>
|
public class DownMulti
|
{
|
public const string Method = "Post";
|
public string Url => $"/DownMulti";
|
public async Task<ShelfApiResult> 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<ShelfApiResult> Execute(string pdaId, List<WMS_LOCATION> 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<WMS_SHELF>().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<ShelfApiResult> Execute(string pdaId,string shelfCode, List<int> list)
|
{
|
var urls = Biz.Db.Queryable<WMS_SHELF>().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<ShelfApiResult> Execute(string pdaId, WMS_SHELF shelf)
|
{
|
var id = shelf?.ID;
|
var list = Biz.Db.Queryable<WMS_LOCATION>().Where(q => q.SHELF_ID == id).ToList();
|
return await Execute(pdaId, list);
|
}
|
public async Task<ShelfApiResult> Execute(string pdaId, WMS_LOCATION location) => await Execute(pdaId, new List<WMS_LOCATION> { location });
|
}
|
|
/// <summary>
|
/// 单灯亮
|
/// </summary>
|
public class LightSingle
|
{
|
public const string Method = "Post";
|
public string Url => $"/LightSingle";
|
public async Task<ShelfApiResult> Execute(LightSingleEntity entity, string url) => await RunAsync(url + Url, entity);
|
public async Task<ShelfApiResult> Execute(string pdaId, LedColor color, WMS_LOCATION location)
|
{
|
var id = location?.SHELF_ID;
|
var shelf = Biz.Db.Queryable<WMS_SHELF>().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);
|
}
|
}
|
|
/// <summary>
|
/// 单灯灭
|
/// </summary>
|
public class DownSingle
|
{
|
public const string Method = "Post";
|
public string Url => $"/DownSingle";
|
public async Task<ShelfApiResult> Execute(DownSingleEntity entity, string url) => await RunAsync(url + Url, entity);
|
public async Task<ShelfApiResult> Execute(string pdaId, WMS_LOCATION location)
|
{
|
var id = location?.SHELF_ID;
|
var shelf = Biz.Db.Queryable<WMS_SHELF>().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);
|
}
|
}
|
|
/// <summary>
|
/// 控制灯塔亮灭
|
/// </summary>
|
public class OperateTowerLight
|
{
|
public const string Method = "Post";
|
public string Url => $"/OperateTowerLight";
|
public async Task<ShelfApiResult> Execute(OperateTowerLightEntity entity, string url) => await RunAsync(url + Url, entity);
|
public async Task<ShelfApiResult> 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<ShelfApiResult> Execute(TowerColor color, WMS_LOCATION location)
|
{
|
var id = location?.SHELF_ID;
|
var shelf = Biz.Db.Queryable<WMS_SHELF>().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);
|
}
|
}
|
|
/// <summary>
|
/// 上架
|
/// </summary>
|
public class PutOn
|
{
|
public const string Method = "Post";
|
public string Url => $"/OperateConfig";
|
public string WaitUrl => $"/GetOperateChuteChangeInfo";
|
public async Task<ShelfApiResult> 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<ShelfChangeModel>();
|
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<WMS_LOCATION>().Where(q => SqlFunc.Subqueryable<WMS_SHELF>().Where(s => s.SHELF_CODE == entity.shelfNo && s.ID == q.SHELF_ID).Any() && q.LEDID == entity.ledAddr).First();
|
}
|
}
|