diff --git a/NewWMSProject/src/NewWMSProject/NewWMSProject.csproj b/NewWMSProject/src/NewWMSProject/NewWMSProject.csproj index aca1651..7a1552d 100644 --- a/NewWMSProject/src/NewWMSProject/NewWMSProject.csproj +++ b/NewWMSProject/src/NewWMSProject/NewWMSProject.csproj @@ -1,4 +1,4 @@ - + net8.0 @@ -7,6 +7,7 @@ + diff --git a/NewWMSWebAPI/Helper/Appsettings.cs b/NewWMSWebAPI/Helper/Appsettings.cs new file mode 100644 index 0000000..4bdcda6 --- /dev/null +++ b/NewWMSWebAPI/Helper/Appsettings.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Configuration.Json; + +namespace NewWMSWebAPI.Helper +{ + public class Appsettings + { + /// + /// appsettings.json操作类 + /// + static IConfiguration Configuration { get; set; } + static string contentPath { get; set; } + + public Appsettings(string contentPath) + { + string Path = "appsettings.json"; + + //如果你把配置文件 是 根据环境变量来分开了,可以这样写 + //Path = $"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json"; + + Configuration = new ConfigurationBuilder() + .SetBasePath(contentPath) + .Add(new JsonConfigurationSource { Path = Path, Optional = false, ReloadOnChange = true })//这样的话,可以直接读目录里的json文件,而不是 bin 文件夹下的,所以不用修改复制属性 + .Build(); + } + + public Appsettings(IConfiguration configuration) + { + Configuration = configuration; + } + + public static string app(string sections) + { + try + { + return Configuration[sections]; + } + catch (Exception) + { + return ""; + } + } + + /// + /// 封装要操作的字符 + /// + /// 节点配置 + /// + public static string app(params string[] sections) + { + try + { + if (sections.Any()) + { + return Configuration[string.Join(":", sections)]; + } + } + catch (Exception) { } + + return ""; + } + + /// + /// 返回实体对象 + /// + /// + /// + /// + public static T app(string sections) + { + return Configuration.GetSection(sections).Get(); + } + + /// + /// 递归获取配置信息数组 + /// + /// + /// + /// + public static List app(params string[] sections) + { + List list = new List(); + Configuration.Bind(string.Join(":", sections), list); + return list; + } + } + + } diff --git a/NewWMSWebAPI/Helper/Enum.cs b/NewWMSWebAPI/Helper/Enum.cs new file mode 100644 index 0000000..6f5212f --- /dev/null +++ b/NewWMSWebAPI/Helper/Enum.cs @@ -0,0 +1,581 @@ +using System; +using System.Collections.Generic; + +using System.Text; + +namespace NewWMSWebAPI.Helper +{ + #region ------FLAG + + /// + /// 激活或非激活标识 + /// + public enum FLAG + { + /// + /// 激活 + /// + Enable = 1, + /// + /// 非激活 + /// + DisEnable = 0 + } + + #endregion + + + public enum CONTROL_TYPE + { + Up = 1, + Down = 2, + Move = 3, + MoveStation = 4 + } + + public enum OPERATIONAL_STATUS + { + Online , + Offline + } + + public enum STACKER_STATUS + { + Offline, + Idle, + Faulted, + InCycle + } + + #region ------PLAN + + /// + /// 计划类型分组 + /// + public enum PLAN_TYPE_GROUP + { + /// + /// 仓储类 + /// + StoreGroup = 1, + /// + /// 工位类 + /// + WorkStationGroup = 2, + /// + /// 生产装配类 + /// + ProduceGroup = 3 + } + + /// + /// 计划状态 + /// + public enum PLAN_STATUS + { + + /// + /// MES创建 + /// + Saved, + /// + /// 等待执行 + /// + Waiting, + /// + /// 清线中 + /// + Clearing, + /// + /// 执行中 + /// + Executing, + /// + /// 暂停 + /// + Pause, + /// + /// 删除 + /// + Delete, + /// + /// 终止 + /// + Stop, + /// + /// 等待排产 + /// + RouteWaiting, + /// + /// 等待生产 + /// + ProduceWaiting, + /// + /// 执行生产 + /// + ProduceExecuting, + /// + /// 暂停生产 + /// + ProducePause, + /// + /// 完成 + /// + Complete, + /// + /// 审核完毕 + /// + Finish + } + + /// + /// 工艺流程任务类型 + /// + public enum PLAN_INOUT + { + /// + /// 入库 + /// + In = 1, + /// + /// 出库 + /// + Out = 2, + /// + /// 移库 + /// + Move = 3, + /// + /// 拣选,回流 + /// + Sort = 4 + } + + #endregion + + #region ------MANAGE------CONTROL + + /// + /// 管理任务类型 + /// + public enum MANAGE_TYPE + { + //入库 + IN = 101, + //出库 + OUT = 201, + //配盘 + BINDING = 301, + //取消配盘 + CANCLEBINDING = 302, + //移库 + MOVE = 303, + //上架 + UP = 401, + //搬运容器上架 + UPPALLET = 402, + //下架 + DOWN = 501, + //搬运容器下架 + DOWNPALLET = 502 + } + + /// + /// 任务状态 + /// + public enum MANAGE_STATUS + { + //WaitingSend, + //WaitingExecute, + //Waitting, + //Error, + //Cancel, + //Complete, + //Executing = 10, + //WaitConfirm = 20, + //ConfirmFinish = 30, + /// + /// 等待发送 + /// + WaitingSend, + /// + /// 等待执行 + /// + WaitingExecute, + /// + /// 监控任务获取 + /// + OrderCatched, + /// + /// 执行中 + /// + Executing, + /// + /// 调度删除任务 + /// + Cancel, + /// + /// 设备错误 + /// + Error, + /// + /// 输送完成 + /// + Complete, + /// + /// 异常完成 + /// + ExceptionComplete, + /// + /// 等待确认 + /// + WaitingConfirm, + /// + /// 任务完成 + /// + LogicFinish, + /// + /// 逻辑完成异常 + /// + LogicError + } + + /// + /// 控制任务状态 + /// + public enum CONTROL_STATUS + { + /// + /// 等待 + /// + Wait = 0, + /// + /// 设备错误 + /// + DeviceError = 3, + /// + /// 调度已经获取任务 + /// + Control_Readed = 7, + /// + /// 开始运行 + /// + Runing = 10, + /// + /// 堆垛机运行 + /// + DeviceRuning = 11, + /// + /// 调度申请改道 + /// + LterRouteApply = 30, + /// + /// 管理答复改道申请 + /// + LterRouteReplay = 40, + /// + /// 异常完成 + /// + TaskAbend = 990, + /// + /// 任务被删除 + /// + TaskDelete = 900, + /// + /// 堆垛机的取空处理 + /// + EmptyOutPut = 980, + /// + /// 堆垛机的送货重需要改路径处理 + /// + RepeatInput = 970, + /// + /// 任务完成 + /// + Finish = 999 + } + + /// + /// 指令申请状态 + /// + public enum CONTROL_APPLY_STATUS + { + /// + /// 等待 + /// + Waiting = 0, + /// + /// 读取 + /// + Read = 1, + /// + /// 完成 + /// + Finish = 2, + /// + /// 异常 + /// + Error = 3 + } + + #endregion + + #region ------WAREHOUSE + + /// + /// 库区类型 + /// + public enum AREA_TYPE + { + /// + /// 立库 + /// + LiKu, + /// + /// 虚拟库/平库 + /// + XuNiKu + } + + /// + /// 货位类型 + /// + public enum CELL_TYPE + { + /// + /// 货位 + /// + Cell, + /// + /// 站台/输送台 + /// + Station, + /// + /// 异常站台/工位 + /// + ErrorStation, + /// + /// 生产工位 + /// + WorkStation + } + + /// + /// 货位存储类型 + /// + public enum CELL_STORAGE_TYPE + { + /// + /// 存储单托盘 + /// + SinglePallet, + /// + /// 存储多托盘 + /// + Multiple + + } + + /// + /// 货位类别 + /// + public enum CELL_FORK_TYPE + { + /// + /// 普通 + /// + Normal, + /// + /// 双伸 + /// + Double, + /// + /// 双叉 + /// + Multi + } + + /// + /// 货位任务类型 + /// + public enum CELL_INOUT + { + /// + /// 入 + /// + In = 1, + /// + /// 出 + /// + Out = 2, + /// + /// 可入可出 + /// + InOut = 3 + } + + /// + /// 货位存储状态 + /// + public enum CELL_STATUS + { + /// + /// 满货 + /// + Full, + /// + /// 有货 + /// + Have, + /// + /// 无货 + /// + Nohave, + /// + /// 空托盘 + /// + Pallet, + /// + /// 异常货位 + /// + Exception, + + /// + /// 禁用 + /// + Forbiden + } + + /// + /// 货位运行状态 + /// + public enum RUN_STATUS + { + /// + /// 禁用 + /// + Disable, + /// + /// 待用 + /// + Enable, + /// + /// 运行 + /// + Run, + /// + /// 选定 + /// + Selected + } + + /// + /// 任务执行的设备类型 + /// + public enum DEVICE_TYPE + { + /// + /// 系统设备 + /// + system, + /// + /// 自动设备 + /// + auto, + /// + /// AGV设备 + /// + agv + } + #endregion + + #region -----PRODUCE + + /// + /// 物料状态 + /// + public enum GOODS_STATUS + { + /// + /// 待加工 + /// + Waiting = 1, + /// + /// 执行中 + /// + Executing = 2, + /// + /// 工序完工 + /// + Finish = 3, + /// + /// 制件完工 + /// + Complet = 4 + } + + /// + /// 工作模式:串行模式或并行模式 + /// + public enum WORK_MODE + { + /// + /// 串行 + /// + Serial = 1, + /// + /// 并行 + /// + Parallel = 2 + } + + /// + /// 排产状态 + /// + public enum ROUTE_STATUS + { + /// + /// 等待排产 + /// + Waiting, + /// + /// 排产执行 + /// + Executing, + /// + /// 排产暂停 + /// + Pause, + /// + /// 排产停止 + /// + Stop, + /// + /// 排产完成 + /// + Finish + } + + /// + /// 工位操作模式 + /// + public enum STATION_OP_MODE + { + /// + /// 送料模式 + /// + Send = 1, + + /// + /// 生产模式 + /// + Produce = 2, + + /// + /// 回库模式 + /// + Back = 3 + } + + #endregion +} diff --git a/NewWMSWebAPI/Helper/JsonPolicy.cs b/NewWMSWebAPI/Helper/JsonPolicy.cs new file mode 100644 index 0000000..e4ffea5 --- /dev/null +++ b/NewWMSWebAPI/Helper/JsonPolicy.cs @@ -0,0 +1,14 @@ +using System.Text.Json; + +namespace NewWMSWebAPI.Helper +{ + public class JsonPolicy + { + public class UpperCaseNamingPolicy : JsonNamingPolicy + { + public override string ConvertName(string name) => + name.ToUpper(); + + } + } +} \ No newline at end of file diff --git a/NewWMSWebAPI/Helper/SnowFlake.cs b/NewWMSWebAPI/Helper/SnowFlake.cs new file mode 100644 index 0000000..65dc3ce --- /dev/null +++ b/NewWMSWebAPI/Helper/SnowFlake.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NewWMSWebAPI.Helper +{ + /// + /// 雪花算法生成唯一ID + /// + public class SnowFlake + { + public class SnowflakeIDcreator + { + private static long workerId = 1; //机器ID + private static long twepoch = 68020L; //唯一时间,这是一个避免重复的随机量,自行设定不要大于当前时间戳 + private static long sequence = 0L; + private static int workerIdBits = 4; //机器码字节数。4个字节用来保存机器码(定义为Long类型会出现,最大偏移64位,所以左移64位没有意义) + private static long maxWorkerId = -1L ^ -1L << workerIdBits; //最大机器ID + private static int sequenceBits = 10; //计数器字节数,10个字节用来保存计数码 + private static int workerIdShift = sequenceBits; //机器码数据左移位数,就是后面计数器占用的位数 + private static int timestampLeftShift = sequenceBits + workerIdBits; //时间戳左移动位数就是机器码和计数器总字节数 + private static long sequenceMask = -1L ^ -1L << sequenceBits; //一微秒内可以产生计数,如果达到该值则等到下一微妙在进行生成 + private static long lastTimestamp = -1L; + private static object lockObj = new object(); + + /// + /// 设置机器码 + /// + /// 机器码 + public static void SetWorkerID(long id) + { + SnowflakeIDcreator.workerId = id; + } + + public static long nextId() + { + lock (lockObj) + { + long timestamp = timeGen(); + if (lastTimestamp == timestamp) + { //同一微秒中生成ID + SnowflakeIDcreator.sequence = (SnowflakeIDcreator.sequence + 1) & SnowflakeIDcreator.sequenceMask; //用&运算计算该微秒内产生的计数是否已经到达上限 + if (SnowflakeIDcreator.sequence == 0) + { + //一微妙内产生的ID计数已达上限,等待下一微妙 + timestamp = tillNextMillis(lastTimestamp); + } + } + else + { //不同微秒生成ID + SnowflakeIDcreator.sequence = 0; //计数清0 + } + if (timestamp < lastTimestamp) + { //如果当前时间戳比上一次生成ID时时间戳还小,抛出异常,因为不能保证现在生成的ID之前没有生成过 + throw new Exception(string.Format("Clock moved backwards. Refusing to generate id for {0} milliseconds", + lastTimestamp - timestamp)); + } + lastTimestamp = timestamp; //把当前时间戳保存为最后生成ID的时间戳 + long nextId = (timestamp - twepoch << timestampLeftShift) | SnowflakeIDcreator.workerId << SnowflakeIDcreator.workerIdShift | SnowflakeIDcreator.sequence; + return nextId; + } + } + + /// + /// 获取下一微秒时间戳 + /// + /// + /// + private static long tillNextMillis(long lastTimestamp) + { + long timestamp = timeGen(); + while (timestamp <= lastTimestamp) + { + timestamp = timeGen(); + } + return timestamp; + } + + /// + /// 生成当前时间戳 + /// + /// + private static long timeGen() + { + return (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds; + } + } + + } +} diff --git a/NewWMSWebAPI/Helper/StringFormat.cs b/NewWMSWebAPI/Helper/StringFormat.cs new file mode 100644 index 0000000..9a33b5b --- /dev/null +++ b/NewWMSWebAPI/Helper/StringFormat.cs @@ -0,0 +1,49 @@ +using System; + +namespace NewWMSWebAPI.Helper +{ + public class StringFormat + { + public static string GetDateTime() + { + return System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + } + + public static string GetGUID() + { + return System.Guid.NewGuid().ToString(); + } + + /// + /// 获得IP地址 + /// + /// + public static string GetIpAddr() + { + return System.Net.Dns.GetHostAddresses(Environment.MachineName)[0].ToString(); + } + + /// + /// 获得计算机名 + /// + /// + public static string GetHostName() + { + return System.Net.Dns.GetHostName().ToString(); + } + + public static string GetCurDateTimeString() + { + return System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + } + + /// + /// 获得日期 + /// + /// + public static string GetCurDateString() + { + return System.DateTime.Now.ToString("yyyy-MM-dd"); + } + } +} \ No newline at end of file diff --git a/NewWMSWebAPI/NewWMSWebAPI.csproj b/NewWMSWebAPI/NewWMSWebAPI.csproj index 5419ef0..7e3a1bb 100644 --- a/NewWMSWebAPI/NewWMSWebAPI.csproj +++ b/NewWMSWebAPI/NewWMSWebAPI.csproj @@ -1,4 +1,4 @@ - + net8.0 @@ -10,4 +10,12 @@ + + + + + + + + diff --git a/NewWMSWebAPI/TaskService/Implement/ManageHelper.cs b/NewWMSWebAPI/TaskService/Implement/ManageHelper.cs new file mode 100644 index 0000000..b5fcc3c --- /dev/null +++ b/NewWMSWebAPI/TaskService/Implement/ManageHelper.cs @@ -0,0 +1,370 @@ +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; + private readonly IControlHisRepository _controlHisRepository; + + public ManageHelper(ILogger logger, DmDBContext context, IManageRepository manageRepository, IWhCellRepository WhCellRepository, IStorageRepository storageRepository, IControlRepository controlRepository, IControlHisRepository controlHisRepository) + { + _logger = logger; + _context = context; + _manageRepository = manageRepository; + _whCellRepository = WhCellRepository; + _storageRepository = storageRepository; + _controlRepository = controlRepository; + _controlHisRepository = controlHisRepository; + + } + + /// + /// 创建移库任务 + /// + /// + /// + /// + /// + /// + /// + /// + /// + 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; + } + } + + } +} \ No newline at end of file diff --git a/NewWMSWebAPI/TaskService/Implement/ManagePreOut.cs b/NewWMSWebAPI/TaskService/Implement/ManagePreOut.cs new file mode 100644 index 0000000..3f3237e --- /dev/null +++ b/NewWMSWebAPI/TaskService/Implement/ManagePreOut.cs @@ -0,0 +1,462 @@ +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; + } + + } +} \ No newline at end of file diff --git a/NewWMSWebAPI/TaskService/Interface/IManageHelper.cs b/NewWMSWebAPI/TaskService/Interface/IManageHelper.cs new file mode 100644 index 0000000..5027d6d --- /dev/null +++ b/NewWMSWebAPI/TaskService/Interface/IManageHelper.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; + +using EFCoreDatabase.Entities; + + +namespace NewWMSWebAPI.TaskService.Interface +{ + public interface IManageHelper + { + public bool ManageMoveTaskCreate(MANAGE_MAIN mMANAGE_MAIN, + List lsMANAGE_LIST, + bool bTrans, + bool bComplete, + bool bAutoSendControl, + out string sResult); + + public bool ManageDownLoad(string stockBarcode, bool bTrans, out string sResult); + } +} \ No newline at end of file diff --git a/NewWMSWebAPI/TaskService/Interface/IManagePreOut.cs b/NewWMSWebAPI/TaskService/Interface/IManagePreOut.cs new file mode 100644 index 0000000..b9b50f4 --- /dev/null +++ b/NewWMSWebAPI/TaskService/Interface/IManagePreOut.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using Michelin_WebAPI.Entities; + +namespace Michelin_WebAPI.TaskServices.Interface +{ + public interface IManagePreOut + { + public bool FabricateListCreate(List manageMains,out string sResult); + public bool ManageCreate(MANAGE_MAIN mMANAGE_MAIN, List lsMANAGE_LIST, bool bTrans, + bool bAutoSendControl, bool bComplete, out string sResult); + + } +} \ No newline at end of file