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 { /// /// 根据产品ID生成出库任务 /// /// [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; } /// /// 根据Sku生成出库任务 /// SendOutputRequestByLotWithManyPool /// /// [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) { } } }