using Microsoft.AspNetCore.Mvc ;
using Microsoft.EntityFrameworkCore ;
using Microsoft.Identity.Client.Extensions.Msal ;
using System.Drawing ;
using Serilog ;
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 ,
IStorageMainRepository storageMainRepository ,
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/0
var poolNumber = string . Empty ;
string queryStringForLevel1234 = $ @ "SELECT TOP 1 STORAGE_ID,WAREHOUSE_CODE 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 ) } )
ORDER BY OutLevel DESC , HdvDateTimeInUtc ";
var checkHighPriorityTire = context . V_StorageList . FromSqlRaw ( queryStringForLevel1234 ) . ToList ( ) ;
if ( checkHighPriorityTire . Count > 0 )
{
//选择当前的可用的轮胎,更新需求号
var storageId = checkHighPriorityTire [ 0 ] . STORAGE_ID ;
poolNumber = checkHighPriorityTire [ 0 ] . WAREHOUSE_CODE ;
if ( storageId ! = 0 & & storageId ! = null )
{
var getStorageMain = storageMainRepository . GetStorageMain ( "StorageId" , storageId . ToString ( ) ) ;
if ( getStorageMain ! = null )
{
getStorageMain . requestNumber = outputRequest . outputRequestId ;
storageMainRepository . UpdateStorageMain ( getStorageMain ) ;
Log . Information ( $"Level1234 Update storage main info({getStorageMain.STOCK_BARCODE}) request number:{outputRequest.outputRequestId};" ) ;
}
else
{
//未查询到当前的库存信息
bResult = false ;
returnJsonString . status = "0" ;
returnJsonString . evacuationPost = string . Empty ;
returnJsonString . estimatedExitTime = string . Empty ;
returnJsonString . errorDetails = "RefusedBecauseUnknownStorageInfo" ;
Log . Error ( $"Level1234 Update storage main failed: can not get storage main info; request number:{outputRequest.outputRequestId};" ) ;
}
}
else
{
//未获取storage
bResult = false ;
returnJsonString . status = "0" ;
returnJsonString . evacuationPost = string . Empty ;
returnJsonString . estimatedExitTime = string . Empty ;
returnJsonString . errorDetails = "Level1234 RefusedBecauseUnknownStorage ;storage info equal to 0 or null " ;
}
}
else
{
//未找到当前库存信息
//查看level为0的库存信息
var checkLowPriorityTire = $ @ "SELECT STORAGE_ID,WAREHOUSE_CODE FROM V_STORAGE_LIST
WHERE RUN_STATUS = ' Enable '
AND OutLevel = 0
AND IsBlocked = 0
AND ( requestNumber IS NULL OR requestNumber = ' ' )
AND GETUTCDate ( ) > DryDateTimeInUtc
AND LOTNUMBER = ' { outputRequest . sku } '
AND populationNumber = ' { outputRequest . productClass } '
AND LANE_WAY IN ( { string . Join ( "," , outputRequest . availableEvacuationPosts ) } )
ORDER BY HdvDateTimeInUtc , PRIORITY , CELL_X , CELL_Y DESC ";
var level0TireList = context . V_StorageList . FromSqlRaw ( checkLowPriorityTire ) . ToList ( ) ;
if ( level0TireList is { Count : > 0 } )
{
var storageId = level0TireList [ 0 ] . STORAGE_ID ;
poolNumber = level0TireList [ 0 ] . WAREHOUSE_CODE ;
if ( storageId ! = 0 & & storageId ! = null )
{
var storageMain = storageMainRepository . GetStorageMain ( "ID" , storageId . ToString ( ) ) ;
if ( storageMain ! = null )
{
storageMain . requestNumber = outputRequest . outputRequestId ;
storageMainRepository . UpdateStorageMain ( storageMain ) ;
Log . Information ( $"Level0 Update storage main info({storageMain.STOCK_BARCODE}) request number:{outputRequest.outputRequestId};" ) ;
}
else
{
//未查询到当前的库存信息
bResult = false ;
returnJsonString . status = "0" ;
returnJsonString . evacuationPost = string . Empty ;
returnJsonString . estimatedExitTime = string . Empty ;
returnJsonString . errorDetails = "RefusedBecauseUnknownStorageInfo" ;
Log . Error ( $"Level0 Update storage main failed: can not get storage main info; request number:{outputRequest.outputRequestId};" ) ;
}
}
else
{
//未获取storage
bResult = false ;
returnJsonString . status = "0" ;
returnJsonString . evacuationPost = string . Empty ;
returnJsonString . estimatedExitTime = string . Empty ;
returnJsonString . errorDetails = "RefusedBecauseUnknownStorage" ;
Log . Information ( $" Level0 RefusedBecauseUnknownStorage ;storage info equal to 0 or null " ) ;
}
}
}
#endregion
if ( bResult )
{
//添加出库轮询信息到数据库中
MANAGE_DETAIL manageDetail = new MANAGE_DETAIL ( )
{
requestNumber = outputRequest . outputRequestId ,
destinationId = outputRequest . evacuationPost ,
lotNumber = outputRequest . sku ,
populationNumber = outputRequest . productClass ,
poolNumber = poolNumber ,
targetOutputDateInUtc = Convert . ToDateTime ( outputRequest . expectedCompletionDate ) ,
keepRequestInMemoryEvenIfMechanicalIssue = true ,
KeepRequestInMemoryEvenIfLackOfProductIssue = true
} ;
context . Manage_Detail . Add ( manageDetail ) ;
}
}
}
}
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 )
{
}
}
}