using AUCMA.STORE.Business.Implements; using AUCMA.STORE.Business.Interface; using AUCMA.STORE.Common; using AUCMA.STORE.Entity.DAO; using AUCMA.STORE.Entity.DTO; using AUCMA.STORE.Entity.Enums; using AUCMA.STORE.SqlSugar; using AUCMA.STORE.SqlSugar.serviceImpl; using AutoMapper; using HslCommunication.Core; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; #region << 版 本 注 释 >> /*-------------------------------------------------------------------- * 版权所有 (c) 2024 WenJY 保留所有权利。 * CLR版本:4.0.30319.42000 * 机器名称:T14-GEN3-7895 * 命名空间:AUCMA.STORE.Business * 唯一标识:ff279f65-fbfa-4688-8560-d0bf2051cd85 * * 创建者:WenJY * 电子邮箱: * 创建时间:2024-12-22 14:41:08 * 版本:V1.0.0 * 描述: * *-------------------------------------------------------------------- * 修改人: * 时间: * 修改说明: * * 版本:V1.0.0 *--------------------------------------------------------------------*/ #endregion << 版 本 注 释 >> namespace AUCMA.STORE.Business { public class TaskHandleBusiness { private List m_DeviceInfoList = new List(); private PLCAddressTypeDTO[] ReadOnePilerPlcAddress = new PLCAddressTypeDTO[20]; private PLCAddressTypeDTO[] ReadRGVPlcAddress = new PLCAddressTypeDTO[8]; private PLCAddressTypeDTO[] WriteRGVPlcAddress = new PLCAddressTypeDTO[7]; private IBaseTaskQueueBusiness baseTaskQueueBusiness = new BaseTaskQueueBusiness(); private OutStoreBusinessImpl outStoreBusiness = new OutStoreBusinessImpl(); private IByteTransform byteTransform = new RegularByteTransform(); public delegate void TaskInfoInvoke(int TaskNo, TaskType taskType, LocationArea locationArea, string locationCode); public event TaskInfoInvoke TaskInfoRefreshEvent; private static TaskHandleBusiness _singleton; private static readonly object _object = new object(); private TaskHandleBusiness() { } public static TaskHandleBusiness GetInstance() { if (_singleton == null) { lock (_object) { if (_singleton == null) { _singleton = new TaskHandleBusiness(); } } } return _singleton; } /// /// 初始化 /// /// /// /// /// public void Init(List deviceInfos, PLCAddressTypeDTO[] _ReadOnePilerPlcAddress, PLCAddressTypeDTO[] _ReadRGVPlcAddress, PLCAddressTypeDTO[] _WriteRGVPlcAddress) { m_DeviceInfoList = deviceInfos; ReadOnePilerPlcAddress = _ReadOnePilerPlcAddress; ReadRGVPlcAddress = _ReadRGVPlcAddress; WriteRGVPlcAddress = _WriteRGVPlcAddress; Task.Run(() => { while (true) { LeftPilerTaskHandle(); Task.Delay(5000).Wait(); } }); Task.Run(() => { while (true) { RightPilerTaskHandle(); Task.Delay(5000).Wait(); } }); } /// /// 左库出入库逻辑处理 /// private void LeftPilerTaskHandle() { try { BaseDeviceInfo item = m_DeviceInfoList.Where(x => x.m_iDeviceId == 1002).FirstOrDefault(); BaseDeviceInfo rgvDeviceInfo = m_DeviceInfoList.Where(x => x.m_iDeviceId == 1001).FirstOrDefault(); int PilerState = item.m_IDeviceAdapter.ReadInt16ByAddress(ReadOnePilerPlcAddress[2].PLCAddress); int iReadIsReadySignal = item.m_IDeviceAdapter.ReadInt16ByAddress(ReadOnePilerPlcAddress[8].PLCAddress); if (PilerState == 0 && iReadIsReadySignal == 2) { LogHelper.LeftPilerlog($"左库==>{item.m_iDeviceId}堆垛机:{item.m_plcName};{ReadOnePilerPlcAddress[2].PLCAddress}:{PilerState};{ReadOnePilerPlcAddress[8].PLCAddress}:{iReadIsReadySignal};当前空闲并且准备就绪可以下发任务"); int iReadOutForkSignal = rgvDeviceInfo.m_IDeviceAdapter.ReadInt16ByAddress(ReadRGVPlcAddress[2].PLCAddress); if (iReadOutForkSignal != 1) { LogHelper.LeftPilerlog($"左库==>出库口状态:{iReadOutForkSignal};出库皮带空闲可以出库"); //出库 byte[] outStoreBuffer = GetOutStoreTask(item.m_iDeviceId, out string outStoreTaskCode, out BaseTaskQueue baseTaskQueue,LocationArea.Location_Left); if (outStoreBuffer != null) { SendBufferToLeftPiler(item, rgvDeviceInfo, outStoreBuffer, outStoreTaskCode, true); UpdateLocationStatus("A", LocationArea.Location_Left, $"{baseTaskQueue.pilerClaimGoodsRows}-{baseTaskQueue.pilerClaimGoodsLine}-{baseTaskQueue.pilerClaimGoodsTier}", LocationStatus.UnUsed); TaskInfoRefreshEvent?.Invoke(Convert.ToInt32(outStoreTaskCode), TaskType.OutStore, LocationArea.Location_Left, $"{baseTaskQueue.pilerClaimGoodsRows}-{baseTaskQueue.pilerClaimGoodsLine}-{baseTaskQueue.pilerClaimGoodsTier}"); return; } else { LogHelper.LeftPilerlog($"左库==>当前没有可执行的出库任务"); } } else { LogHelper.LeftPilerlog($"左库==>出库口状态:{iReadOutForkSignal};出库皮带占用不具备出库条件"); } var inStoreBuffer = GetInStoreTaskInfo(item.m_iDeviceId, out string inStoreTaskCode,out BaseTaskQueue taskQueue); if(inStoreBuffer != null) { LogHelper.LeftPilerlog($"左库==>存在入库任务,进行入库操作,任务号:{inStoreTaskCode}"); SendBufferToLeftPiler(item, rgvDeviceInfo, inStoreBuffer, inStoreTaskCode, false); UpdateLocationStatus("A", LocationArea.Location_Left, $"{taskQueue.pilerUnloadRows}-{taskQueue.pilerUnloadLine}-{taskQueue.pilerUnloadTier}", LocationStatus.InUse); TaskInfoRefreshEvent?.Invoke(Convert.ToInt32(inStoreTaskCode), TaskType.InStore, LocationArea.Location_Left, $"{taskQueue.pilerUnloadRows}-{taskQueue.pilerUnloadLine}-{taskQueue.pilerUnloadTier}"); } } else { LogHelper.LeftPilerlog($"左库==>{item.m_iDeviceId}堆垛机:{item.m_plcName};{ReadOnePilerPlcAddress[2].PLCAddress}:{PilerState};{ReadOnePilerPlcAddress[8].PLCAddress}:{iReadIsReadySignal};当前状态不满足无法下发任务"); } } catch (Exception ex) { LogHelper.LeftPilerlog($"左库出入库逻辑处理异常:{ex.Message}"); } } /// /// 右库出入库逻辑处理 /// private void RightPilerTaskHandle() { try { BaseDeviceInfo item = m_DeviceInfoList.Where(x => x.m_iDeviceId == 1003).FirstOrDefault(); BaseDeviceInfo rgvDeviceInfo = m_DeviceInfoList.Where(x => x.m_iDeviceId == 1001).FirstOrDefault(); int PilerState = item.m_IDeviceAdapter.ReadInt16ByAddress(ReadOnePilerPlcAddress[2].PLCAddress); int iReadIsReadySignal = item.m_IDeviceAdapter.ReadInt16ByAddress(ReadOnePilerPlcAddress[8].PLCAddress); if (PilerState == 0 && iReadIsReadySignal == 2) { LogHelper.RightPilerlog($"右库==>{item.m_iDeviceId}堆垛机:{item.m_plcName};{ReadOnePilerPlcAddress[2].PLCAddress}:{PilerState};{ReadOnePilerPlcAddress[8].PLCAddress}:{iReadIsReadySignal};当前空闲并且准备就绪可以下发任务"); int iReadOutForkSignal = rgvDeviceInfo.m_IDeviceAdapter.ReadInt16ByAddress(ReadRGVPlcAddress[3].PLCAddress); if (iReadOutForkSignal != 1) { LogHelper.RightPilerlog($"右库==>出库口状态:{iReadOutForkSignal};出库皮带空闲可以出库"); byte[] outStoreBuffer = GetOutStoreTask(item.m_iDeviceId, out string outStoreTaskCode, out BaseTaskQueue baseTaskQueue, LocationArea.Location_Right); if (outStoreBuffer != null) { SendBufferToRightPiler(item, rgvDeviceInfo, outStoreBuffer, outStoreTaskCode, true); UpdateLocationStatus("A", LocationArea.Location_Right, $"{baseTaskQueue.pilerClaimGoodsRows}-{baseTaskQueue.pilerClaimGoodsLine}-{baseTaskQueue.pilerClaimGoodsTier}", LocationStatus.UnUsed); TaskInfoRefreshEvent?.Invoke(Convert.ToInt32(outStoreTaskCode), TaskType.OutStore, LocationArea.Location_Right, $"{baseTaskQueue.pilerClaimGoodsRows}-{baseTaskQueue.pilerClaimGoodsLine}-{baseTaskQueue.pilerClaimGoodsTier}"); return; } else { LogHelper.RightPilerlog($"右库==>当前没有可执行的出库任务"); } } else { LogHelper.RightPilerlog($"右库==>出库口状态:{iReadOutForkSignal};出库皮带占用不具备出库条件"); } var inStoreBuffer = GetInStoreTaskInfo(item.m_iDeviceId, out string inStoreTaskCode,out BaseTaskQueue taskQueue); if(inStoreBuffer != null) { LogHelper.LeftPilerlog($"右库==>存在入库任务,进行入库操作,任务号:{inStoreTaskCode}"); SendBufferToRightPiler(item, rgvDeviceInfo, inStoreBuffer, inStoreTaskCode, false); UpdateLocationStatus("A", LocationArea.Location_Right, $"{taskQueue.pilerUnloadRows}-{taskQueue.pilerUnloadLine}-{taskQueue.pilerUnloadTier}", LocationStatus.InUse); TaskInfoRefreshEvent?.Invoke(Convert.ToInt32(inStoreTaskCode), TaskType.InStore, LocationArea.Location_Right, $"{taskQueue.pilerUnloadRows}-{taskQueue.pilerUnloadLine}-{taskQueue.pilerUnloadTier}"); } } else { LogHelper.RightPilerlog($"右库==>{item.m_iDeviceId}堆垛机:{item.m_plcName};{ReadOnePilerPlcAddress[2].PLCAddress}:{PilerState};{ReadOnePilerPlcAddress[8].PLCAddress}:{iReadIsReadySignal};当前状态不满足无法下发任务"); } } catch (Exception ex) { LogHelper.RightPilerlog($"右库出入库逻辑处理异常:{ex.Message}"); } } /// /// 发送左库堆垛机任务 /// /// /// /// /// /// private void SendBufferToLeftPiler(BaseDeviceInfo item, BaseDeviceInfo rgvDeviceInfo, byte[] buffer, string taskCode, bool isOut = true) { try { bool isSend = false; do { if (item.m_IDeviceAdapter.WriteByteByAddress("DB11.0", buffer)) { LogHelper.LeftPilerlog($"左库==>任务:{taskCode};写入PLC成功"); //读取堆垛机任务号 bool isSuc = true; do { var pilerTaskCode = item.m_IDeviceAdapter.ReadInt32ByAddress(ReadOnePilerPlcAddress[0].PLCAddress).ToString(); LogHelper.LeftPilerlog($"左库==>堆垛机当前任务号:{pilerTaskCode};上位机下发任务号:{taskCode}"); if (pilerTaskCode == taskCode) { LogHelper.LeftPilerlog($"左库==>堆垛机当前任务号:{pilerTaskCode};与下发任务号:{taskCode};一致"); if (isOut) { bool isRgvSend = rgvDeviceInfo.m_IDeviceAdapter.WriteInt16ByAddress(WriteRGVPlcAddress[5].PLCAddress, "1"); if (isRgvSend) { LogHelper.LeftPilerlog($"左库==>RGV任务下发成功;{WriteRGVPlcAddress[5].PLCAddress}:1"); } else { LogHelper.LeftPilerlog($"左库==>RGV任务下发失败;"); } } isSuc = false; } else { LogHelper.LeftPilerlog($"左库==>堆垛机当前任务号:{pilerTaskCode};与下发任务号:{taskCode};不一致"); Task.Delay(1000).Wait(); } } while (isSuc); isSend = true; } else { LogHelper.LeftPilerlog($"左库==>任务:{taskCode};写入PLC失败"); } } while (!isSend); } catch (Exception ex) { LogHelper.LeftPilerlog($"左库==>任务下发至堆垛机逻辑处理异常:{ex.Message}"); } } /// /// 发送右库堆垛机任务 /// /// /// /// /// /// private void SendBufferToRightPiler(BaseDeviceInfo item,BaseDeviceInfo rgvDeviceInfo, byte[] buffer,string taskCode,bool isOut = true) { try { bool isSend = false; do { if (item.m_IDeviceAdapter.WriteByteByAddress("DB11.0", buffer)) { LogHelper.RightPilerlog($"右库==>任务:{taskCode};写入PLC成功"); //读取堆垛机任务号 bool isSuc = true; do { var pilerTaskCode = item.m_IDeviceAdapter.ReadInt32ByAddress(ReadOnePilerPlcAddress[0].PLCAddress).ToString(); LogHelper.RightPilerlog($"右库==>堆垛机当前任务号:{pilerTaskCode};上位机下发任务号:{taskCode}"); if (pilerTaskCode == taskCode) { LogHelper.RightPilerlog($"右库==>堆垛机当前任务号:{pilerTaskCode};与下发任务号:{taskCode};一致"); if (isOut) { bool isRgvSend = rgvDeviceInfo.m_IDeviceAdapter.WriteInt16ByAddress(WriteRGVPlcAddress[5].PLCAddress, "2"); if (isRgvSend) { LogHelper.RightPilerlog($"右库==>RGV任务下发成功;{WriteRGVPlcAddress[5].PLCAddress}:2"); } else { LogHelper.RightPilerlog($"右库==>RGV任务下发失败;"); } } isSuc = false; } else { LogHelper.RightPilerlog($"右库==>堆垛机当前任务号:{pilerTaskCode};与下发任务号:{taskCode};不一致"); Task.Delay(1000).Wait(); } } while (isSuc); isSend = true; } else { LogHelper.RightPilerlog($"右库==>任务:{taskCode};写入PLC失败"); } } while (!isSend); }catch(Exception ex) { LogHelper.RightPilerlog($"右库==>任务下发至堆垛机逻辑处理异常:{ex.Message}"); } } /// /// 获取出库任务 /// /// /// /// private byte[] GetOutStoreTask(int deviceId,out string taskCode,out BaseTaskQueue taskQueue,LocationArea locationArea) { lock (string.Empty) { taskCode = string.Empty; taskQueue = null; try { BaseTaskQueue baseTaskQueue = baseTaskQueueBusiness.GetTaskQueue(locationArea, TaskType.OutStore, OperationType.ManualOperation).Result; if (baseTaskQueue == null) { baseTaskQueue = baseTaskQueueBusiness.GetTaskQueue(locationArea, TaskType.OutStore, OperationType.Automatic).Result; } if (baseTaskQueue == null) { LogHelper.Pilerlog($"当前不存在出库任务"); return null; } LogHelper.Pilerlog($"获取出库任务,获取到出库任务:{baseTaskQueue.pilerTaskCode};任务信息:{JsonChange.ModeToJson(baseTaskQueue)}"); //LocationArea locationArea = LocationArea.Location_Left; //if (deviceId != 1) //{ // locationArea = LocationArea.Location_Right; //} Expression> exp = s1 => true; if(baseTaskQueue.operationType == OperationType.Automatic) { exp = exp.And(s1 => s1.materialType == baseTaskQueue.materialCode && s1.locationStatus == LocationStatus.InUse && s1.deleteFlag == Entity.Enums.DeleteFlag.No && s1.locationArea == locationArea && s1.storeCode == ConfigHelper.GetConfig("storeCode")); } else { exp = exp.And(s1 => s1.locationArea == baseTaskQueue.locationArea && s1.storeCode == baseTaskQueue.storeCode && s1.locationLine == baseTaskQueue.pilerClaimGoodsLine && s1.locationRow == baseTaskQueue.pilerClaimGoodsRows && s1.locationTier == baseTaskQueue.pilerClaimGoodsTier); } List locationInfos = new BaseServices().Query(exp).Result; var locationInfo = outStoreBusiness.FiltrateBestlocation(locationInfos); if (locationInfo == null) { LogHelper.Pilerlog($"出库任务:{baseTaskQueue.pilerTaskCode}未匹配到库位"); return null; } _ = baseTaskQueueBusiness.DeleteTaskQueue(baseTaskQueue); LogHelper.Pilerlog("移除出库任务队列信息:" + baseTaskQueue.pilerTaskCode); TaskInfoRefreshEvent?.Invoke(Convert.ToInt32(baseTaskQueue.pilerTaskCode), TaskType.OutStore, locationArea, locationInfo.locationCode); LogHelper.Pilerlog($"出库任务:{baseTaskQueue.pilerTaskCode}匹配的出库库位为:{JsonChange.ModeToJson(locationInfo)}"); Mapper.Initialize(cret => cret.CreateMap()); TaskDTO task = Mapper.Map(baseTaskQueue); task.locationCode = locationInfo.locationCode; task.row = locationInfo.locationRow; task.line = locationInfo.locationLine; task.tier = locationInfo.locationTier; task.plcCode = deviceId; task.pilerClaimGoodsRows = locationInfo.locationRow; task.pilerClaimGoodsLine = locationInfo.locationLine; task.pilerClaimGoodsTier = locationInfo.locationTier; if (locationInfo.locationArea == LocationArea.Location_Left) { if (ConfigHelper.GetConfig("storeCode") == "A") task.pilerUnloadRows = 2; if (ConfigHelper.GetConfig("storeCode") == "B") task.pilerUnloadRows = 1; } if (locationInfo.locationArea == LocationArea.Location_Right) { if (ConfigHelper.GetConfig("storeCode") == "A") task.pilerUnloadRows = 1; if (ConfigHelper.GetConfig("storeCode") == "B") task.pilerUnloadRows = 2; } Mapper.Initialize(cret => cret.CreateMap()); baseTaskQueue = Mapper.Map(task); Mapper.Initialize(cret => cret.CreateMap()); PlcDirectiveDTO taskDTO = Mapper.Map(baseTaskQueue); //读取到线体信号反馈 #region 将出库任务转换成字节发送 byte[] buffer = new byte[42]; taskDTO.inStorePlatformCode = 0; taskDTO.claimGoods = 0; taskDTO.unload = 0; taskDTO.outStorePlatformCode = 0; taskDTO.goodsSize = 0; taskDTO.goodsHeight = 0; taskDTO.goodsWeight = 0; taskDTO.trayCode = 0; taskDTO.takePutTheCar = 0; taskDTO.verify = 0; taskDTO.exitFork = 1; byte[] taskNo = StringChange.intToBytesBig(taskDTO.pilerTaskCode); taskNo.CopyTo(buffer, 0); byteTransform.TransByte((short)taskDTO.pilerTaskType).CopyTo(buffer, 4); Array.Reverse(buffer, 4, 2); byteTransform.TransByte((short)taskDTO.inStorePlatformCode).CopyTo(buffer, 6); Array.Reverse(buffer, 6, 2); byteTransform.TransByte((short)taskDTO.claimGoods).CopyTo(buffer, 8); Array.Reverse(buffer, 8, 2); byteTransform.TransByte((short)taskDTO.unload).CopyTo(buffer, 10); Array.Reverse(buffer, 10, 2); byteTransform.TransByte((short)taskDTO.outStorePlatformCode).CopyTo(buffer, 12); Array.Reverse(buffer, 12, 2); byteTransform.TransByte((short)taskDTO.pilerClaimGoodsRows).CopyTo(buffer, 14); Array.Reverse(buffer, 14, 2); byteTransform.TransByte((short)taskDTO.pilerClaimGoodsLine).CopyTo(buffer, 16); Array.Reverse(buffer, 16, 2); byteTransform.TransByte((short)taskDTO.pilerClaimGoodsTier).CopyTo(buffer, 18); Array.Reverse(buffer, 18, 2); byteTransform.TransByte((short)taskDTO.pilerUnloadRows).CopyTo(buffer, 20); Array.Reverse(buffer, 20, 2); byteTransform.TransByte((short)taskDTO.pilerUnloadLine).CopyTo(buffer, 22); Array.Reverse(buffer, 22, 2); byteTransform.TransByte((short)taskDTO.pilerUnloadTier).CopyTo(buffer, 24); Array.Reverse(buffer, 24, 2); byteTransform.TransByte((short)taskDTO.goodsSize).CopyTo(buffer, 26); Array.Reverse(buffer, 26, 2); byteTransform.TransByte((short)taskDTO.goodsHeight).CopyTo(buffer, 28); Array.Reverse(buffer, 28, 2); byteTransform.TransByte((short)taskDTO.goodsWeight).CopyTo(buffer, 30); Array.Reverse(buffer, 30, 2); byteTransform.TransByte((int)taskDTO.trayCode).CopyTo(buffer, 32); Array.Reverse(buffer, 32, 2); byteTransform.TransByte((short)taskDTO.takePutTheCar).CopyTo(buffer, 36); Array.Reverse(buffer, 36, 2); byteTransform.TransByte((byte)taskDTO.verify).CopyTo(buffer, 38); Array.Reverse(buffer, 38, 2); byteTransform.TransByte((short)taskDTO.exitFork).CopyTo(buffer, 40); Array.Reverse(buffer, 40, 2); #endregion taskCode = taskDTO.pilerTaskCode.ToString(); taskQueue = baseTaskQueue; TaskInfoRefreshEvent?.Invoke(Convert.ToInt32(baseTaskQueue.pilerTaskCode), TaskType.OutStore, locationArea, locationInfo.locationCode); UpdateLocationStatus("A", locationArea, locationInfo.locationCode, LocationStatus.Occupy); return buffer; } catch (Exception ex) { LogHelper.Pilerlog($"获取出库任务逻辑执行异常:{ex.Message}"); return null; } } } private byte[] GetInStoreTaskInfo(int deviceId, out string taskCode, out BaseTaskQueue taskQueue) { lock (string.Empty) { taskCode = string.Empty; taskQueue = null; try { LocationArea locationArea = LocationArea.Location_Left; if(deviceId != 1002) { locationArea = LocationArea.Location_Right; } BaseTaskQueue baseTaskQueue = baseTaskQueueBusiness.GetTaskQueue(locationArea, TaskType.InStore, OperationType.ManualOperation).Result; if (baseTaskQueue == null) { baseTaskQueue = baseTaskQueueBusiness.GetTaskQueue(locationArea, TaskType.InStore, OperationType.Automatic).Result; } if (baseTaskQueue != null) { LogHelper.Pilerlog($"入库任务:{baseTaskQueue.pilerTaskCode};内容:{JsonChange.ModeToJson(baseTaskQueue)}"); Mapper.Initialize(cret => cret.CreateMap()); PlcDirectiveDTO taskDTO = Mapper.Map(baseTaskQueue); LogHelper.Pilerlog($"入库任务:{baseTaskQueue.pilerTaskCode};映射为PlcDirectiveDTO"); #region 将入库任务转换成字节发送 byte[] buffer = new byte[42]; taskDTO.inStorePlatformCode = 0; taskDTO.claimGoods = 0; taskDTO.unload = 0; taskDTO.outStorePlatformCode = 0; taskDTO.goodsSize = 0; taskDTO.goodsHeight = 0; taskDTO.goodsWeight = 0; taskDTO.trayCode = 0; taskDTO.takePutTheCar = 0; taskDTO.verify = 0; taskDTO.exitFork = 1; byte[] taskNo = StringChange.intToBytesBig(taskDTO.pilerTaskCode); taskNo.CopyTo(buffer, 0); byteTransform.TransByte((short)taskDTO.pilerTaskType).CopyTo(buffer, 4); Array.Reverse(buffer, 4, 2); byteTransform.TransByte((short)taskDTO.inStorePlatformCode).CopyTo(buffer, 6); Array.Reverse(buffer, 6, 2); byteTransform.TransByte((short)taskDTO.claimGoods).CopyTo(buffer, 8); Array.Reverse(buffer, 8, 2); byteTransform.TransByte((short)taskDTO.unload).CopyTo(buffer, 10); Array.Reverse(buffer, 10, 2); byteTransform.TransByte((short)taskDTO.outStorePlatformCode).CopyTo(buffer, 12); Array.Reverse(buffer, 12, 2); byteTransform.TransByte((short)taskDTO.pilerClaimGoodsRows).CopyTo(buffer, 14); Array.Reverse(buffer, 14, 2); byteTransform.TransByte((short)taskDTO.pilerClaimGoodsLine).CopyTo(buffer, 16); Array.Reverse(buffer, 16, 2); byteTransform.TransByte((short)taskDTO.pilerClaimGoodsTier).CopyTo(buffer, 18); Array.Reverse(buffer, 18, 2); byteTransform.TransByte((short)taskDTO.pilerUnloadRows).CopyTo(buffer, 20); Array.Reverse(buffer, 20, 2); byteTransform.TransByte((short)taskDTO.pilerUnloadLine).CopyTo(buffer, 22); Array.Reverse(buffer, 22, 2); byteTransform.TransByte((short)taskDTO.pilerUnloadTier).CopyTo(buffer, 24); Array.Reverse(buffer, 24, 2); byteTransform.TransByte((short)taskDTO.goodsSize).CopyTo(buffer, 26); Array.Reverse(buffer, 26, 2); byteTransform.TransByte((short)taskDTO.goodsHeight).CopyTo(buffer, 28); Array.Reverse(buffer, 28, 2); byteTransform.TransByte((short)taskDTO.goodsWeight).CopyTo(buffer, 30); Array.Reverse(buffer, 30, 2); byteTransform.TransByte((int)taskDTO.trayCode).CopyTo(buffer, 32); Array.Reverse(buffer, 32, 2); byteTransform.TransByte((short)taskDTO.takePutTheCar).CopyTo(buffer, 36); Array.Reverse(buffer, 36, 2); byteTransform.TransByte((byte)taskDTO.verify).CopyTo(buffer, 38); Array.Reverse(buffer, 38, 2); byteTransform.TransByte((short)taskDTO.exitFork).CopyTo(buffer, 40); Array.Reverse(buffer, 40, 2); #endregion taskCode = taskDTO.pilerTaskCode.ToString(); taskQueue = baseTaskQueue; TaskInfoRefreshEvent?.Invoke(Convert.ToInt32(baseTaskQueue.pilerTaskCode), TaskType.InStore, locationArea, $"{taskQueue.pilerUnloadRows} - {taskQueue.pilerUnloadLine} - {taskQueue.pilerUnloadTier}"); bool res = baseTaskQueueBusiness.DeleteTaskQueue(baseTaskQueue).Result; LogHelper.Pilerlog($"入库任务:{baseTaskQueue.pilerTaskCode};移除"); UpdateLocationStatus("A", locationArea, $"{taskQueue.pilerUnloadRows}-{taskQueue.pilerUnloadLine}-{taskQueue.pilerUnloadTier}", LocationStatus.Occupy); return buffer; } else { LogHelper.Pilerlog($"入库任务为空"); return null; } } catch (Exception ex) { LogHelper.Pilerlog($"获取入库任务逻辑处理异常:{ex.Message}"); LogHelper.Error($"获取入库任务逻辑处理异常:{ex.Message}",ex); return null; } } } private IBaseServices locationInfoService = new BaseServices(); private void UpdateLocationStatus(string StoreCode,LocationArea locationArea,string locationCode, LocationStatus locationStatus) { try { var locationInfos = locationInfoService.Query(x => x.storeCode == StoreCode && x.locationArea == locationArea && x.locationCode == locationCode).Result; if (locationInfos != null) { BaseLocationInfo locationInfo = locationInfos.FirstOrDefault(); locationInfo.locationStatus = locationStatus; var isRes = locationInfoService.Update(locationInfo).Result; LogHelper.Pilerlog($"库位:{locationInfo.locationCode};状态:{locationStatus};更新{(isRes ? "成功" : "失败")}"); } } catch (Exception ex) { LogHelper.Pilerlog($"库位信息更新异常:{ex.Message}"); } } } }