using Microsoft.AspNetCore.Mvc ;
using Microsoft.EntityFrameworkCore ;
using Microsoft.Identity.Client.Extensions.Msal ;
using System.Drawing ;
using WMS_GIRAF_Interface.Data ;
using WMS_GIRAF_Interface.Entities ;
using WMS_GIRAF_Interface.Models ;
using WMS_GIRAF_Interface.Repositories.Interface ;
using WMS_GIRAF_Interface.TaskServices ;
namespace WMS_GIRAF_Interface.Controllers
{
[ApiController, Route("/Output")]
public class OutputRequestController (
MichelinDbContext context ,
IdestinationIdRepository destinationIdRepository ,
ManageTaskService manageTaskService ,
IManageMainRepository manageMainRepository ,
IWhCellRepository whCellRepository ,
IProductInformationRepository productInformationRepository ,
IIoControlRepository ioControlRepository ,
IIoControlRouteRepository ioControlRouteRepository ,
CellLogicService cellLogicService )
: ControllerBase
{
/// <summary>
/// 根据产品ID生成出库任务
/// </summary>
/// <param name="outputRequest"></param>
[HttpPost("ByProductIds")]
public OutputRequestByProductIdsReturn OutputRequestByProductIds ( OutputRequestByProductIds . RootObjectForOutputRequestByProductIds ? outputRequest )
{
bool bResult = true ;
string sResult = string . Empty ;
OutputRequestByProductIdsReturn returnJsonString = new OutputRequestByProductIdsReturn ( ) ;
if ( outputRequest ! = null )
{
//判断当前出库终点是否存在
var checkDestinationId = destinationIdRepository . GetDestinationId ( outputRequest . evacuationPost ) ;
if ( checkDestinationId ! = null )
{
//轮询轮胎号来生成出库任务
if ( outputRequest . productIds is { Length : > 0 } )
{
foreach ( var outputRequestProductId in outputRequest . productIds )
{
//根据productId生成出库任务,终点选择当前巷道的自动出库站台
var productInfo = context . V_StorageList . FirstOrDefault ( x = > x . STOCK_BARCODE = = outputRequestProductId )
;
if ( productInfo ! = null )
{
//根据device Code 判断路径可用性
if ( ! string . IsNullOrEmpty ( productInfo . DEVICE_CODE ) & & ! string . IsNullOrEmpty ( checkDestinationId . AREA ) )
{
var ioControlRoute = ioControlRouteRepository . GetRouteByStartDeviceAndControlRouteCode ( productInfo . DEVICE_CODE , checkDestinationId . AREA ) ;
if ( ioControlRoute is { CONTROL_ROUTE_STATUS : 1 } )
{
var endStationId = whCellRepository . GetCell ( ioControlRoute . END_DEVICE ) ;
if ( endStationId ! = null )
{
MANAGE_MAIN manageMain = new MANAGE_MAIN
{
requestNumber = outputRequest . outputRequestId ,
//20180811,gh修改,临时使用,使用plan_id字段,区别指定条码要胎的流程,该流程取货空后不做任何处理
PLAN_ID = 1 ,
MANAGE_TYPE_CODE = "ManageDown" ,
STOCK_BARCODE = productInfo . STOCK_BARCODE ,
START_CELL_ID = productInfo . CELL_ID ,
END_CELL_ID = endStationId . CELL_ID ,
MANAGE_OPERATOR = "AUTO" , // wyb 自动出库
MANAGE_BEGIN_TIME = DateTime . Now . ToString ( "yyyy-MM-dd HH:mm:ss" ) ,
MANAGE_STATUS = "WaitingSend" ,
MANAGE_LEVEL = string . Empty ,
MANAGE_REMARK = string . Empty ,
keepRequestInMemoryEvenIfMechanicalIssue = true ,
DESTINATIONID = outputRequest . evacuationPost ,
TargetOutputDateInUtc = Convert . ToDateTime ( outputRequest . expectedCompletionDate ) ,
CELL_MODEL = productInfo . CELL_MODEL ,
//tlt20210913:添加CV标志
POPULATIONNUMBER = "TO_CV" ,
} ;
//Add task and control task
bResult = manageTaskService . CreateOutputTaskFromGiraf ( manageMain , productInfo . CELL_ID , true , out sResult ) ;
if ( bResult )
{
returnJsonString . status = "1" ;
returnJsonString . evacuationPost = outputRequest . evacuationPost ;
returnJsonString . estimatedExitTime = DateTime . Now . ToString ( "yyyy-MM-dd HH:mm:ss" ) ;
returnJsonString . errorDetails + = $"RefusedBecauseUnknownEvacuationPost{outputRequestProductId}" ;
}
else
{
returnJsonString . status = "0" ;
returnJsonString . evacuationPost = string . Empty ;
returnJsonString . estimatedExitTime = string . Empty ;
returnJsonString . errorDetails + = $"Create Task have errors:{sResult[..200]}" ;
}
}
else
{
//终点信息不对
returnJsonString . status = "3" ;
returnJsonString . evacuationPost = string . Empty ;
returnJsonString . estimatedExitTime = string . Empty ;
returnJsonString . errorDetails + = $"RefusedBecauseUnknownEvacuationPost{outputRequestProductId}" ;
}
}
}
else
{
//判断路径信息不全,无法进行判断
//未找到指定条码
returnJsonString . status = "3" ;
returnJsonString . evacuationPost = string . Empty ;
returnJsonString . estimatedExitTime = string . Empty ;
returnJsonString . errorDetails + = $"RefusedBecauseUnknownPost{outputRequestProductId}" ;
}
}
else
{
//未找到指定条码
returnJsonString . status = "4" ;
returnJsonString . evacuationPost = string . Empty ;
returnJsonString . estimatedExitTime = string . Empty ;
returnJsonString . errorDetails + = $"RefusedBecauseLackOfBarcode{outputRequestProductId}" ;
}
}
}
else
{
//无可用的轮胎号列表
returnJsonString . status = "3" ;
returnJsonString . evacuationPost = string . Empty ;
returnJsonString . estimatedExitTime = string . Empty ;
returnJsonString . errorDetails = "RefusedBecauseEmptyProductIds" ;
}
}
else
{
returnJsonString . status = "3" ;
returnJsonString . evacuationPost = string . Empty ;
returnJsonString . estimatedExitTime = string . Empty ;
returnJsonString . errorDetails = "RefusedBecauseUnknownPostNumber" ;
}
}
else
{
//当前入参为空
returnJsonString . status = "3" ;
returnJsonString . evacuationPost = string . Empty ;
returnJsonString . estimatedExitTime = string . Empty ;
returnJsonString . errorDetails = "RefusedBecauseEmptyInputParameter" ;
}
return returnJsonString ;
}
/// <summary>
/// 根据Sku生成出库任务
/// SendOutputRequestByLotWithManyPool
/// </summary>
/// <param name="outputRequest"></param>
[HttpPost("BySku")]
public OutputRequestBySkuReturn OutputRequestBySku ( OutputRequestBySku . RootObjectForOutputRequestBySku ? outputRequest )
{
bool bResult = true ;
string sResult = string . Empty ;
OutputRequestBySkuReturn returnJsonString = new OutputRequestBySkuReturn ( ) ;
if ( outputRequest ! = null )
{
//先判断当前sku是否有可用库存,然后筛选出库,如果没有的话就就启用备用sku的库存出库
if ( context . V_StorageList . FromSqlRaw ( $"SELECT TOP 1 STOCK_BARCODE FROM V_STORAGE_LIST WHERE requestNumber = '{outputRequest.outputRequestId}'" ) . ToList ( ) . Count > 0 )
{
returnJsonString . status = "0" ;
returnJsonString . evacuationPost = string . Empty ;
returnJsonString . estimatedExitTime = string . Empty ;
returnJsonString . errorDetails = "RefusedBecauseSameRequestNumber" ;
}
else
{
//检查post number
var checkPost =
destinationIdRepository . GetDestinationId ( outputRequest . evacuationPost ) ;
if ( checkPost = = null )
{
returnJsonString . status = "0" ;
returnJsonString . evacuationPost = string . Empty ;
returnJsonString . estimatedExitTime = string . Empty ;
returnJsonString . errorDetails = "RefusedBecauseUnknownPostNumber" ;
}
else
{
//tlt:根据SKu来筛选物料信息
//无需筛选巷道状态,直接选择可用轮胎,只需考虑availableEvacuationPosts即可,筛选lane_way
#region outlevel 4/3/2/1
var checkHighPriorityTire = context . V_StorageList . FromSqlRaw (
$ @ "SELECT TOP 1 STORAGE_ID FROM V_STORAGE_LIST
WHERE RUN_STATUS = ' Enable '
AND ( requestNumber IS NULL OR requestNumber = ' ' )
AND IsBlocked = { ( outputRequest . productIsBlocked ? 1 : 0 ) }
AND LOTNUMBER = ' { outputRequest . sku } '
AND PopulationNumber = ' { outputRequest . productClass } '
AND Lane_way IN ( { string . Join ( "," , outputRequest . availableEvacuationPosts ) } ) ");
#endregion
}
}
}
else
{
//当前入参为空
returnJsonString . status = "3" ;
returnJsonString . evacuationPost = string . Empty ;
returnJsonString . estimatedExitTime = string . Empty ;
returnJsonString . errorDetails = "RefusedBecauseEmptyInputParameter" ;
}
return returnJsonString ;
}
[HttpPut]
public void UpdateOutputRequest ( UpdateOutputRequest . RootObjectForUpdateOutputRequest updateOutputRequest )
{
}
[HttpPost("Cancel")]
public void CancelOutputRequest ( CancelOutputRequest . RootObjectForCancelOutputRequest cancelOutputRequest )
{
}
}
}