namespace IStation.Application
{
///
/// 调度方案
///
[Route("OpenApi/Dispatch/Solution")]
[ApiDescriptionSettings("Solution", Name = "陈行调度方案", Order = 1)]
public class DispatchSolution_Controller : IDynamicApiController
{
///
/// 计算
///
[AllowAnonymous]
[Route("Calculate@V1.0")]
[HttpPost]
public async Task Calculate([Required] StationDispatchInput input)
{
if (input == null)
return null;
string flowId = input.FlowId;
Log.Debug(flowId, JsonHelper.Object2Json(input));
var scadaInput = GetScadaDispatchInput(DateTime.Now.AddSeconds(300), DateTime.Now);
var scadaOutput = await GetRealScada(flowId, scadaInput);
if (scadaOutput == null || scadaOutput.Scadas == null)
{
Log.Info(flowId, "Scada:数据获取失败,调度终止!");
throw YOops.Oh(eResultCode.Error, InternalErrorCodes.L001, "Scada:数据获取失败,调度终止!");
}
return TempOutHelper.GetDispatchSolutionOutput(input.FlowId);
}
private async Task GetRealScada(string flowId, ScadaDispatchInput input)
{
if (input == null)
{
Log.Info(flowId, "ScadaDispatchInput is null");
return default;
}
var ws = new ClientWebSocket();
ws.Options.RemoteCertificateValidationCallback = delegate { return true; };
await ws.ConnectAsync(new Uri("ws://localhost:5102/api/WebSocket/GetNotReadCount"), CancellationToken.None);
if (ws.State != WebSocketState.Open)
{
Log.Info(flowId, "webSocket:连接失败!");
return default;
}
Log.Info(flowId, "webSocket:连接成功!");
ScadaDispatchOutput output = null;
var inputJson = JsonHelper.Object2Json(input);
Log.Debug(flowId, inputJson);
var inputBytes = Encoding.UTF8.GetBytes(inputJson);
await ws.SendAsync(inputBytes, WebSocketMessageType.Text, true, CancellationToken.None);
try
{
List outputBytes = new List();//全部消息容器
var buffer = new byte[1024 * 4];//缓冲区
var result = await ws.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); //监听Socket信息
while (!result.CloseStatus.HasValue) //是否关闭
{
if (result.MessageType == WebSocketMessageType.Text)//文本消息
{
outputBytes.AddRange(buffer.Take(result.Count));
if (result.EndOfMessage)//消息是否已接收完全
{
//发送过来的消息
string outputJson = Encoding.UTF8.GetString(outputBytes.ToArray(), 0, outputBytes.Count);
output = new ScadaDispatchOutput();
output.Scadas = JsonHelper.Json2Object>>(outputJson);
break;
}
}
result = await ws.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);//继续监听Socket信息
}
}
catch (Exception ex)
{
Log.Error(flowId, ex.Message);
}
finally
{
try
{
//关闭WebSocket
await ws.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "AcknowledgeCloseframe", CancellationToken.None);
}
catch (Exception ex)
{
Log.Error(flowId, "关闭WebSocket异常", ex);
}
ws.Abort();
ws.Dispose();
}
return output;
}
private ScadaDispatchInput GetScadaDispatchInput(DateTime startTime, DateTime endTime, double resolution = 300)
{
var tagDict = new Dictionary
{
//{ "_0402010204089903001", "长江水位" },
//{ "_0402010204089904009", "二取水前池液位" },
//{ "_0402010201030103006", "陈行水库水位" },
//{ "_0402010204012101001", "二取水1号泵状态" },
//{ "_0402010204012201001", "二取水2号泵状态" },
//{ "_0402010204012301001", "二取水3号泵状态" },
//{ "_0402010204012401001", "二取水4号泵状态" },
//{ "_0402010204012501001", "二取水5号泵状态" },
//{ "_0402010204012103002", "二取水1号泵累计流量" },
//{ "_0402010204012203002", "二取水2号泵累计流量" },
//{ "_0402010204012303002", "二取水3号泵累计流量" },
//{ "_0402010204012403002", "二取水4号泵累计流量" },
//{ "_0402010204012503002", "二取水5号泵累计流量" },
//{ "_0402010204040193046", "二取水1号泵有功电能" },
//{ "_0402010204040193047", "二取水2号泵有功电能" },
//{ "_0402010204012308007", "二取水3号泵有功电能" },
//{ "_0402010204012408007", "二取水4号泵有功电能" },
//{ "_0402010204012508007", "二取水5号泵有功电能" },
{ "_0402010201090105774", "一输水11号出口压力" },
{ "_0402010201040502031", "一输水11号有功功率" },
{ "_0402010201040502044", "一输水11号有功电度" },
{ "_0402010201011195062", "一输水11号泵转速" },
{ "_0402010201011101001", "一输水11号泵运行状态" },
{ "_0402010201011194012", "一输水11号泵频率" },
{ "_0402010201090105005", "一输水12号出口压力" },
{ "_0402010201041402031", "一输水12号有功功率" },
{ "_0402010201041402044", "一输水12号有功电度" },
{ "_0402010201011295062", "一输水12号泵转速" },
{ "_0402010201011201001", "一输水12号泵运行状态" },
{ "_0402010201011294012", "一输水12号泵频率" },
{ "_0402010201090105776", "一输水13号出口压力" },
{ "_0402010201040602031", "一输水13号有功功率" },
{ "_0402010201040602044", "一输水13号有功电度" },
{ "_0402010201011395062", "一输水13号泵转速" },
{ "_0402010201011301001", "一输水13号泵运行状态" },
{ "_0402010201011394012", "一输水13号泵频率" },
{ "_0402010201090105007", "一输水14号出口压力" },
{ "_0402010201041302031", "一输水14号有功功率" },
{ "_0402010201041302044", "一输水14号有功电度" },
{ "_0402010201011495062", "一输水14号泵转速" },
{ "_0402010201011401001", "一输水14号泵运行状态" },
{ "_0402010201011494012", "一输水14号泵频率" },
{ "_0402010201090105008", "一输水15号出口压力" },
{ "_0402010201040702031", "一输水15号有功功率" },
{ "_0402010201040702044", "一输水15号有功电度" },
{ "_0402010201011595062", "一输水15号泵转速" },
{ "_0402010201011501003", "一输水15号泵运行状态" },
{ "_0402010201090105016", "一输水16号出口压力" },
{ "_0402010201041202031", "一输水16号有功功率" },
{ "_0402010201041202044", "一输水16号有功电度" },
{ "_0402010201011695062", "一输水16号泵转速" },
{ "_0402010201011601003", "一输水16号泵运行状态" },
{ "_0402010201090105017", "一输水17号出口压力" },
{ "_0402010201040802031", "一输水17号有功功率" },
{ "_0402010201040802044", "一输水17号有功电度" },
{ "_0402010201011795062", "一输水17号泵转速" },
{ "_0402010201011795056", "一输水17号泵运行状态" },
{ "_0402010201090105018", "一输水18号出口压力" },
{ "_0402010201041102031", "一输水18号有功功率" },
{ "_0402010201041102044", "一输水18号有功电度" },
{ "_0402010201011895062", "一输水18号泵转速" },
{ "_0402010201011895056", "一输水18号泵运行状态" },
{ "_0402010201090104011", "一输水前池液位1" },
{ "_0402010201091104123", "一输水前池液位2" },
{ "_0402010201091104122", "一输水前池液位3" },
{ "_0402010201090105002", "一输水嘉定1线压力" },
{ "_0402010201030191001", "一输水嘉定1线瞬时流量" },
{ "_0402010201030191002", "一输水嘉定1线累计流量" },
{ "_0402010201090105011", "一输水嘉定2线压力" },
{ "_0402010201090199011", "一输水嘉定2线瞬时流量" },
{ "_0402010201090199012", "一输水嘉定2线累计流量" },
{ "_0402010201090105784", "一输水嘉定3线压力" },
{ "_0402010201090199311", "一输水嘉定3线瞬时流量" },
{ "_0402010201090199312", "一输水嘉定3线累计流量" },
{ "_0402010204012105001", "二取水一号机泵出口压力" },
{ "_0402010204012101001", "二取水一号机泵开停状态" },
{ "_0402010204040193004", "二取水一号机泵有功功率" },
{ "_0402010204040193046", "二取水一号机泵有功电度" },
{ "_0402010204012103001", "二取水一号机泵瞬时流量" },
{ "_0402010204012103002", "二取水一号机泵累计流量" },
{ "_0402010204012305001", "二取水三号机泵出口压力" },
{ "_0402010204012301001", "二取水三号机泵开停状态" },
{ "_0402010204012308008", "二取水三号机泵有功功率" },
{ "_0402010204012308007", "二取水三号机泵有功电度" },
{ "_0402010204012303001", "二取水三号机泵瞬时流量" },
{ "_0402010204012303002", "二取水三号机泵累计流量" },
{ "_0402010204012205001", "二取水二号机泵出口压力" },
{ "_0402010204012201001", "二取水二号机泵开停状态" },
{ "_0402010204040193005", "二取水二号机泵有功功率" },
{ "_0402010204040193047", "二取水二号机泵有功电度" },
{ "_0402010204012203001", "二取水二号机泵瞬时流量" },
{ "_0402010204012203002", "二取水二号机泵累计流量" },
{ "_0402010204012505001", "二取水五号机泵出口压力" },
{ "_0402010204012501001", "二取水五号机泵开停状态" },
{ "_0402010204012508008", "二取水五号机泵有功功率" },
{ "_0402010204012508007", "二取水五号机泵有功电度" },
{ "_0402010204012503001", "二取水五号机泵瞬时流量" },
{ "_0402010204012503002", "二取水五号机泵累计流量" },
{ "_0402010204089904009", "二取水前池液位" },
{ "_0402010204012405001", "二取水四号机泵出口压力" },
{ "_0402010204012401001", "二取水四号机泵开停状态" },
{ "_0402010204012408008", "二取水四号机泵有功功率" },
{ "_0402010204012408007", "二取水四号机泵有功电度" },
{ "_0402010204012403001", "二取水四号机泵瞬时流量" },
{ "_0402010204012403002", "二取水四号机泵累计流量" },
{ "_0402010201012105001", "二输水21号泵出口压力" },
{ "_0402010201040102049", "二输水21号泵有功功率" },
{ "_0402010201040102187", "二输水21号泵有功电度" },
{ "_0402010201090103901", "二输水21号泵瞬时流量" },
{ "_0402010201010294045", "二输水21号泵累计流量" },
{ "_0402010201012199001", "二输水21号泵转速" },
{ "_0402010201012193021", "二输水21号泵运行状态" },
{ "_0402010201040102178", "二输水21号泵频率" },
{ "_0402010201012205001", "二输水22号泵出口压力" },
{ "_0402010201040102053", "二输水22号泵有功功率" },
{ "_0402010201040102213", "二输水22号泵有功电度" },
{ "_0402010201090103001", "二输水22号泵瞬时流量" },
{ "_0402010201090103002", "二输水22号泵累计流量" },
{ "_0402010201012299001", "二输水22号泵转速" },
{ "_0402010201012201001", "二输水22号泵运行状态" },
{ "_0402010201040102204", "二输水22号泵频率" },
{ "_0402010201012305001", "二输水23号泵出口压力" },
{ "_0402010201040102055", "二输水23号泵有功功率" },
{ "_0402010201040102136", "二输水23号泵有功电度" },
{ "_0402010201040102054", "二输水23号泵电流" },
{ "_0402010201090103003", "二输水23号泵瞬时流量" },
{ "_0402010201090103004", "二输水23号泵累计流量" },
{ "_0402010201012399001", "二输水23号泵转速" },
{ "_0402010201010194135", "二输水23号泵运行状态" },
{ "_0402010201040102217", "二输水23号泵频率" },
{ "_0402010201090105003", "二输水2400管压力" },
{ "_0402010201090103017", "二输水2400管瞬时流量" },
{ "_0402010201090103018", "二输水2400管累计流量" },
{ "_0402010201012405001", "二输水24号泵出口压力" },
{ "_0402010201040102057", "二输水24号泵有功功率" },
{ "_0402010201040102149", "二输水24号泵有功电度" },
{ "_0402010201090103005", "二输水24号泵瞬时流量" },
{ "_0402010201090103006", "二输水24号泵累计流量" },
{ "_0402010201012499001", "二输水24号泵转速" },
{ "_0402010201012401001", "二输水24号泵运行状态" },
{ "_0402010201040102140", "二输水24号泵频率" },
{ "_0402010201012505001", "二输水25号泵出口压力" },
{ "_0402010201040202004", "二输水25号泵有功功率" },
{ "_0402010201040202141", "二输水25号泵有功电度" },
{ "_0402010201090103007", "二输水25号泵瞬时流量" },
{ "_0402010201090103008", "二输水25号泵累计流量" },
{ "_0402010201012599001", "二输水25号泵转速" },
{ "_0402010201012501001", "二输水25号泵运行状态" },
{ "_0402010201040202132", "二输水25号泵频率" },
{ "_0402010201012605001", "二输水26号泵出口压力" },
{ "_0402010201040202006", "二输水26号泵有功功率" },
{ "_0402010201040202028", "二输水26号泵有功电度" },
{ "_0402010201090103009", "二输水26号泵瞬时流量" },
{ "_0402010201090103010", "二输水26号泵累计流量" },
{ "_0402010201012699001", "二输水26号泵转速" },
{ "_0402010201010194152", "二输水26号泵运行状态" },
{ "_0402010201040202145", "二输水26号泵频率" },
{ "_0402010201090105004", "二输水2700管压力" },
{ "_0402010201090194002", "二输水2700管瞬时流量" },
{ "_0402010201090194444", "二输水2700管累计流量" },
{ "_0402010201012705001", "二输水27号泵出口压力" },
{ "_0402010201040202012", "二输水27号泵有功功率" },
{ "_0402010201040202193", "二输水27号泵有功电度" },
{ "_0402010201090103903", "二输水27号泵瞬时流量" },
{ "_0402010201090194001", "二输水27号泵累计流量" },
{ "_0402010201012799001", "二输水27号泵转速" },
{ "_0402010201012793021", "二输水27号泵运行状态" },
{ "_0402010201040202184", "二输水27号泵频率" },
{ "_0402010204089903001", "陈行取水口长江液位" },
{ "_0402010201030103006", "陈行水库液位" },
};
var input = new ScadaDispatchInput();
input.search = "history";
input.starttime = startTime.ToString("G");
input.endtime = endTime.ToString("G");
input.Resolution = resolution.ToString();
input.taglist = tagDict.Select(x => x.Key).ToArray();
return input;
}
//private async Task GetRealScada(string flowId, ScadaDispatchInput input)
//{
// if (input == null)
// {
// Log.Info(flowId, "ScadaDispatchInput is null");
// return default;
// }
// var ws = await CreateAsync("ws://localhost:5102/api/WebSocket/GetNotReadCount");
// if (ws == null || ws.State != WebSocketState.Open)
// {
// Log.Info(flowId, "webSocket:连接失败!");
// return default;
// }
// Log.Info(flowId, "webSocket:连接成功!");
// ScadaDispatchOutput output = null;
// var inputJson = JsonHelper.Object2FormatJson(input);
// Log.Debug(flowId, inputJson);
// var inputBytes = Encoding.UTF8.GetBytes(inputJson);
// await ws.SendAsync(inputBytes, WebSocketMessageType.Text, true, CancellationToken.None);
// try
// {
// var buffer = new ArraySegment(new byte[1024 * 4]);
// WebSocketReceiveResult result = null;
// using (var ms = new MemoryStream())
// {
// do
// {
// result = await ws.ReceiveAsync(buffer, CancellationToken.None);
// ms.Write(buffer.Array, buffer.Offset, result.Count);
// }
// while (!result.EndOfMessage);
// ms.Seek(0, SeekOrigin.Begin);
// if (result.MessageType == WebSocketMessageType.Text && !result.CloseStatus.HasValue)
// {
// using (var reader = new StreamReader(ms, Encoding.UTF8))
// {
// string outputJson = reader.ReadToEnd();
// output = new ScadaDispatchOutput();
// output.Scadas = JsonHelper.Json2Object>>(outputJson);
// }
// }
// }
// }
// catch (Exception ex)
// {
// Log.Error(flowId, ex.Message);
// }
// finally
// {
// try
// {
// //关闭WebSocket
// await ws.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "AcknowledgeCloseframe", CancellationToken.None);
// }
// catch (Exception ex)
// {
// Log.Error(flowId, "关闭WebSocket异常", ex);
// }
// ws.Abort();
// ws.Dispose();
// }
// return output;
//}
/////
///// 创建客户端实例
/////
/////
//public static async Task CreateAsync(string ServerUri)
//{
// var webSocket = new ClientWebSocket();
// webSocket.Options.RemoteCertificateValidationCallback = delegate { return true; };
// await webSocket.ConnectAsync(new Uri(ServerUri), CancellationToken.None);
// if (webSocket.State == WebSocketState.Open)
// {
// return webSocket;
// }
// return null;
//}
}
}