Files
wcs/WCS.WebApi/Controllers/HomeController.cs
2025-04-08 16:48:44 +08:00

697 lines
24 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Microsoft.AspNetCore.Mvc;
using NPOI.SS.Formula.Functions;
using SqlSugar;
using WCS.BLL.DbModels;
using WCS.BLL.DbModels.Task;
using WCS.BLL.HardWare;
using WCS.BLL.Manager;
using WCS.BLL.Services.IService;
using WCS.BLL.Services.Service;
using WCS.DAL.Db;
using WCS.DAL.DbModels;
using WCS.Model;
using WCS.Model.ApiModel.Home;
namespace WCS.WebApi.Controllers
{
/// <summary>
/// 主页面的接口
/// </summary>
[ApiController]
[Route("[controller]")]
public class HomeController : ControllerBase
{
public IHomerService _homerService { get; set; }
public ISelfCheckService _selfCheckService { get; set; }
public HomeController(IHomerService homerService, ISelfCheckService selfCheckService)
{
_homerService = homerService;
_selfCheckService = selfCheckService;
}
[Route("getShelfTypes")]
[HttpPost(Name = "getShelfTypes")]
public async Task<ResponseBase> getShelfTypes(RequestBase request)
{
try
{
//直接获取当前所有货架类型并返回
var shelfTypes = DbHelp.db.Queryable<ShelfTypeInfo>()
.Select(t => new ShelfTypeModel()
{
Id = t.Id,
ShelfTypeName = t.ShelfTypeName
})
.ToList();
return new PageQueryResponse<ShelfTypeModel>()
{
Code = 200,
Message = "success",
Data = new PageQueryResponseData<ShelfTypeModel>
{
Lists = shelfTypes,
Count = shelfTypes.Count
}
};
}
catch (Exception ex)
{
return new PageQueryResponse<ShelfTypeModel>()
{
Code = 300,
Message = $"查询失败:{ex.Message}",
};
}
}
[Route("getShelfStatus")]
[HttpPost(Name = "getShelfStatus")]
public async Task<ResponseBase> getShelfStatus(GetShelfStatusRequest request)
{
try
{
var shelfs = ShelfManager.Shelves
.WhereIF(request.GroupNames?.Count > 0, t => request.GroupNames!.Contains(t.GroupName))
.ToList();
//直接返回当前内存中缓存的货架和状态
return new GetShelfStatusResponse()
{
Code = 200,
Message = "success",
Data = shelfs.Select(t => new ShelfModel
{
ShelfId = t.ShelfId,
ShelfCode = t.ShelfCode,
CurrentCom = t.CurrentCom,
SetCurrentModeTime = t.SetCurrentModeTime,
CurentMode = (int)t.CurrentMode,
ModulesStr = t.ModulesStr,
GroupName = t.GroupName,
OrderNumber = t.OrderNumber,
}).ToList(),
};
}
catch (Exception ex)
{
return new ResponseBase()
{
Code = 300,
Message = "获取失败:" + ex.Message,
};
}
}
[Route("getShelfStatusDetails")]
[HttpPost(Name = "getShelfStatusDetails")]
public async Task<ResponseBase> getShelfStatusDetails(GetShelfStatusRequest request)
{
try
{
var shelfs = ShelfManager.Shelves
.WhereIF(request.GroupNames?.Count > 0, t => request.GroupNames!.Contains(t.GroupName))
.ToList();
//直接返回当前内存中缓存的货架和状态
return new ResponseBase<object>()
{
Code = 200,
Message = "success",
Data = shelfs,
};
}
catch (Exception ex)
{
return new ResponseBase()
{
Code = 300,
Message = "获取失败:" + ex.Message,
};
}
}
[Route("getTCPClientsDetails")]
[HttpPost(Name = "getTCPClientsDetails")]
public async Task<ResponseBase> getTCPClientsDetails(GetShelfStatusRequest request)
{
try
{
var tcpClients = TCPClientManager.TCPClients.Select(t => new
{
RemoteIPHost = t.RemoteIPHost,
IsReceivedClientOnline = t.IsReceivedClientOnline,
IsSendClientOnline = t.IsSendClientOnline,
IsFirstConnected = t.IsFirstConnected,
tcpClientIsNull = t.tcpSendClient == null,
tcpClientIsOnLine = t.tcpSendClient?.Online,
}).ToList();
//直接返回当前内存中缓存的货架和状态
return new ResponseBase<object>()
{
Code = 200,
Message = $"success连接数量{tcpClients.Count}",
Data = tcpClients,
};
}
catch (Exception ex)
{
return new ResponseBase()
{
Code = 300,
Message = "获取失败:" + ex.Message,
};
}
}
[Route("shelfCheckAll")]
[HttpPost(Name = "shelfCheckAll")]
public async Task<ResponseBase> shelfCheckAll(GetShelfStatusRequest request)
{
try
{
return await _selfCheckService.StartSelfCheckByGroupName(request.GroupNames);
}
catch (Exception ex)
{
return new ResponseBase()
{
Code = 300,
Message = "操作失败:" + ex.Message,
};
}
}
/// <summary>
/// 重置货架的状态 使其回到待机模式
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[Route("resetShelfStatus")]
[HttpPost(Name = "resetShelfStatus")]
public async Task<ResponseBase> resetShelfStatus(ResetShelfStatusRequest request)
{
try
{
if (request.IsResetAll == false && (request.SelfIds == null || request.SelfIds.Count == 0))
{
return new ResponseBase()
{
Code = 201,
Message = "复位失败:请选择需要复位的货架!",
};
}
if (request.IsResetAll == true && (request.GroupNames == null || request.GroupNames.Count == 0))
{
return new ResponseBase()
{
Code = 201,
Message = "复位失败:请选择需要复位的货架区域!",
};
}
var shelfs = new List<IShelfBase>();
if (request.IsResetAll == false)
shelfs = ShelfManager.Shelves
.Where(t => request.SelfIds.Contains(t.ShelfId))
.Where(t => t.CurrentMode != TaskModeEnum.)
.ToList();
else
shelfs = ShelfManager.Shelves
.Where(t => request.GroupNames.Contains(t.GroupName))
.Where(t => t.CurrentMode != TaskModeEnum.)
.ToList();
foreach (var shelf in shelfs)
{
shelf.Reset();
}
return new ResponseBase()
{
Code = 200,
Message = "success",
};
}
catch (Exception ex)
{
return new ResponseBase()
{
Code = 300,
Message = ex.Message,
};
}
}
/// <summary>
/// 获取货架对应的服务端的Ip和端口号
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[Route("getShelfServer")]
[HttpPost(Name = "getShelfServer")]
public async Task<ResponseBase> getShelfServer(RequestBase request)
{
try
{
return await _homerService.GetShelfServer(request);
}
catch (Exception ex)
{
return new ResponseBase<object>()
{
Code = 300,
Message = "查询失败" + ex.Message,
Data = null
};
}
}
[Route("getWebSocketWarnings")]
[HttpPost(Name = "getWebSocketWarnings")]
public async Task<ResponseBase> getWebSocketWarnings(RequestBase request)
{
try
{
return new ResponseBase<object>()
{
Code = 200,
Message = "success",
Data = WarningManager.Warnings
};
}
catch (Exception ex)
{
return new ResponseBase<object>()
{
Code = 300,
Message = "查询失败" + ex.Message,
Data = null
};
}
}
/// <summary>
/// 生成模组信息
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[Route("generateModuleInfo")]
[HttpPost(Name = "generateModuleInfo")]
public async Task<ResponseBase> generateModuleInfo(RequestBase request)
{
try
{
//获取液晶的货架
var shelfInfos = DbHelp.db.Queryable<ShelfInfo>()
.Where(t => t.ShelfTypeName.Contains("液晶"))
.ToList();
var moduleInfos = new List<ModuleInfo>();
int boardId = 1;
var lastClientCode = string.Empty;
foreach (var shelfInfo in shelfInfos)
{
if (lastClientCode != shelfInfo.ClientIp)
{
lastClientCode = shelfInfo.ClientIp;
boardId = 1;
}
int shelfNumber = 1;
int floorNumber = 1;
int moduleNumber = 0;
while (floorNumber <= 4)
{
moduleNumber++;
if (moduleNumber > 7)
{
shelfNumber++;
moduleNumber = 1;
}
if (shelfNumber > 4)
{
floorNumber++;
shelfNumber = 1;
}
if (floorNumber == 5)
{
continue;
}
var moduleCode = $"{shelfInfo.ShelfCode}-{shelfNumber}-L{floorNumber}-{moduleNumber}";
var module = new ModuleInfo()
{
ModuleCode = moduleCode,
ShelfTypeId = 3,
ShelfId = shelfInfo.Id,
ShelfCode = shelfInfo.ShelfCode,
BoardId = boardId++,
LightCount = 1,
CleintIp = shelfInfo.ClientIp,
GroupName = shelfInfo.GroupName,
R = floorNumber.ToString(),
C = moduleNumber.ToString(),
IsEnable = true,
};
moduleInfos.Add(module);
}
;
}
DbHelp.db.Insertable(moduleInfos).ExecuteCommand();
return new ResponseBase<object>()
{
Code = 200,
Message = "生成成功!",
Data = null
};
}
catch (Exception ex)
{
return new ResponseBase<object>()
{
Code = 300,
Message = "生成失败" + ex.Message,
Data = null
};
}
}
/// <summary>
/// 进入调试模式
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[Route("goInDebugMode")]
[HttpPost(Name = "goInDebugMode")]
public async Task<ResponseBase> goInDebugMode(SetBoardIdRequest request)
{
try
{
//获取TCP
var client = TCPClientManager.TCPClients
.Where(t => t.RemoteIPHost == request.IPPort)
.First();
if (client == null)
{
return new ResponseBase<object>()
{
Code = 300,
Message = "未获取到对应连接,请检查地址",
Data = null
};
}
//进入调试模式
byte[] data = { 0x08, 0x00, 0x00, 0x07, 0xFF, 0xDB, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
client.Send(data);
return new ResponseBase<object>()
{
Code = 200,
Message = "指令发送成功",
Data = null
};
}
catch (Exception ex)
{
return new ResponseBase<object>()
{
Code = 300,
Message = "指令发送失败" + ex.Message,
Data = null
};
}
}
[Route("goOutDebugMode")]
[HttpPost(Name = "goOutDebugMode")]
public async Task<ResponseBase> goOutDebugMode(SetBoardIdRequest request)
{
try
{
//获取TCP
var client = TCPClientManager.TCPClients
.Where(t => t.RemoteIPHost == request.IPPort)
.First();
if (client == null)
{
return new ResponseBase<object>()
{
Code = 300,
Message = "未获取到对应连接,请检查地址",
Data = null
};
}
//退出调试模式
byte[] data = { 0x08, 0x00, 0x00, 0x07, 0xFF, 0xDB, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
client.Send(data);
return new ResponseBase<object>()
{
Code = 200,
Message = "指令发送成功",
Data = null
};
}
catch (Exception ex)
{
return new ResponseBase<object>()
{
Code = 300,
Message = "指令发送失败" + ex.Message,
Data = null
};
}
}
[Route("setId")]
[HttpPost(Name = "setId")]
public async Task<ResponseBase> setId(SetBoardIdRequest request)
{
try
{
//获取TCP
var client = TCPClientManager.TCPClients
.Where(t => t.RemoteIPHost == request.IPPort)
.First();
if (client == null)
{
return new ResponseBase<object>()
{
Code = 300,
Message = "未获取到对应连接,请检查地址",
Data = null
};
}
//退出调试模式
byte[] data = { 0x08, 0x00, 0x00, 0x07, 0xFF, 0xDB, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00 };
client.Send(data);
var boardId = request.StartId;
var boardIdData = BitConverter.GetBytes(unchecked((short)boardId));
// 检查是否需要交换字节
if (BitConverter.IsLittleEndian)
{
// 如果是小端序系统,则交换字节
byte temp = boardIdData[0];
boardIdData[0] = boardIdData[1];
boardIdData[1] = temp;
}
Thread.Sleep(3000);
byte[] data1 = { 0x08, 0x00, 0x00, 0x07, 0xFF, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
data1[6] = boardIdData[0];
data1[7] = boardIdData[1];
client.Send(data1);
return new ResponseBase<object>()
{
Code = 200,
Message = "指令发送成功",
Data = null
};
}
catch (Exception ex)
{
return new ResponseBase<object>()
{
Code = 300,
Message = "指令发送失败" + ex.Message,
Data = null
};
}
}
[Route("setLight")]
[HttpPost(Name = "setLight")]
public async Task<ResponseBase> setLight(SetBoardIdRequest request)
{
try
{
//获取TCP
var client = TCPClientManager.TCPClients
.Where(t => t.RemoteIPHost == request.IPPort)
.First();
if (client == null)
{
return new ResponseBase<object>()
{
Code = 300,
Message = "未获取到对应连接,请检查地址",
Data = null
};
}
var boardId = request.StartId;
var boardIdData = BitConverter.GetBytes(unchecked((short)boardId));
// 检查是否需要交换字节
if (BitConverter.IsLittleEndian)
{
// 如果是小端序系统,则交换字节
byte temp = boardIdData[0];
boardIdData[0] = boardIdData[1];
boardIdData[1] = temp;
}
byte[] data1 = { 0x08, 0x00, 0x00, 0x07, 0xFF, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
data1[7] = boardIdData[0];
data1[8] = boardIdData[1];
client.Send(data1);
return new ResponseBase<object>()
{
Code = 200,
Message = "指令发送成功",
Data = null
};
}
catch (Exception ex)
{
return new ResponseBase<object>()
{
Code = 300,
Message = "指令发送失败" + ex.Message,
Data = null
};
}
}
[Route("testLight")]
[HttpPost(Name = "testLight")]
public async Task<ResponseBase> testLight(SetBoardIdRequest request)
{
try
{
//获取TCP
var client = TCPClientManager.TCPClients
.Where(t => t.RemoteIPHost == request.IPPort)
.First();
if (client == null)
{
return new ResponseBase<object>()
{
Code = 300,
Message = "未获取到对应连接,请检查地址",
Data = null
};
}
var boardId = request.StartId;
for (;boardId <= 224;boardId++)
{
var boardIdData = BitConverter.GetBytes(unchecked((short)boardId));
// 检查是否需要交换字节
if (BitConverter.IsLittleEndian)
{
// 如果是小端序系统,则交换字节
byte temp = boardIdData[0];
boardIdData[0] = boardIdData[1];
boardIdData[1] = temp;
}
//发送入库亮灯
byte[] data1 = { 0x08, 0x00, 0x00, 0x07, 0xFF, 0xA1, 0x01, 0x02, 0x02, 0x0A, 0x00, 0x00, 0x00 };
data1[7] = boardIdData[0];
data1[8] = boardIdData[1];
client.Send(data1);
Thread.Sleep(490);
//发送退出入库
byte[] data2 = { 0x08, 0x00, 0x00, 0x07, 0xFF, 0xA1, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
data2[7] = boardIdData[0];
data2[8] = boardIdData[1];
client.Send(data2);
Thread.Sleep(10);
}
return new ResponseBase<object>()
{
Code = 200,
Message = "指令发送成功",
Data = null
};
}
catch (Exception ex)
{
return new ResponseBase<object>()
{
Code = 300,
Message = "指令发送失败" + ex.Message,
Data = null
};
}
}
[Route("resetByTCP")]
[HttpPost(Name = "resetByTCP")]
public async Task<ResponseBase> resetByTCP(SetBoardIdRequest request)
{
try
{
//获取TCP
var client = TCPClientManager.TCPClients
.Where(t => t.RemoteIPHost == request.IPPort)
.First();
if (client == null)
{
return new ResponseBase<object>()
{
Code = 300,
Message = "未获取到对应连接,请检查地址",
Data = null
};
}
byte[] data = { 0x08, 0x00, 0x00, 0x07, 0xFF, 0xBE, 0x52, 0x54, 0x41, 0x52, 0x54, 0x0A, 0xED };
client.Send(data);
return new ResponseBase<object>()
{
Code = 200,
Message = "指令发送成功",
Data = null
};
}
catch (Exception ex)
{
return new ResponseBase<object>()
{
Code = 300,
Message = "指令发送失败" + ex.Message,
Data = null
};
}
}
}
}