using Application.Interface ;
using Application.PdaDto ;
using Jc.SnowId ;
using Microsoft.Extensions.DependencyInjection ;
using Serilog ;
using SlnMesnac.Model.domain ;
using SlnMesnac.Model.dto.taskType ;
using SlnMesnac.Model.dto.webapi ;
using SlnMesnac.Serilog ;
using SqlSugar ;
using System.Collections.Generic ;
using System.Net ;
using System.Text.Json ;
namespace Application
{
public class WcsTaskApplication : IWcsTaskApplication
{
private static readonly JcSnowId _snowId = new JcSnowId ( ) ;
private readonly SerilogHelper _logger ;
private ISqlSugarClient ? sqlSugarClient ;
public WcsTaskApplication ( IServiceProvider serviceProvider , ISqlSugarClient _sqlSugarClient )
{
_logger = serviceProvider . GetRequiredService < SerilogHelper > ( ) ;
sqlSugarClient = _sqlSugarClient ;
// sqlSugarClient = serviceProvider.GetRequiredService<ISqlSugarClient>();
}
/// <summary>
/// 接收agv接收任务通知接口
//in : 小料箱到达起点接驳位里面, agv通知wcs, 请求退出接驳位
//start 取完料开始前往终点
//wait: agv到达等待点, 通知wcs判断能否进接驳位
//out: 小料箱到达终点接驳位里面, agv通知wcs, 请求退出接驳位
//end: 任务结束
/// </summary>
/// <param name="agvCallbackDto"></param>
/// <returns></returns>
public ReponseagvCallbackDto AgvCallback ( agvCallbackDto agvCallbackDto )
{
ReponseagvCallbackDto reponseagvCallbackDto = new ReponseagvCallbackDto ( ) ;
try
{
WcsTask ? wcsTask = sqlSugarClient . Queryable < WcsTask > ( ) . First ( t = > t . TaskCode = = agvCallbackDto . taskCode ) ;
WcsTaskLog ? wcsTaskLog = null ;
if ( wcsTask ! = null )
{
wcsTaskLog = sqlSugarClient . Queryable < WcsTaskLog > ( ) . First ( t = > t . Id = = wcsTask . Id ) ;
}
sqlSugarClient . AsTenant ( ) . BeginTran ( ) ;
if ( wcsTask ! = null )
{
//任务赋值执行agv字段
wcsTask . NextPointNo = agvCallbackDto . robotCode ;
if ( wcsTaskLog ! = null )
{
wcsTaskLog . NextPointNo = agvCallbackDto . robotCode ;
}
//待取货
if ( agvCallbackDto . method . ToLower ( ) = = "in" )
{
if ( wcsTask . TaskType = = StaticTaskType . TransferMaterialMetrologyRoomBoxTask | | wcsTask . TaskType = = StaticTaskType . SupplySmallPalletTask
| | wcsTask . TaskType = = StaticTaskType . DeliverTonerTask )
{
wcsTask . TaskStatus = 2 ;
int successflag = 0 ;
while ( successflag = = 0 )
{
successflag = sqlSugarClient . Updateable ( wcsTask ) . ExecuteCommand ( ) ;
}
if ( wcsTaskLog ! = null )
{
wcsTaskLog . TaskStatus = wcsTask . TaskStatus ;
sqlSugarClient . Updateable ( wcsTaskLog ) . ExecuteCommand ( ) ;
}
}
reponseagvCallbackDto . code = "0" ;
reponseagvCallbackDto . message = "成功" ;
}
//起点取完
if ( agvCallbackDto . method . ToLower ( ) = = "start" )
{
if ( wcsTask . TaskType = = StaticTaskType . SupplyEmptyPalletTask | | wcsTask . TaskType = = StaticTaskType . TransferMaterialBoxTask
| | wcsTask . TaskType = = StaticTaskType . MoveLocationTask | | wcsTask . TaskType = = StaticTaskType . SupplySmallPalletFromTonerTask
| | wcsTask . TaskType = = StaticTaskType . EmptyReturnFromTonerTask | | wcsTask . TaskType = = StaticTaskType . ExceptionTask )
{
wcsTask . TaskStatus = 2 ;
}
else if ( wcsTask . TaskType = = StaticTaskType . TransferMaterialMetrologyRoomBoxTask | | wcsTask . TaskType = = StaticTaskType . SupplySmallPalletTask
| | wcsTask . TaskType = = StaticTaskType . DeliverTonerTask )
{
wcsTask . TaskStatus = 4 ;
}
int successflag = 0 ;
while ( successflag = = 0 )
{
successflag = sqlSugarClient . Updateable ( wcsTask ) . ExecuteCommand ( ) ;
}
if ( wcsTaskLog ! = null )
{
wcsTaskLog . TaskStatus = wcsTask . TaskStatus ;
sqlSugarClient . Updateable ( wcsTaskLog ) . ExecuteCommand ( ) ;
}
reponseagvCallbackDto . code = "0" ;
reponseagvCallbackDto . message = "成功" ;
}
if ( agvCallbackDto . method . ToLower ( ) = = "wait" )
{
if ( wcsTask . TaskType = = StaticTaskType . TransferMaterialMetrologyRoomBoxTask | | wcsTask . TaskType = = StaticTaskType . SupplySmallPalletTask )
{
wcsTask . TaskStatus = 6 ;
}
else if ( wcsTask . TaskType = = StaticTaskType . SupplySmallPalletFromTonerTask | | wcsTask . TaskType = = StaticTaskType . EmptyReturnFromTonerTask )
{
wcsTask . TaskStatus = 4 ;
}
int successflag = 0 ;
while ( successflag = = 0 )
{
successflag = sqlSugarClient . Updateable ( wcsTask ) . ExecuteCommand ( ) ;
}
if ( wcsTaskLog ! = null )
{
wcsTaskLog . TaskStatus = wcsTask . TaskStatus ;
sqlSugarClient . Updateable ( wcsTaskLog ) . ExecuteCommand ( ) ;
}
reponseagvCallbackDto . code = "0" ;
reponseagvCallbackDto . message = "成功" ;
}
if ( agvCallbackDto . method . ToLower ( ) = = "out" )
{
if ( wcsTask . TaskType = = StaticTaskType . TransferMaterialMetrologyRoomBoxTask | | wcsTask . TaskType = = StaticTaskType . SupplySmallPalletTask )
{
wcsTask . TaskStatus = 8 ;
}
else if ( wcsTask . TaskType = = StaticTaskType . SupplySmallPalletFromTonerTask | | wcsTask . TaskType = = StaticTaskType . EmptyReturnFromTonerTask )
{
wcsTask . TaskStatus = 6 ;
}
int successflag = 0 ;
while ( successflag = = 0 )
{
successflag = sqlSugarClient . Updateable ( wcsTask ) . ExecuteCommand ( ) ;
}
if ( wcsTaskLog ! = null )
{
wcsTaskLog . TaskStatus = wcsTask . TaskStatus ;
sqlSugarClient . Updateable ( wcsTaskLog ) . ExecuteCommand ( ) ;
}
reponseagvCallbackDto . code = "0" ;
reponseagvCallbackDto . message = "成功" ;
}
//放货完成
if ( agvCallbackDto . method . ToLower ( ) = = "end" )
{
if ( wcsTask . TaskType = = StaticTaskType . SupplyEmptyPalletTask | | wcsTask . TaskType = = StaticTaskType . TransferMaterialBoxTask
| | wcsTask . TaskType = = StaticTaskType . MoveLocationTask | | wcsTask . TaskType = = StaticTaskType . ExceptionTask )
{
wcsTask . TaskStatus = 4 ;
}
else if ( wcsTask . TaskType = = StaticTaskType . TransferMaterialMetrologyRoomBoxTask | | wcsTask . TaskType = = StaticTaskType . SupplySmallPalletTask )
{
wcsTask . TaskStatus = 10 ;
}
else if ( wcsTask . TaskType = = StaticTaskType . SupplySmallPalletFromTonerTask | | wcsTask . TaskType = = StaticTaskType . EmptyReturnFromTonerTask )
{
wcsTask . TaskStatus = 8 ;
}
else if ( wcsTask . TaskType = = StaticTaskType . DeliverTonerTask )
{
wcsTask . TaskStatus = 6 ;
}
int successflag = 0 ;
while ( successflag = = 0 )
{
successflag = sqlSugarClient . Updateable ( wcsTask ) . ExecuteCommand ( ) ;
}
if ( wcsTaskLog ! = null )
{
wcsTaskLog . TaskStatus = wcsTask . TaskStatus ;
sqlSugarClient . Updateable ( wcsTaskLog ) . ExecuteCommand ( ) ;
}
reponseagvCallbackDto . code = "0" ;
reponseagvCallbackDto . message = "成功" ;
}
}
else
{
reponseagvCallbackDto . code = "1" ;
reponseagvCallbackDto . message = "未找到当前任务" ;
}
}
catch ( Exception ex )
{
sqlSugarClient ! . AsTenant ( ) . CommitTran ( ) ;
_logger . Error ( ex . Message ) ;
reponseagvCallbackDto . code = "1" ;
reponseagvCallbackDto . message = ex . Message ;
}
sqlSugarClient ! . AsTenant ( ) . CommitTran ( ) ;
//返回请求
reponseagvCallbackDto . reqCode = reponseagvCallbackDto . reqCode ;
return reponseagvCallbackDto ;
}
/// <summary>
/// MES核减条码数量通知
/// </summary>
/// <param name="mesRequest"></param>
/// <returns></returns>
//public ReponseagvCallbackDto MesReduction(MesRequest mesRequest)
//{
// ReponseagvCallbackDto reponseagvCallbackDto = new ReponseagvCallbackDto();
// try
// {
// WmsPalletInfo? palletInfo = sqlSugarClient.Queryable<WmsPalletInfo>().First(t => t.Barcode == mesRequest.barcode);
// if (palletInfo != null)
// {
// sqlSugarClient.Deleteable(palletInfo).ExecuteCommand();
// reponseagvCallbackDto.code = "200";
// reponseagvCallbackDto.message = "核减成功";
// }
// else
// {
// reponseagvCallbackDto.code = "301";
// reponseagvCallbackDto.message = "核减失败:未找到条码库存";
// }
// }
// catch (Exception ex)
// {
// //sqlSugarClient!.AsTenant().CommitTran();
// _logger.Error(ex.Message);
// reponseagvCallbackDto.code = "301";
// reponseagvCallbackDto.message = "核减失败:" + ex.Message;
// }
// reponseagvCallbackDto.reqCode = mesRequest.reqCode;
// return reponseagvCallbackDto;
//}
/// <summary>
/// 根据库位编号获取托盘编号及库存信息
/// </summary>
public PadResponse GetLocationInfo ( List < string > locationCodes )
{
PadResponse padResponse = new PadResponse ( ) ;
try
{
List < WmsBaseLocation > wmsBaseLocations = sqlSugarClient . Queryable < WmsBaseLocation > ( ) . Where ( t = > locationCodes . Contains ( t . LocationCode ) ) . ToList ( ) ;
List < LocationInfo > locationInfos = new List < LocationInfo > ( ) ;
foreach ( string locationCode in locationCodes )
{
WmsBaseLocation ? location = wmsBaseLocations . FirstOrDefault ( x = > x . LocationCode = = locationCode ) ;
if ( location ! = null & & ! string . IsNullOrEmpty ( location . ContainerCode ) )
{
WmsPalletInfo wmsPalletInfo = sqlSugarClient . Queryable < WmsPalletInfo > ( ) . Where ( t = > t . PalletInfoCode = = location . ContainerCode ) . First ( ) ;
LocationInfo locationInfo = new LocationInfo ( ) ;
locationInfo . LocationCode = locationCode ;
locationInfo . PalletInfoCode = wmsPalletInfo . PalletInfoCode ;
locationInfo . Amount = wmsPalletInfo . Amount ;
locationInfos . Add ( locationInfo ) ;
}
else
{
LocationInfo locationInfo = new LocationInfo ( ) ;
locationInfo . LocationCode = locationCode ;
locationInfo . PalletInfoCode = "" ;
locationInfo . Amount = 0 ;
locationInfos . Add ( locationInfo ) ;
}
}
padResponse . code = "200" ;
padResponse . message = "成功" ;
padResponse . data = locationInfos ;
}
catch ( Exception ex )
{
_logger . Error ( ex . Message ) ;
padResponse . code = "301" ;
padResponse . message = "获取信息失败:" + ex . Message ;
}
return padResponse ;
}
/// <summary>
///根据托盘号托盘解绑
/// </summary>
/// <returns></returns>
public PadResponse UnBindPalletInfo ( string palletInfoCode )
{
PadResponse padResponse = new PadResponse ( ) ;
try
{
WmsPalletInfo ? wmsPalletInfo = sqlSugarClient . Queryable < WmsPalletInfo > ( ) . Where ( t = > t . PalletInfoCode = = palletInfoCode ) . First ( ) ;
if ( wmsPalletInfo ! = null )
{
wmsPalletInfo . Amount = 0 ;
wmsPalletInfo . TonerFlag = 0 ;
int result = sqlSugarClient . Updateable ( wmsPalletInfo ) . ExecuteCommand ( ) ;
if ( result > 0 )
{
padResponse . code = "200" ;
padResponse . message = "成功" ;
}
else
{
padResponse . code = "301" ;
padResponse . message = "失败" ;
}
}
else
{
padResponse . code = "301" ;
padResponse . message = "未查询到该托盘信息" ;
}
}
catch ( Exception ex )
{
_logger . Error ( ex . Message ) ;
padResponse . code = "301" ;
padResponse . message = "失败:" + ex . Message ;
}
return padResponse ;
}
/// <summary>
///pad获取指定机台的RFID设备状态
/// </summary>
/// <returns></returns>
public PadResponse GetRfidInfo ( string machineCode )
{
PadResponse padResponse = new PadResponse ( ) ;
try
{
List < BaseRfidInfo > list = sqlSugarClient . Queryable < BaseRfidInfo > ( ) . Where ( t = > t . MachineCode = = machineCode ) . ToList ( ) ;
if ( list ! = null & & list . Count > 0 )
{
padResponse . code = "200" ;
padResponse . message = "成功" ;
padResponse . data = list ;
}
else
{
padResponse . code = "301" ;
padResponse . message = "未查询到该机台的RFID设备信息" ;
}
}
catch ( Exception ex )
{
_logger . Error ( ex . Message ) ;
padResponse . code = "301" ;
padResponse . message = "失败:" + ex . Message ;
}
return padResponse ;
}
/// <summary>
///pad获取所有机台库存列表信息
/// </summary>
/// <returns></returns>
public PadResponse GetAllMachineInfos ( )
{
PadResponse padResponse = new PadResponse ( ) ;
try
{
List < WmsBaseLocationVo > Locationlist = sqlSugarClient . SqlQueryable < WmsBaseLocationVo >
( "SELECT location_code as agv_position_code,location_status,ifnull(amount,0) as amount FROM wms_base_location wbl LEFT JOIN wms_pallet_info wpi ON wbl.container_code=wpi.pallet_info_code" )
. ToList ( ) ;
//List<WmsBaseLocation> Locationlist = sqlSugarClient.Queryable<WmsBaseLocation>().LeftJoin<WmsPalletInfo>((wbi, wpi) => wbi.ContainerCode == wpi.PalletInfoCode).ToList();
//List <AllLocationInfo> locationInfos = new List<AllLocationInfo>();
//foreach (var location in Locationlist)
//{
// if (location != null)
// {
// AllLocationInfo locationInfo = new AllLocationInfo();
// if (location.ContainerCode != "")
// {
// WmsPalletInfo wmsPalletInfo = sqlSugarClient.Queryable<WmsPalletInfo>().Where(t => t.PalletInfoCode == location.ContainerCode).First();
// locationInfo.Amount = wmsPalletInfo.Amount;
// }
// else {
// locationInfo.Amount = 0;
// }
// locationInfo.LocationCode = location.AgvPositionCode;
// locationInfo.LocationStatus = location.LocationStatus;
// locationInfos.Add(locationInfo);
// }
// else
// {
// AllLocationInfo locationInfo = new AllLocationInfo();
// locationInfo.LocationCode = "";
// locationInfo.Amount = 0;
// locationInfo.LocationStatus = 0;
// locationInfos.Add(locationInfo);
// }
//}
padResponse . code = "200" ;
padResponse . message = "成功" ;
padResponse . data = Locationlist ;
}
catch ( Exception ex )
{
_logger . Error ( ex . Message ) ;
padResponse . code = "301" ;
padResponse . message = "失败:" + ex . Message ;
}
return padResponse ;
}
/// <summary>
///指定机台优先级接口:加急/不加急
///priority:0-不加急 1-加急
/// </summary>
/// <returns></returns>
//public PadResponse SetPriorityByMachineCode(string machineCode, int priority)
//{
// PadResponse response = new PadResponse();
// try
// {
// WmsMachineInfo? machineInfo = sqlSugarClient.Queryable<WmsMachineInfo>().First(t => t.MachineCode == machineCode);
// if (priority != 0 && priority != 1)
// {
// response.code = "301";
// response.message = "优先级设置失败:优先级必须为0或1";
// }
// else if (machineInfo != null)
// {
// machineInfo.Priority = priority;
// int rowsAffected = sqlSugarClient.Updateable(machineInfo).UpdateColumns(it => new { it.Priority }).ExecuteCommand();
// if (rowsAffected > 0)
// {
// response.code = "200";
// response.message = "优先级设置成功";
// }
// else
// {
// response.code = "301";
// response.message = "优先级设置失败:更新数据库异常";
// }
// }
// else
// {
// response.code = "301";
// response.message = "优先级设置失败:未找到机台信息";
// }
// }
// catch (Exception ex)
// {
// //sqlSugarClient!.AsTenant().CommitTran();
// _logger.Error(ex.Message);
// response.code = "301";
// response.message = "优先级设置失败:" + ex.Message;
// }
// return response;
//}
/// <summary>
/// 4楼到5楼原材料入口继续
/// </summary>
/// <param name="taskContinue"></param>
/// <returns></returns>
//public AgvCompeletedResponse TaskContinue(TaskContinue taskContinue)
//{
// AgvCompeletedResponse compeletedResponse = new AgvCompeletedResponse();
// try
// {
// _dbContext.ChangeTracker.Clear();
// var wcsTask = _dbContext.WcsTask
// .Where(t => t.taskType == 47)
// .Where(t => t.containerNo == taskContinue.palletInfoCode)
// .FirstOrDefault();
// if (wcsTask != null)
// {
// wcsTask.useFlag = 1;
// _dbContext.Update(wcsTask);
// _dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(a => new WcsTaskLog { useFlag = 1 });
// _dbContext.SaveChanges();
// compeletedResponse.code = "0";
// compeletedResponse.message = "成功";
// }
// else
// {
// compeletedResponse.code = "1";
// compeletedResponse.message = "未找到当前任务";
// }
// }
// catch (Exception ex)
// {
// LogManager.Error(ex);
// compeletedResponse.code = "1";
// compeletedResponse.message = ex.Message;
// }
// return compeletedResponse;
// return null;
//}
}
}