using System; using System.Collections.Generic; using System.ServiceModel; using System.Text; using System.Threading.Tasks; using EFCoreDatabase.Data; using EFCoreDatabase.Entities; using EFCoreDatabase.Repositories.Interface; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using NewWMSWebAPI.TaskService.Interface; namespace NewWMSWebAPI.TaskService.Implement { public class ManageHelper : IManageHelper { private readonly ILogger _logger; private readonly DmDBContext _context; private readonly IManageRepository _manageRepository; private readonly IWhCellRepository _whCellRepository; private readonly IStorageRepository _storageRepository; private readonly IControlRepository _controlRepository; public ManageHelper(ILogger logger, DmDBContext context, IManageRepository manageRepository, IWhCellRepository WhCellRepository, IStorageRepository storageRepository, IControlRepository controlRepository) { _logger = logger; _context = context; _manageRepository = manageRepository; _whCellRepository = WhCellRepository; _storageRepository = storageRepository; _controlRepository = controlRepository; } /// /// 生成入库任务 /// /// /// /// /// /// /// /// public bool ManageInTaskCreate(MANAGE_MAIN mMANAGE_MAIN, List lsMANAGE_LIST, bool bTrans, bool bComplete, bool bAutoSendControl, out string sResult) { bool bResult = true; sResult = string.Empty; int MANAGE_ID = 0; if (_manageRepository.GetManageMain("stockBarcode", mMANAGE_MAIN.STOCK_BARCODE) != null) { bResult = false; sResult = string.Format("托盘条码{0}已经存在任务", mMANAGE_MAIN.STOCK_BARCODE); return bResult; } //判断任务信息是否完整 bResult = _manageRepository.AddManageMain(mMANAGE_MAIN, out MANAGE_ID); if (bResult) { foreach (var mMANAGE_LIST in lsMANAGE_LIST) { mMANAGE_LIST.MANAGE_ID = mMANAGE_MAIN.MANAGE_ID; _manageRepository.AddManageList(mMANAGE_LIST); } } _logger.LogInformation($"生成无计划入库任务:{mMANAGE_MAIN.STOCK_BARCODE}"); return bResult; } /// /// 创建移库任务 /// /// /// /// /// /// /// /// /// public bool ManageMoveTaskCreate(MANAGE_MAIN mMANAGE_MAIN, List lsMANAGE_LIST, bool bTrans, bool bComplete, bool bAutoSendControl, out string sResult) { bool bResult = true; sResult = string.Empty; int MANAGE_ID = 0; if (_manageRepository.GetManageMain("stockBarcode", mMANAGE_MAIN.STOCK_BARCODE) != null) { bResult = false; sResult = string.Format("托盘条码{0}已经存在任务", mMANAGE_MAIN.STOCK_BARCODE); return bResult; } WH_CELL mWH_CELL_START = _whCellRepository.GetCell(mMANAGE_MAIN.START_CELL_ID); WH_CELL mWH_CELL_END = _whCellRepository.GetCell(mMANAGE_MAIN.END_CELL_ID); STORAGE_MAIN storageMain = _storageRepository.GetStorageMainByCellId(mMANAGE_MAIN.START_CELL_ID); if (storageMain != null) { var lsStorageList = _storageRepository.GetStorageLists(storageMain.STORAGE_ID); bResult = _manageRepository.AddManageMain(mMANAGE_MAIN, out MANAGE_ID); if (bResult) { foreach (var mMANAGE_LIST in lsMANAGE_LIST) { mMANAGE_LIST.MANAGE_ID = mMANAGE_MAIN.MANAGE_ID; _manageRepository.AddManageList(mMANAGE_LIST); } } if (mWH_CELL_START != null) { mWH_CELL_START.RUN_STATUS = "Selected"; bResult = _whCellRepository.UpdateCellStatus(mWH_CELL_START); if (!bResult) { sResult = $"更新开始货位{mWH_CELL_START.CELL_CODE}状态错误\n{sResult}"; return false; } } if (mWH_CELL_END != null) { mWH_CELL_END.RUN_STATUS = "Selected"; bResult = _whCellRepository.UpdateCellStatus(mWH_CELL_END); if (!bResult) { sResult = $"更新结束货位{mWH_CELL_END.CELL_CODE}状态错误\n{sResult}"; return false; } } if (bAutoSendControl) { bResult = ManageDownLoad(mMANAGE_MAIN.STOCK_BARCODE, false, out sResult); if (!bResult) { return bResult; } } } else { //库存出现问题 } return bResult; } private static readonly object locker = new object(); /// /// 下达控制任务 /// /// 托盘号 /// 事务控制 /// 结果信息 /// public bool ManageDownLoad(string stockBarcode, bool bTrans, out string sResult) { bool bResult = true; sResult = string.Empty; //tlt20231222:新增WebService接口,调用主程序生成控制任务;保证控制任务生成时,每个线程都保持在一个方法中 //MANAGE_MAIN mMANAGE_MAIN1 = _manageRepository.GetManageMain("stockBarcode", stockBarcode); //WH_CELL mSTART_CELL1 = _whCellRepository.GetCell(mMANAGE_MAIN1.START_CELL_ID); //Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); //I_ManageServiceClient client = new I_ManageServiceClient(); //ManageDownLoadByInterfaceRequest ControlRequest = new ManageDownLoadByInterfaceRequest(); //ControlRequest.MANAGE_ID = mMANAGE_MAIN1.MANAGE_ID; //ControlRequest.START_CELL_CODE = mSTART_CELL1.CELL_CODE; //ControlRequest.bTrans = bTrans; //var response = client.ManageDownLoadByInterfaceAsync(ControlRequest); //if (response.Result.ManageDownLoadByInterfaceResult) //{ // IO_CONTROL mIO_CONTROL = _controlRepository.GetIoControl(mMANAGE_MAIN1.MANAGE_ID); // _logger.LogInformation( // $"Create Control task Success! Control_ID {mIO_CONTROL.CONTROL_ID} " + // $"bucketId:{mIO_CONTROL.STOCK_BARCODE};" + // $"Start position :{mIO_CONTROL.START_DEVICE_CODE};" + // $"End position:{mIO_CONTROL.END_DEVICE_CODE};" + // $"RFID string:{mIO_CONTROL.RF_DATA}\r\n"); // return true; //} //else //{ // //tlt20231222:报错,出现问题 // sResult = response.Result.sResult; // _logger.LogInformation($"Create Control task Failed! Manage main info {mMANAGE_MAIN1.STOCK_BARCODE};Error message:{sResult}"); // return false; //} int END_CELL_ID = 0; lock(locker) { //获取主任务 MANAGE_MAIN mMANAGE_MAIN = _manageRepository.GetManageMain("stockBarcode", stockBarcode); #region validation if (null == mMANAGE_MAIN) { bResult = false; sResult = $"Could not find task(bucket number:{stockBarcode})"; return false; } if (mMANAGE_MAIN.MANAGE_STATUS == "Error") { bResult = false; sResult = $"Manage task error-{stockBarcode}"; return false; } WH_CELL mSTART_CELL = _whCellRepository.GetCell(mMANAGE_MAIN.START_CELL_ID); if (null == mSTART_CELL) { bResult = false; sResult = "Could not find starting position"; return false; } WH_CELL mEND_CELL = _whCellRepository.GetCell(mMANAGE_MAIN.END_CELL_ID); if (null == mEND_CELL) { bResult = false; sResult = "Could not find ending position"; return bResult; } //tlt20230327:所有的管理任务都不考虑路径状态,因为在接口中无法再次重新生成控制任务 if (!mMANAGE_MAIN.MANAGE_TYPE_CODE.Contains("Manage"))//&& mMANAGE_MAIN.MANAGE_TYPE_CODE != "ManagePreIn"&& mMANAGE_MAIN.MANAGE_TYPE_CODE != "ManagePreOut"&& mMANAGE_MAIN.MANAGE_TYPE_CODE!= "ManageException") { bResult = _controlRepository.GetControlRoutes(mSTART_CELL.DEVICE_CODE, mEND_CELL.DEVICE_CODE) .Count > 0; if (!bResult) { sResult = $"{mSTART_CELL.CELL_CODE}-{mEND_CELL.CELL_CODE} have no path available,Please check the device status in WCS!"; return false; } } #endregion ////路径校验 //if (mMANAGE_MAIN.MANAGE_TYPE_CODE != "ManageMove") //{ // bResult = _controlRepository.GetControlRoutes(mSTART_CELL.DEVICE_CODE, mEND_CELL.DEVICE_CODE).Count > 0; // if (!bResult) // { // sResult = $"{mSTART_CELL.CELL_CODE}-{mEND_CELL.CELL_CODE}之间无可用路径,请检查设备状态!"; // return bResult; // } //} MANAGE_LIST bucketList = _manageRepository.GetManageList(mMANAGE_MAIN.MANAGE_ID)[0]; IO_CONTROL mIO_CONTROL = _controlRepository.GetIoControl(mMANAGE_MAIN.MANAGE_ID); bResult = null == mIO_CONTROL; if (!bResult) { sResult = $"{mMANAGE_MAIN.STOCK_BARCODE}'s control task already exists!"; return bResult; } int CONTROL_TASK_TYPE = 0; mIO_CONTROL = new IO_CONTROL(); string IN_OUT_TYPE = $"{mSTART_CELL.CELL_TYPE}-{mEND_CELL.CELL_TYPE}".ToLower(); switch (IN_OUT_TYPE) { case "station-cell"://站台-货位-入 CONTROL_TASK_TYPE = Convert.ToInt32(Helper.CONTROL_TYPE.Up.ToString("d")); break; case "cell-station"://货位-站台-出 CONTROL_TASK_TYPE = Convert.ToInt32(Helper.CONTROL_TYPE.Down.ToString("d")); break; case "cell-cell"://货位-货位-移 CONTROL_TASK_TYPE = Convert.ToInt32(Helper.CONTROL_TYPE.Move.ToString("d")); break; case "station-station"://站台-站台-移 CONTROL_TASK_TYPE = Convert.ToInt32(Helper.CONTROL_TYPE.MoveStation.ToString("d")); break; } mIO_CONTROL.RELATIVE_CONTROL_ID = -1; mIO_CONTROL.MANAGE_ID = mMANAGE_MAIN.MANAGE_ID; mIO_CONTROL.STOCK_BARCODE = mMANAGE_MAIN.STOCK_BARCODE; //mIO_CONTROL.CELL_GROUP = mEND_CELL.CELL_GROUP; mIO_CONTROL.CONTROL_TASK_LEVEL = string.IsNullOrEmpty(mMANAGE_MAIN.MANAGE_LEVEL) ? "0" : mMANAGE_MAIN.MANAGE_LEVEL; mIO_CONTROL.PRE_CONTROL_STATUS = string.Empty; mIO_CONTROL.CONTROL_TASK_TYPE = CONTROL_TASK_TYPE; mIO_CONTROL.START_DEVICE_CODE = mSTART_CELL.CELL_CODE; mIO_CONTROL.END_DEVICE_CODE = mEND_CELL.CELL_CODE; mIO_CONTROL.CONTROL_BEGIN_TIME = Helper.StringFormat.GetCurDateTimeString();//当前系统时间 //单叉状态25 双叉状态0 string.IsNullOrEmpty(mMANAGE_MAIN.MANAGE_FORK) || !mMANAGE_MAIN.MANAGE_FORK.Equals("1") ? 0 : 25; if (!string.IsNullOrEmpty(mMANAGE_MAIN.MANAGE_LEVEL) && mMANAGE_MAIN.MANAGE_LEVEL.Trim().Equals("fabricate_waiting_for_earlier_request_finishing")) { mIO_CONTROL.CONTROL_STATUS = 1024; } else { mIO_CONTROL.CONTROL_STATUS = mMANAGE_MAIN.MANAGE_REMARK == "Block" ? 233 : 0; } mIO_CONTROL.CONTROL_REMARK = mMANAGE_MAIN.MANAGE_REMARK;//出库任务用来传输最终站台 mIO_CONTROL.START_WAREHOUSE_CODE = "1"; mIO_CONTROL.END_WAREHOUSE_CODE = "1"; mIO_CONTROL.CELL_GROUP = "0"; mIO_CONTROL.RF_DATA = "0"; mIO_CONTROL.UNLOADING_TASK_COUNT = Convert.ToInt32(bucketList.GOODS_PROPERTY8);//tlt20230717:设置当前的出库任务数量 //mIO_CONTROL.CONTROL_REMARK = bucketList.BUCKET_TRANSACTION_NUMBER; //添加控制任务 bResult = _controlRepository.AddIoControl(mIO_CONTROL); if (bResult) { _logger.LogInformation( $"Create Control task Success! Control_ID {mIO_CONTROL.CONTROL_ID} " + $"bucketId:{mIO_CONTROL.STOCK_BARCODE};" + $"Start position :{mIO_CONTROL.START_DEVICE_CODE};" + $"End position:{mIO_CONTROL.END_DEVICE_CODE};" + $"RFID string:{mIO_CONTROL.RF_DATA}\r\n"); mMANAGE_MAIN.MANAGE_STATUS = Helper.MANAGE_STATUS.WaitingExecute.ToString(); mMANAGE_MAIN.MANAGE_BEGIN_TIME = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); _manageRepository.UpdateManageMain(mMANAGE_MAIN); } else { _logger.LogInformation( $"Create Control task Failed! Control_ID {mIO_CONTROL.CONTROL_ID} " + $"bucketId:{mIO_CONTROL.STOCK_BARCODE};" + $"Start position :{mIO_CONTROL.START_DEVICE_CODE};" + $"End position:{mIO_CONTROL.END_DEVICE_CODE};" + $"RFID string:{mIO_CONTROL.RF_DATA}\r\n"); } return true; } } } }