using System; using System.Collections.Generic; using System.Globalization; using Michelin_WebAPI.Data; using Michelin_WebAPI.Entities; using Michelin_WebAPI.Repositories.Interface; using Michelin_WebAPI.TaskServices.Interface; using Microsoft.EntityFrameworkCore.Storage; using System.Linq; using AutoMapper; using Microsoft.Extensions.Logging; using Michelin_WebAPI.Helper; using Microsoft.EntityFrameworkCore; using Newtonsoft.Json; namespace Michelin_WebAPI.TaskServices.Implement { public class ManagePreOut:IManagePreOut { private readonly MichelinDBContext _context; private readonly IMapper _mapper; private readonly IManageRepository _manageRepository; private readonly IWhCellRepository _whCellRepository; private readonly IStorageRepository _storageRepository; private readonly IManageHelper _manageHelper; private readonly ILogger _logger; public ManagePreOut(IManageRepository manageRepository, IWhCellRepository whCellRepository, IStorageRepository storageRepository, IManageHelper manageHelper, MichelinDBContext context, IMapper mapper, ILogger logger) { _manageRepository = manageRepository; _whCellRepository = whCellRepository; _storageRepository = storageRepository; _manageHelper = manageHelper; _context = context; _mapper = mapper; _logger = logger; } public bool FabricateListCreate(List manageMains, out string sResult) { //检查当前的manageMains中的雪花ID是否为同一个 var snowFlakeList = manageMains.Select(x => x.BUCKET_GROUP).Distinct(); //tlt20231211:当前雪花ID有问题:需要进行重新赋值,将所有的雪花ID重新赋值 if (snowFlakeList.Any()) { _logger.LogInformation($"1.ManageMains with old bucket_group number :{JsonConvert.SerializeObject(snowFlakeList)}"); var bucketGroup = SnowFlake.SnowflakeIDcreator.nextId().ToString(); foreach (var manageMain in manageMains) { manageMain.BUCKET_GROUP = bucketGroup; } _logger.LogInformation($"2.Because the bucket_group number is not same, Modified the Bucket_Group number :{bucketGroup};ManageMains :{JsonConvert.SerializeObject(manageMains.Select(x => new { x.STOCK_BARCODE, x.BUCKET_GROUP }).Distinct())} "); } bool bResult = true; sResult = string.Empty; var transaction = _context.Database.BeginTransaction(); try { foreach (var manageMain in manageMains) { var bucketMain = _storageRepository.GetStorageMainByBucket(manageMain.STOCK_BARCODE); var bucketLists = _storageRepository.GetStorageLists(bucketMain.STORAGE_ID); var lstManageList = new List(); //根据autoMapper映射变量信息 lstManageList.AddRange(bucketLists.Select(storageList => _mapper.Map(storageList))); //tlt20230717:设置GOODS_PROPERTY8为本次出库桶数量 foreach (var manageList in lstManageList) { manageList.GOODS_PROPERTY8 = manageMains.Count.ToString(); } bResult = ManageCreate(manageMain, lstManageList, false, true, false, out sResult); if (!bResult) break; } } catch (Exception ex) { bResult = false; Console.WriteLine(ex.Message); sResult = ex.Message; _logger.LogError($"FabricateListCreate Exception:{ex.Message}"); } finally { if (bResult) { transaction.Commit(); } else { transaction.Rollback(); } } return bResult; } public bool ManageCreate(MANAGE_MAIN mMANAGE_MAIN, List lsMANAGE_LIST, bool bTrans, bool bAutoSendControl, bool bComplete, out string sResult) { bool bResult = true; sResult = string.Empty; int MANAGE_ID = 0; WH_CELL mWH_CELL_START = _whCellRepository.GetCell(mMANAGE_MAIN.START_CELL_ID); WH_CELL mWH_CELL_END = _whCellRepository.GetCell(mMANAGE_MAIN.END_CELL_ID); try { _manageRepository.AddManageMain(mMANAGE_MAIN, out var manage_id); foreach (var mMANAGE_LIST in lsMANAGE_LIST) { mMANAGE_LIST.MANAGE_ID = manage_id; mMANAGE_LIST.PLAN_LIST_ID = 0; _manageRepository.AddManageList(mMANAGE_LIST); } if (mWH_CELL_START != null) { mWH_CELL_START.RUN_STATUS = "Selected"; bResult = _whCellRepository.UpdateCellStatus(mWH_CELL_START); if (!bResult) { sResult = $"Update start position {mWH_CELL_START.CELL_CODE}status error\n{sResult}"; return false; } } if (mWH_CELL_END != null) { mWH_CELL_END.RUN_STATUS = "Selected"; bResult = _whCellRepository.UpdateCellStatus(mWH_CELL_END); if (!bResult) { sResult = $"Update end position {mWH_CELL_END.CELL_CODE} status error\n{sResult}"; return false; } } MANAGE_ID = mMANAGE_MAIN.MANAGE_ID; //当出库任务为主库区,并且是立库区 if (mWH_CELL_START is {WAREHOUSE_ID: 1, AREA_ID: 1}) { //倒库逻辑: //tlt:判断预留倒库货位是否有货 //首先判断当前出库货位是否为远端货位 if (mWH_CELL_START.CELL_FORK_TYPE == "Far") { //判断近端是否有货:通过CELL_GROUP来判断当前货位的近端货位状态 WH_CELL dtCell = _context.Wh_Cell.FirstOrDefault(x => x.CELL_CODE != mWH_CELL_START.CELL_CODE && x.CELL_GROUP == mWH_CELL_START.CELL_CODE && x.CELL_FORK_TYPE == "Near" && x.CELL_STATUS != "Nohave"); //近端货位有货 if ( dtCell!=null) { //近端托盘判断:是否有任务存在 if (dtCell.RUN_STATUS != "Selected") { //无任务存在就要执行移库操作 //创建移库管理任务 MANAGE_MAIN mManageMain = new MANAGE_MAIN(); List lstManageList = new List(); //获取库存主信息 STORAGE_MAIN sStorageMain = _storageRepository.GetStorageMainByCellId(dtCell.CELL_ID); List tempStorageList; if (sStorageMain != null) { tempStorageList = _storageRepository.GetStorageLists(sStorageMain.STORAGE_ID); } else { //错误:未找到库存信息 sResult = "未找到近端库存信息"; bResult = false; return false; } //添加管理任务 mManageMain.STOCK_BARCODE = sStorageMain.STOCK_BARCODE; mManageMain.MANAGE_STATUS = "WaitingSend"; mManageMain.MANAGE_TYPE_CODE = "ManageMove"; mManageMain.MANAGE_BEGIN_TIME = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); mManageMain.START_CELL_ID = sStorageMain.CELL_ID; //终止货位获取:根据货货位分配原则来进行分配 bool tResult = GetMoveEndPosition(dtCell, out int endCellId); //当前巷道预留倒库货位 if (tResult) { mManageMain.END_CELL_ID = endCellId; } else { //无可用货位 sResult = "未找到倒库货位,无法倒库"; bResult = false; return false; } mManageMain.MANAGE_OPERATOR = "AutoMove"; mManageMain.MANAGE_LEVEL = string.Empty; mManageMain.MANAGE_REMARK = string.Empty; //tlt20220629:新属性添加 mManageMain.WEIGHT_PALLET = sStorageMain.WEIGHT_PALLET; mManageMain.PG_CODE = sStorageMain.PG_CODE; mManageMain.TRANSACTION_NUMBER = sStorageMain.TRANSACTION_NUMBER; mManageMain.BUCKET_NUMBER = sStorageMain.BUCKET_NUMBER; mManageMain.BUCKET_GROUP = sStorageMain.BUCKET_GROUP; mManageMain.OperationRequestID = sStorageMain.OperationRequestID; mManageMain.OperationToExecuteID = sStorageMain.OperationToExecuteID; mManageMain.VirtualNameMachinePalletizer = sStorageMain.VirtualNameMachinePalletizer; mManageMain.MFDCode = sStorageMain.MFDCode; mManageMain.MATIND = sStorageMain.MATIND; mManageMain.NIP = sStorageMain.NIP; mManageMain.IMP = sStorageMain.IMP; mManageMain.ItemIdentification = sStorageMain.ItemIdentification; mManageMain.ItemTraceability = sStorageMain.ItemTraceability; mManageMain.ItemHdvDate = sStorageMain.ItemHdvDate; mManageMain.ItemHdvTime = sStorageMain.ItemHdvTime; mManageMain.ItemFabricationDate = sStorageMain.ItemFabricationDate; mManageMain.ItemFabricationTime = sStorageMain.ItemFabricationTime; //添加list foreach (STORAGE_LIST mSTORAGE_LIST in tempStorageList) { //根据映射关系添加信息 var mManageList = _mapper.Map(mSTORAGE_LIST); //////////////////////////////////////////////////////////////////// lstManageList.Add(mManageList); } //根据终止节点下移库任务 bResult = _manageHelper.ManageMoveTaskCreate(mManageMain, lstManageList, false, false, true, out sResult); } } else //无货的情况下,查看货位状态 { //查看近端货位是否有入库任务 WH_CELL dtCELL = _context.Wh_Cell.First(x => x.CELL_GROUP == mWH_CELL_START.CELL_CODE && x.CELL_FORK_TYPE == "Near" && x.WAREHOUSE_ID == mWH_CELL_START.WAREHOUSE_ID); if (dtCELL.RUN_STATUS == "Selected") { MANAGE_MAIN manageMain = _context.Manage_Main.FirstOrDefault(x => x.END_CELL_ID == dtCELL.CELL_ID); if (manageMain != null) { mMANAGE_MAIN.MANAGE_REMARK = "Block"; _manageRepository.UpdateManageMain(mMANAGE_MAIN); } } } } if (bAutoSendControl) { bResult = _manageHelper.ManageDownLoad(mMANAGE_MAIN.STOCK_BARCODE, false, out sResult); } if (!bResult) { return false; } } sResult = $"Bucket {mMANAGE_MAIN.STOCK_BARCODE} create the unloading task success!"; } catch (Exception ex) { bResult = false; sResult = ex.Message; } //finally //{ // if (bResult) // { // transaction.Commit(); // } // else // { // transaction.Rollback(); // } //} return bResult; } /// /// 获取移库货位 /// /// /// /// public bool GetMoveEndPosition(WH_CELL dtCell, out int endCellId) { _logger.LogInformation($"Function:GetMoveEndPosition; start cell code:{dtCell.CELL_CODE};the begin time:{DateTime.Now.ToString(CultureInfo.InvariantCulture)}"); endCellId = 0; #region 旧逻辑 //var list = _context.Reserve_Cell.Where(y => y.DEVICE_CODE == dtCell.DEVICE_CODE).ToList(); //var nearList = _context.Wh_Cell.Where(y => y.CELL_STATUS == "Nohave" && y.RUN_STATUS == "Enable" && y.CELL_FORK_TYPE == "Near" && y.WAREHOUSE_ID == dtCell.WAREHOUSE_ID && y.DEVICE_CODE == dtCell.DEVICE_CODE).ToList(); //whCells = _context.Wh_Cell.Where(x => // x.DEVICE_CODE == dtCell.DEVICE_CODE && x.CELL_FORK_TYPE == "Far" && // x.CELL_STATUS == "Nohave" && x.RUN_STATUS == "Enable" && x.CELL_TYPE == "Cell" && // x.CELL_STORAGE_TYPE == "SinglePallet" && !list.Select(y => y.CELL_CODE).Contains(x.CELL_CODE) && nearList.Select(z => z.CELL_CODE).Contains(x.CELL_GROUP)) // .OrderBy(y => y.CELL_Y) // .ThenByDescending(z => z.CELL_X).ThenBy(w => w.CELL_Z).ToList(); //tlt20240109:替换获取货位逻辑 //var whCells = _context.Wh_Cell.FromSqlRaw($@"SELECT CELL_ID,CELL_CODE,CELL_GROUP // FROM WH_CELL WHERE DEVICE_CODE = '{dtCell.DEVICE_CODE}' // AND CELL_FORK_TYPE = 'Near' // AND CELL_STATUS = 'Nohave' // AND RUN_STATUS = 'Enable' // AND CELL_TYPE = 'Cell' // AND CELL_STORAGE_TYPE = 'SinglePallet' // AND CELL_ID NOT IN ( SELECT CELL_ID FROM RESERVE_CELL ) // AND CELL_GROUP IN ( SELECT CELL_CODE FROM V_STORAGE_LIST WHERE DEVICE_CODE = '{dtCell.DEVICE_CODE}' AND RUN_STATUS = 'Enable' AND CELL_STATUS = 'Full' AND CELL_FORK_TYPE = 'Far' ) // ORDER BY CELL_Y,CELL_X DESC, CELL_Z").ToList(); #endregion var whCells = _context.Wh_Cell.FromSqlRaw($@"SELECT CELL_ID, WAREHOUSE_ID,AREA_ID,LOGIC_ID,CELL_NAME,CELL_CODE,CELL_TYPE,DEVICE_CODE,CELL_Z,CELL_X,CELL_Y,CELL_INOUT,CELL_MODEL,CELL_STATUS,RUN_STATUS,CELL_FORK_TYPE,CELL_LOGICAL_NAME,LANE_WAY,CELL_GROUP,SHELF_TYPE,SHELF_NEIGHBOUR,CELL_STORAGE_TYPE,LOCK_DEVICE_CODE,CELL_WIDTH,CELL_HEIGHT,LOCK_CELL_ID,BELONG_AREA,BELONG_ZCQ_ID,CELL_FLAG,CELL_TRANS_FLAG FROM WH_CELL WHERE DEVICE_CODE = '{dtCell.DEVICE_CODE}' AND CELL_FORK_TYPE = 'Far' AND CELL_STATUS = 'Nohave' AND RUN_STATUS = 'Enable' AND CELL_TYPE = 'Cell' AND CELL_STORAGE_TYPE = 'SinglePallet' AND CELL_ID NOT IN ( SELECT CELL_ID FROM RESERVE_CELL ) AND CELL_CODE IN ( SELECT CELL_GROUP FROM WH_CELL WHERE DEVICE_CODE = '{dtCell.DEVICE_CODE}' AND RUN_STATUS = 'Enable' AND CELL_STATUS = 'Nohave' AND CELL_FORK_TYPE = 'Near' ) ORDER BY CELL_Y,CELL_X DESC, CELL_Z").ToList(); #region 旧逻辑 //Where(x => // x.DEVICE_CODE == dtCell.DEVICE_CODE && x.CELL_FORK_TYPE == "Far" && // x.CELL_STATUS == "Nohave" && x.RUN_STATUS == "Enable" && x.CELL_TYPE == "Cell" && // x.CELL_STORAGE_TYPE == "SinglePallet" && !list.Select(y => y.CELL_ID).Contains(x.CELL_ID) && nearList.Select(z => z.CELL_CODE).Contains(x.CELL_GROUP)) //.OrderBy(y => y.CELL_Y) //.ThenByDescending(z => z.CELL_X).ThenBy(w => w.CELL_Z).ToList(); #endregion //tlt20240109:选择远端有货且无任务,近端无货的货位 if (whCells.Count > 0) { //返回数值 string temp = whCells[0].CELL_CODE; endCellId = whCells[0].CELL_ID;//返回第一个符合条件的数值 } else { #region 旧逻辑 //var farList = _context.Wh_Cell.Where(y => y.CELL_STATUS == "Full" && y.RUN_STATUS == "Enable" && y.CELL_FORK_TYPE == "Far" && y.WAREHOUSE_ID == dtCell.WAREHOUSE_ID && y.DEVICE_CODE == dtCell.DEVICE_CODE).ToList(); //whCells = _context.Wh_Cell.Where(x => // x.DEVICE_CODE == dtCell.DEVICE_CODE && x.CELL_FORK_TYPE == "Near" && // x.CELL_STATUS == "Nohave" && x.RUN_STATUS == "Enable" && x.CELL_TYPE == "Cell" && // x.CELL_STORAGE_TYPE == "SinglePallet" && !list.Select(y => y.CELL_CODE).Contains(x.CELL_CODE) && farList.Select(z => z.CELL_CODE).Contains(x.CELL_GROUP)) // .OrderBy(y => y.CELL_Y).ThenByDescending(z => z.CELL_X).ThenBy(w => w.CELL_Z).ToList(); #endregion //获取远端有货,近端无货的货位,远端存在同属性货位 whCells = _context.Wh_Cell.FromSqlRaw($@"SELECT CELL_ID, WAREHOUSE_ID,AREA_ID,LOGIC_ID,CELL_NAME,CELL_CODE,CELL_TYPE,DEVICE_CODE,CELL_Z,CELL_X,CELL_Y,CELL_INOUT,CELL_MODEL,CELL_STATUS,RUN_STATUS,CELL_FORK_TYPE,CELL_LOGICAL_NAME,LANE_WAY,CELL_GROUP,SHELF_TYPE,SHELF_NEIGHBOUR,CELL_STORAGE_TYPE,LOCK_DEVICE_CODE,CELL_WIDTH,CELL_HEIGHT,LOCK_CELL_ID,BELONG_AREA,BELONG_ZCQ_ID,CELL_FLAG,CELL_TRANS_FLAG FROM WH_CELL WHERE DEVICE_CODE = '{dtCell.DEVICE_CODE}' AND CELL_FORK_TYPE = 'Near' AND CELL_STATUS = 'Nohave' AND RUN_STATUS = 'Enable' AND CELL_TYPE = 'Cell' AND CELL_STORAGE_TYPE = 'SinglePallet' AND CELL_ID NOT IN ( SELECT CELL_ID FROM RESERVE_CELL ) AND CELL_GROUP IN ( SELECT CELL_CODE FROM V_STORAGE_LIST WHERE DEVICE_CODE = '{dtCell.DEVICE_CODE}' AND RUN_STATUS = 'Enable' AND CELL_STATUS = 'Full' AND CELL_FORK_TYPE = 'Far' ) ORDER BY CELL_Y,CELL_X DESC, CELL_Z").ToList(); if (whCells.Count > 0) { endCellId = whCells[0].CELL_ID;//返回第一个符合条件的数值 } else { #region 旧逻辑 //whCells = _context.Wh_Cell.Where(x => // x.DEVICE_CODE == dtCell.DEVICE_CODE && x.CELL_FORK_TYPE == "Near" && // x.CELL_STATUS == "Nohave" && x.RUN_STATUS == "Enable" && x.CELL_TYPE == "Cell" && // x.CELL_STORAGE_TYPE == "SinglePallet" && list.Select(y => y.CELL_CODE).Contains(x.CELL_CODE)) // .OrderBy(y => y.CELL_Y).ThenByDescending(z => z.CELL_X).ThenBy(w => w.CELL_Z).ToList(); #endregion //选取本巷道的预留货位 whCells = _context.Wh_Cell.FromSqlRaw($@"SELECT CELL_ID, WAREHOUSE_ID,AREA_ID,LOGIC_ID,CELL_NAME,CELL_CODE, CELL_TYPE,DEVICE_CODE,CELL_Z,CELL_X,CELL_Y,CELL_INOUT,CELL_MODEL, CELL_STATUS,RUN_STATUS,CELL_FORK_TYPE,CELL_LOGICAL_NAME,LANE_WAY, CELL_GROUP,SHELF_TYPE,SHELF_NEIGHBOUR,CELL_STORAGE_TYPE,LOCK_DEVICE_CODE, CELL_WIDTH,CELL_HEIGHT,LOCK_CELL_ID,BELONG_AREA,BELONG_ZCQ_ID,CELL_FLAG,CELL_TRANS_FLAG FROM WH_CELL WHERE DEVICE_CODE = '{dtCell.DEVICE_CODE}' AND CELL_FORK_TYPE = 'Near' AND CELL_STATUS = 'Nohave' AND RUN_STATUS = 'Enable' AND CELL_TYPE = 'Cell' AND CELL_STORAGE_TYPE = 'SinglePallet' AND CELL_ID IN ( SELECT CELL_ID FROM RESERVE_CELL WHERE DEVICE_CODE = '{dtCell.DEVICE_CODE}' AND FLAG = 1 ) ORDER BY CELL_Y,CELL_X DESC, CELL_Z").ToList(); if (whCells.Count > 0) { endCellId = whCells[0].CELL_ID;//返回第一个符合条件的数值 } else { //报错:当前巷道无可用倒库货位 return false; } } } _logger.LogInformation($"Function:GetMoveEndPosition; start cell code:{dtCell.CELL_CODE};end cell code:{whCells[0]?.CELL_CODE};the end time:{DateTime.Now.ToString(CultureInfo.InvariantCulture)}"); return true; } } }