using SqlSugar;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Linq;
using Newtonsoft.Json;
using Rhea.Common.Authorization;
using Newtonsoft.Json.Linq;
using Tiger.Model.Minsun;
using System.Globalization;
using System.Data;
using System.Text.RegularExpressions;
using System.Text;
using System.DirectoryServices.ActiveDirectory;
using Dm;
using Tiger.Model.DigitalTwin;
using System.IO;
using System.Net;
using Rhea.Common;
using static Tiger.Model.Minsun.IqcManagementSides;
namespace Tiger.Business.WMS
{
public static partial class Shelf
{
public static long UserId { get; set; }
public static string _shelfApiUrl { get; set; } = GetSysCodeText("ShelfSetting", "ShelfApiUrl");
private static string _shelfLightColor { get; set; } = GetSysCodeText("ShelfSetting", "ShelfLightColor");
///
/// 上架
///
///
///
public static async Task> UpShelf(ShelfOperateInput operateInput)
{
Result result = new(Result.Flags.Success, $"成功上架");
string uniqueID = Guid.NewGuid().ToString();
// 1. 发送上架指令
// 准备 POST 请求 body 参数
var data1 = new
{
shelfNo = operateInput.ShelfNo,
operateType = 1,
pdaid = string.IsNullOrEmpty(operateInput.PdaId) ? UserId.ToString() : operateInput.PdaId,
keepSeconds = 30,
uniqueNumber = uniqueID
};
string apiUrl1 = _shelfApiUrl + "/OperateConfig";
var jsonString1 = JsonConvert.SerializeObject(data1);
Result result1 = await PostShelfApi(apiUrl1, jsonString1);
if (result1.Flag != Result.Flags.Success)
{
result.Flag = Result.Flags.Failed;
result.Message = result1.Message;
return result;
}
JObject resp1 = result1.Data;
ShelfApiResult apiResult = new ShelfApiResult();
apiResult.IsSuccess = resp1["OperateConfigResult"]["IsSuccess"].ToString();
apiResult.ItemCode = resp1["OperateConfigResult"]["ItemCode"].ToString();
apiResult.ResultValue = resp1["OperateConfigResult"]["ResultValue"].ToString();
apiResult.Type = resp1["OperateConfigResult"]["Type"].ToString();
//定义返回参数
ShelfOperateOutput shelfOperateOutput = new ShelfOperateOutput();
// 如果上架操作指令成功
if (apiResult.IsSuccess.ToUpper() == "TRUE")
{
// 2. 发送 GetOperateChuteChangeInfo 指令,获取上架位置(ledAddr)及 uniqueNumber
// 准备 POST 请求 body 参数
var data2 = new
{
shelfNo = operateInput.ShelfNo,
operateType = operateInput.OperateType
};
string apiUrl2 = _shelfApiUrl + "/GetOperateChuteChangeInfo";
var jsonString2 = JsonConvert.SerializeObject(data2);
shelfOperateOutput.IsSuccess = "FALSE";
DateTime timeStart = DateTime.Now;
TimeSpan timeSpan = DateTime.Now - timeStart;
while (shelfOperateOutput.IsSuccess.ToUpper() != "TRUE" && timeSpan.TotalSeconds < 30)
{
DateTime timeEnd = DateTime.Now;
timeSpan = DateTime.Now - timeStart;
Result result2 = await PostShelfApi(apiUrl2, jsonString2);
if (result2.Flag == Result.Flags.Success)
{
JObject resp2 = result2.Data;
shelfOperateOutput.IsSuccess = resp2["GetOperateChuteChangeInfoResult"]["IsSuccess"].ToString();
string resultValue = resp2["GetOperateChuteChangeInfoResult"]["ResultValue"].ToString();
if (shelfOperateOutput.IsSuccess.ToUpper() == "TRUE" && !String.IsNullOrEmpty(resultValue))
{
JObject jo = JObject.Parse(resultValue);
shelfOperateOutput.ShelfNo = jo["shelfNo"].ToString();
shelfOperateOutput.OperateType = jo["operateType"].ToString();
shelfOperateOutput.LedAddr = jo["ledAddr"].ToString();
shelfOperateOutput.PdaId = jo["pdaid"].ToString();
shelfOperateOutput.UniqueNumber = jo["uniqueNumber"].ToString();
if (uniqueID != shelfOperateOutput.UniqueNumber)
{
shelfOperateOutput.IsSuccess = "False";
shelfOperateOutput.Message = "UniqueNumber 不同";
};
if (operateInput.ShelfNo != shelfOperateOutput.ShelfNo)
{
shelfOperateOutput.IsSuccess = "False";
shelfOperateOutput.Message = "ShelfNo 不同";
};
}
}
}
// 3. 结束上架
var data3 = new
{
shelfNo = data1.shelfNo,
operateType = 7,
pdaid = data1.pdaid,
keepSeconds = 30,
uniqueNumber = data1.uniqueNumber,
};
string apiUrl3 = _shelfApiUrl + "/OperateConfig";
var jsonString3 = JsonConvert.SerializeObject(data3);
Result result3 = await PostShelfApi(apiUrl3, jsonString3);
if (result3.Flag != Result.Flags.Success)
{
result.Flag = Result.Flags.Failed;
result.Message = result3.Message;
return result;
}
JObject resp3 = result3.Data;
if (timeSpan.TotalSeconds >= 30)
{
result.Flag = Result.Flags.Failed;
result.Message = $"上架操作超时";
return result;
}
}
// 更新库位代码,LocationCode
WMS_LOCATION locOut = await Biz.Db.Queryable().Where(t => t.RACKCODE == shelfOperateOutput.ShelfNo
&& t.LedAddr.ToString() == shelfOperateOutput.LedAddr).FirstAsync();
if (locOut != null)
shelfOperateOutput.LocationCode = locOut.LOCATIONCODE;
result.Data = shelfOperateOutput;
return result;
}
// 读取数据字典,根据CodeType,CodeValue获取参数Text
private static string GetSysCodeText(string codeType, string codeValue)
{
var code = Biz.Db.Queryable().Where(x => x.CodeType.ToUpper() == codeType && x.Value.ToUpper() == codeValue).First();
return code?.Text;
}
// Http Post ShelfApi
private static async Task> PostShelfApi(string apiUrl, string strJson)
{
Result result = new(Result.Flags.Success, $"货架API返回成功");
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(apiUrl);
httpWebRequest.ContentType = "application/json;charset=utf-8";
httpWebRequest.Method = "POST";
httpWebRequest.Timeout = 10000;
byte[] btBodys = Encoding.UTF8.GetBytes(strJson);
httpWebRequest.ContentLength = btBodys.Length;
//Logger.Default.Info(string.Format("智能货架:开始请求{0},参数{1}", apiUrl, strJson));
try
{
httpWebRequest.GetRequestStream().Write(btBodys, 0, btBodys.Length);
}
catch (Exception ex)
{
Logger.Default.Info(string.Format("智能货架:请求异常;返回信息:{0}", JsonConvert.SerializeObject(ex)));
result.Flag = Result.Flags.Failed;
result.Message = $"智能货架:请求异常;返回信息:{JsonConvert.SerializeObject(ex)}";
return result;
}
HttpWebResponse httpResponse;
string respnsetContent;
try
{
httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
if (httpResponse.StatusCode != HttpStatusCode.OK)
{
result.Flag = Result.Flags.Failed;
result.Message = $"智能货架API通讯异常,请检查货架是否正常";
return result;
}
StreamReader streamReader = new StreamReader(httpResponse.GetResponseStream());
respnsetContent = streamReader.ReadToEnd();
httpResponse.Close();
streamReader.Close();
httpWebRequest.Abort();
//Logger.Default.Info(string.Format("智能货架:请求成功;返回信息:{0}", respnsetContent));
}
catch (Exception ex)
{
Logger.Default.Info(string.Format("智能货架:请求异常;返回信息:{0}", JsonConvert.SerializeObject(ex)));
//不捕获指令发出后的异常
result.Flag = Result.Flags.Failed;
result.Message = $"智能货架:请求异常;返回信息:{JsonConvert.SerializeObject(ex)}";
return result;
}
JObject jo = JObject.Parse(respnsetContent);
result.Data = jo;
return result;
}
#region 货架亮灯
///
/// 全部亮灯
///
///
///
public static async Task> LightAll(ShelfLightParam lightParam)
{
Result result = new(Result.Flags.Success, $"全部亮灯成功");
// 准备 POST 请求 body 参数
var data = new
{
shelfNo = lightParam.ShelfNo,
color = lightParam.LightColor,
isCover = lightParam.IsCover,
shelfType = "sensor_shelf"
};
string apiUrl = _shelfApiUrl + "/LightAll";
var jsonString = JsonConvert.SerializeObject(data);
Result result1 = await PostShelfApi(apiUrl, jsonString);
if (result1.Flag != Result.Flags.Success)
{
result.Flag = Result.Flags.Failed;
result.Message = result1.Message;
return result;
}
result.Data = new ShelfApiResult
{
LightType = "Light All",
IsSuccess = result1.Data["LightAllResult"]["IsSuccess"].ToString(),
ItemCode = result1.Data["LightAllResult"]["ItemCode"].ToString(),
ResultValue = result1.Data["LightAllResult"]["ResultValue"].ToString(),
Type = result1.Data["LightAllResult"]["Type"].ToString(),
};
return result;
}
///
/// 全部灭灯
///
///
///
public static async Task> DownAll(ShelfLightParam lightParam)
{
Result result = new(Result.Flags.Success, $"全部灭灯成功");
// 准备 POST 请求 body 参数
var data = new
{
shelfNo = lightParam.ShelfNo,
shelfType = "sensor_shelf"
};
string apiUrl = _shelfApiUrl + "/DownAll";
var jsonString = JsonConvert.SerializeObject(data);
Result result1 = await PostShelfApi(apiUrl, jsonString);
if (result1.Flag != Result.Flags.Success)
{
result.Flag = Result.Flags.Failed;
result.Message = result1.Message;
return result;
}
result.Data = new ShelfApiResult
{
LightType = "Down All",
IsSuccess = result1.Data["DownAllResult"]["IsSuccess"].ToString(),
ItemCode = result1.Data["DownAllResult"]["ItemCode"].ToString(),
ResultValue = result1.Data["DownAllResult"]["ResultValue"].ToString(),
Type = result1.Data["DownAllResult"]["Type"].ToString(),
};
return result;
}
///
/// 单灯亮
///
///
///
public static async Task> LightSingle(ShelfLightParam lightParam)
{
Result result = new(Result.Flags.Success, $"单灯亮成功");
//如果参数传入LocationCode
var nLocation = await Biz.Db.Queryable().Where(t => t.LOCATIONCODE == lightParam.LocationCode).FirstAsync();
// 准备 POST 请求 body 参数
var data = new
{
shelfNo = lightParam.ShelfNo,
ledAddr = (nLocation == null) ? lightParam.LedAddr : nLocation.LedAddr.ToString(),
color = lightParam.LightColor.IsNullOrEmpty() ? _shelfLightColor : lightParam.LightColor,
isCover = lightParam.IsCover.IsNullOrEmpty() ? "1" : lightParam.IsCover,
shelfType = "sensor_shelf"
};
string apiUrl = _shelfApiUrl + "/LightSingle";
var jsonString = JsonConvert.SerializeObject(data);
Result result1 = await PostShelfApi(apiUrl, jsonString);
if (result1.Flag != Result.Flags.Success)
{
result.Flag = Result.Flags.Failed;
result.Message = result1.Message;
return result;
}
result.Data = new ShelfApiResult
{
LightType = "Light Single",
IsSuccess = result1.Data["LightSingleResult"]["IsSuccess"].ToString(),
ItemCode = result1.Data["LightSingleResult"]["ItemCode"].ToString(),
ResultValue = result1.Data["LightSingleResult"]["ResultValue"].ToString(),
Type = result1.Data["LightSingleResult"]["Type"].ToString(),
};
return result;
}
///
/// 单灯灭
///
///
///
public static async Task> DownSingle(ShelfLightParam lightParam)
{
Result result = new(Result.Flags.Success, $"单灯灭成功");
// 准备 POST 请求 body 参数
var data = new
{
shelfNo = lightParam.ShelfNo,
ledAddr = lightParam.LedAddr,
shelfType = "sensor_shelf"
};
string apiUrl = _shelfApiUrl + "/DownSingle";
var jsonString = JsonConvert.SerializeObject(data);
Result result1 = await PostShelfApi(apiUrl, jsonString);
if (result1.Flag != Result.Flags.Success)
{
result.Flag = Result.Flags.Failed;
result.Message = result1.Message;
return result;
}
result.Data = new ShelfApiResult()
{
LightType = "Down Single",
IsSuccess = result1.Data["DownSingleResult"]["IsSuccess"].ToString(),
ItemCode = result1.Data["DownSingleResult"]["ItemCode"].ToString(),
ResultValue = result1.Data["DownSingleResult"]["ResultValue"].ToString(),
Type = result1.Data["DownSingleResult"]["Type"].ToString(),
};
return result;
}
///
/// 多灯亮
///
///
///
public static async Task> LightMulti(ShelfLightParam lightParam)
{
Result result = new(Result.Flags.Success, $"多灯亮成功");
// 库位列表 LedAddrList
List