|
using Admin.NET.Core.Service;
|
|
namespace WCS.Application;
|
|
/// <summary>
|
/// PLC服务
|
/// </summary>
|
[ApiDescriptionSettings(ApplicationConst.GroupName, Order = 100)]
|
public class WcsPlcService : IDynamicApiController, ITransient
|
{
|
private readonly SqlSugarRepository<WcsPlc> _wcsPlcRep;
|
private readonly SysCacheService _sysCacheService;
|
private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId);
|
public WcsPlcService(SqlSugarRepository<WcsPlc> wcsPlcRep, SysCacheService sysCacheService)
|
{
|
_wcsPlcRep = wcsPlcRep;
|
_sysCacheService = sysCacheService;
|
}
|
|
/// <summary>
|
/// 分页查询PLC
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost]
|
[ApiDescriptionSettings(Name = "Page")]
|
[DisplayName("分页查询PLC")]
|
public async Task<SqlSugarPagedList<WcsPlcOutput>> Page(PageWcsPlcInput input)
|
{
|
input.SearchKey = input.SearchKey?.Trim();
|
var query = _wcsPlcRep.AsQueryable()
|
.WhereIF(!string.IsNullOrEmpty(input.SearchKey), u =>
|
u.IP.Contains(input.SearchKey) && u.Text.Contains(input.SearchKey)
|
)
|
.WhereIF(input.PLCType.HasValue, u => u.PLCType == input.PLCType)
|
.WhereIF(!string.IsNullOrWhiteSpace(input.IP), u => u.IP.Contains(input.IP.Trim()))
|
.WhereIF(input.Type.HasValue, u => u.Type == input.Type)
|
.WhereIF(input.Enable.HasValue, u => u.Enable == input.Enable)
|
.Select<WcsPlcOutput>();
|
return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize);
|
}
|
|
/// <summary>
|
/// 增加PLC
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost]
|
[ApiDescriptionSettings(Name = "Add")]
|
[DisplayName("增加PLC")]
|
public async Task<long> Add(AddWcsPlcInput input)
|
{
|
var entity = input.Adapt<WcsPlc>();
|
await _wcsPlcRep.InsertAsync(entity);
|
return entity.Id;
|
}
|
|
/// <summary>
|
/// 删除PLC
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost]
|
[ApiDescriptionSettings(Name = "Delete")]
|
[DisplayName("删除PLC")]
|
public async Task Delete(DeleteWcsPlcInput input)
|
{
|
var entity = await _wcsPlcRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
|
await _wcsPlcRep.FakeDeleteAsync(entity); //假删除
|
//await _wcsPlcRep.DeleteAsync(entity); //真删除
|
}
|
|
/// <summary>
|
/// 更新PLC
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost]
|
[ApiDescriptionSettings(Name = "Update")]
|
[DisplayName("更新PLC")]
|
public async Task Update(UpdateWcsPlcInput input)
|
{
|
var entity = input.Adapt<WcsPlc>();
|
await _wcsPlcRep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
|
}
|
|
/// <summary>
|
/// 获取PLC
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpGet]
|
[ApiDescriptionSettings(Name = "Detail")]
|
[DisplayName("获取PLC")]
|
public async Task<WcsPlc> Detail([FromQuery] QueryByIdWcsPlcInput input)
|
{
|
return await _wcsPlcRep.GetFirstAsync(u => u.Id == input.Id);
|
}
|
|
/// <summary>
|
/// 获取PLC列表
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpGet]
|
[ApiDescriptionSettings(Name = "List")]
|
[DisplayName("获取PLC列表")]
|
public async Task<List<WcsPlcOutput>> List([FromQuery] PageWcsPlcInput input)
|
{
|
return await _wcsPlcRep.AsQueryable().WhereIF(input.Type != null, s => s.Type == input.Type).Select<WcsPlcOutput>().ToListAsync();
|
}
|
|
/// <summary>
|
/// 获取PLC连接状态和服务状态
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpGet]
|
[ApiDescriptionSettings(Name = "ListStatus")]
|
[DisplayName("获取PLC连接状态")]
|
public async Task<dynamic> ListStatus([FromQuery] PageWcsPlcInput input)
|
{
|
var listPlc = await _wcsPlcRep.AsQueryable()
|
.Where(s => s.Type == PLCTypeEnum.ShuttleCar || s.Type == PLCTypeEnum.ConveyorLine)
|
.ToListAsync();
|
foreach (var modPlc in listPlc)
|
{
|
if (_sysCacheService.ExistKey("PLCCONN:" + modPlc.Id))
|
{
|
var cachePlc = _sysCacheService.Get<WcsPlc>("PLCCONN:" + modPlc.Id);
|
modPlc.IsConn = cachePlc.IsConn;
|
}
|
else
|
{
|
modPlc.IsConn = false;
|
}
|
}
|
//服务状态
|
var modService = new { PLCTaskAction.boRunningState, PLCTaskAction.boOffline, PLCTaskAction.boRefresh, PLCTaskAction.boDemo, PLCTaskAction.boDrumReversal, PLCTaskAction.boOutLock, PLCTaskAction.boEnterLock };
|
return new { listPlc, modService };
|
}
|
|
[HttpGet]
|
[ApiDescriptionSettings(Name = "GetCarDL")]
|
[DisplayName("获取穿梭车电量")]
|
public async Task<dynamic> GetCarDL()
|
{
|
var listPlc = await _wcsPlcRep.AsQueryable()
|
.Where(s => s.Type == PLCTypeEnum.ShuttleCar)
|
.ToListAsync();
|
|
List<Dictionary<string, string>> _dicList = new List<Dictionary<string, string>>();
|
foreach (var modPlc in listPlc)
|
{
|
var modbus = new ModbusUtil(modPlc);
|
var listPlcDevice = _db.Queryable<WcsDevice>().First(s => s.PlcId == modPlc.Id);
|
var (result, value) = modbus.GetDBValue(listPlcDevice.PosType, listPlcDevice.PlcPos);
|
if (result.IsSucceed)
|
{
|
var listPlcStation = _db.Queryable<WcsPosition>().Where(s => s.DeviceId == modPlc.Id).ToList();
|
var modCarDl = listPlcStation.FirstOrDefault(s => s.Text == "电池电量");
|
var (resultDl, valueDl) = modbus.GetDBValue(modCarDl.PosType, modCarDl.PlcPos);
|
if (resultDl.IsSucceed)
|
{
|
Dictionary<string, string> _dic = new Dictionary<string, string>();
|
_dic.Add(modPlc.Text, valueDl);
|
|
_dicList.Add(_dic);
|
}
|
}
|
}
|
return new { _dicList };
|
}
|
/// <summary>
|
/// 获取位置信息
|
/// </summary>
|
/// <returns></returns>
|
[HttpGet]
|
[ApiDescriptionSettings(Name = "ListPosition")]
|
[DisplayName("获取位置信息")]
|
public List<PlcPositionInfo> ListPosition()
|
{
|
var list = PLCTaskAction.listPositionInfo.ToList();
|
return list;
|
}
|
}
|