| | |
| | | #endregion << ç æ¬ 注 é >> |
| | | |
| | | using AutoMapper; |
| | | using Microsoft.Extensions.Logging; |
| | | using Org.BouncyCastle.Math.EC; |
| | | using SqlSugar; |
| | | using System.ComponentModel; |
| | | using System.Net; |
| | | using System.Reflection; |
| | | using System.Reflection.Emit; |
| | | using System.Threading.Tasks; |
| | | using WIDESEA_Common.LocationEnum; |
| | | using WIDESEA_Common.OtherEnum; |
| | | using WIDESEA_Common.StockEnum; |
| | |
| | | using WIDESEA_Core; |
| | | using WIDESEA_Core.BaseRepository; |
| | | using WIDESEA_Core.BaseServices; |
| | | using WIDESEA_Core.Enums; |
| | | using WIDESEA_Core.Helper; |
| | | using WIDESEA_DTO.Inbound; |
| | | using WIDESEA_DTO.Task; |
| | |
| | | { |
| | | public partial class TaskService : ServiceBase<Dt_Task, IRepository<Dt_Task>>, ITaskService |
| | | { |
| | | private readonly ILogger<TaskService> _logger; |
| | | private readonly IMapper _mapper; |
| | | private readonly IUnitOfWorkManage _unitOfWorkManage; |
| | | private readonly IStockInfoService _stockInfoService; |
| | | private readonly ILocationInfoService _locationInfoService; |
| | | private readonly IWarehouseService _warehouseService; |
| | | private readonly IRoadWayinfoService _roadWayinfoService; |
| | | |
| | | private Timer _timer; |
| | | public IRepository<Dt_Task> Repository => BaseDal; |
| | | |
| | | private Dictionary<string, OrderByType> _taskOrderBy = new() |
| | |
| | | |
| | | public List<int> TaskOutboundTypes => typeof(TaskTypeEnum).GetEnumIndexList(); |
| | | |
| | | public TaskService(IRepository<Dt_Task> BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, ILocationInfoService locationInfoService, |
| | | public TaskService(ILogger<TaskService> logger, IRepository<Dt_Task> BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, ILocationInfoService locationInfoService, |
| | | IWarehouseService warehouseService, IRoadWayinfoService roadWayinfoService) : base(BaseDal) |
| | | { |
| | | _logger = logger; |
| | | _mapper = mapper; |
| | | _unitOfWorkManage = unitOfWorkManage; |
| | | _stockInfoService = stockInfoService; |
| | |
| | | private WebResponseContent HandleInboundTask(Dt_Task task, int wcsTaskType) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | switch (wcsTaskType) |
| | | try |
| | | { |
| | | case 1: |
| | | task.TaskStatus = (int)InTaskStatusEnum.PLC_InFinish; |
| | | int loctype = 0; |
| | | if (task.Roadway == "1" || task.Roadway == "2") |
| | | { |
| | | if(task.PalletType=="1") loctype = (int)LocationTypeEnum.SmallPallet; |
| | | else if(task.PalletType=="2") loctype = (int)LocationTypeEnum.MediumPallet; |
| | | } |
| | | else |
| | | { |
| | | loctype = (int)LocationTypeEnum.LargePallet; |
| | | } |
| | | //æ¥æ¾è´§ä½ï¼æ´æ°ä»»å¡ |
| | | Dt_LocationInfo dt_Location=_locationInfoService.GetLocation(task.Roadway, loctype); |
| | | Dt_LocationInfo ShallowCargoHold = _locationInfoService.ShallowGetLocation(dt_Location.RoadwayNo, dt_Location.LocationType, dt_Location.Row, dt_Location.Layer, dt_Location.Column); |
| | | if(ShallowCargoHold==null) return content.Error($"æªæ¾å°è¯¥è´§ä½ä¿¡æ¯,è´§ä½ç¼å·:{dt_Location.LocationCode}çæµ
è´§ä½"); |
| | | if(ShallowCargoHold.LocationStatus != (int)LocationStatusEnum.Free) return content.Error($"ä»»å¡å·ï¼{task.TaskId},æçç¼å·ï¼{task.PalletCode},æ¥æ¾çè´§ä½æµ
è´§ä½æè´§ï¼è´§ä½ç¼å·ï¼{ShallowCargoHold.LocationCode}"); |
| | | switch (wcsTaskType) |
| | | { |
| | | case 1: |
| | | |
| | | if(task.TargetAddress == "") |
| | | { |
| | | int loctype = 0; |
| | | if (task.Roadway == "1" || task.Roadway == "2") |
| | | { |
| | | if (task.PalletType == "1") loctype = (int)LocationTypeEnum.SmallPallet; |
| | | else if (task.PalletType == "2") loctype = (int)LocationTypeEnum.MediumPallet; |
| | | } |
| | | else |
| | | { |
| | | loctype = (int)LocationTypeEnum.LargePallet; |
| | | } |
| | | |
| | | task.TargetAddress = dt_Location.LocationCode; |
| | | task.CurrentAddress = task.NextAddress; |
| | | task.NextAddress= dt_Location.LocationCode; |
| | | task.TaskStatus = (int)InTaskStatusEnum.PLC_InFinish; |
| | | dt_Location.LocationStatus = (int)LocationStatusEnum.Lock; |
| | | //æ¥æ¾è´§ä½ï¼æ´æ°ä»»å¡ |
| | | Dt_LocationInfo dt_Location = _locationInfoService.GetLocation(task.Roadway, loctype); |
| | | Dt_LocationInfo ShallowCargoHold = _locationInfoService.ShallowGetLocation(dt_Location.RoadwayNo, dt_Location.LocationType, dt_Location.Row, dt_Location.Layer, dt_Location.Column); |
| | | if (ShallowCargoHold == null) return content.Error($"æªæ¾å°è¯¥è´§ä½ä¿¡æ¯,è´§ä½ç¼å·:{dt_Location.LocationCode}çæµ
è´§ä½"); |
| | | if (ShallowCargoHold.LocationStatus != (int)LocationStatusEnum.Free) return content.Error($"ä»»å¡å·ï¼{task.TaskId},æçç¼å·ï¼{task.PalletCode},æ¥æ¾çè´§ä½æµ
è´§ä½æè´§ï¼è´§ä½ç¼å·ï¼{ShallowCargoHold.LocationCode}"); |
| | | |
| | | _locationInfoService.UpdateData(dt_Location); |
| | | BaseDal.UpdateData(task); |
| | | return content.OK($"å·²æ¥æ¶å
¥åºè¾éçº¿å®æä¿¡æ¯ï¼ä»»å¡å·ï¼{task.TaskId},æçç¼å·ï¼{task.PalletCode}"); |
| | | |
| | | |
| | | case 2: |
| | | //䏿¥MESä»»å¡å®æ |
| | | MES_parameter mES_Parameter = InStoreDocCallback(task.TaskNum, "Finish", "æä½æå", task.PalletCode, task.TargetAddress); |
| | | if (mES_Parameter.Result == "Y") |
| | | { |
| | | task.TargetAddress = dt_Location.LocationCode; |
| | | task.CurrentAddress = task.NextAddress; |
| | | task.NextAddress = dt_Location.LocationCode; |
| | | task.TaskStatus = (int)InTaskStatusEnum.PLC_InFinish; |
| | | |
| | | task.TaskStatus = (int)InTaskStatusEnum.SC_OutFinish; |
| | | BaseDal.DeleteData(task); |
| | | return content.OK($"å·²æ¥æ¶å
¥åºå åæºå®æä¿¡æ¯ï¼ä»»å¡å·ï¼{task.TaskId},æçç¼å·ï¼{task.PalletCode}"); |
| | | } |
| | | else |
| | | { |
| | | return content.Error("ä¸ä¼ MES失败ï¼åå ï¼" + mES_Parameter.ResultMsg); |
| | | } |
| | | default: |
| | | return WebResponseContent.Instance.Error($"WCS䏿¥ç±»åé误ï¼{wcsTaskType}"); |
| | | dt_Location.LocationStatus = (int)LocationStatusEnum.Lock; |
| | | |
| | | Dt_StockInfo dt_StockInfo = new Dt_StockInfo(); |
| | | dt_StockInfo.PalletCode = task.PalletCode; |
| | | dt_StockInfo.PalletType = task.PalletType; |
| | | dt_StockInfo.WarehouseId = task.WarehouseId; |
| | | dt_StockInfo.LocationCode = dt_Location.LocationCode; |
| | | dt_StockInfo.StockStatus = (int)StockStatusEmun.å
¥åºä¸; |
| | | dt_StockInfo.Creater = "MWS"; |
| | | dt_StockInfo.CreateDate = DateTime.Now; |
| | | |
| | | _unitOfWorkManage.BeginTran(); |
| | | _stockInfoService.AddData(dt_StockInfo); |
| | | _locationInfoService.UpdateData(dt_Location); |
| | | BaseDal.UpdateData(task); |
| | | _unitOfWorkManage.CommitTran(); |
| | | return content.OK($"å·²æ¥æ¶å
¥åºè¾éçº¿å®æä¿¡æ¯ï¼ä»»å¡å·ï¼{task.TaskId},æçç¼å·ï¼{task.PalletCode}"); |
| | | } |
| | | else |
| | | { |
| | | string Resultplc = MesInTaskStatusEnum.å
¥åºå®æ.GetDescription(); |
| | | MES_parameter mES_PCLParameter = InStoreDocCallback(task.TaskNum, Resultplc, "æä½æå", task.PalletCode, task.TargetAddress); |
| | | if (mES_PCLParameter.Result == "Y") |
| | | { |
| | | task.TaskStatus = (int)InTaskStatusEnum.PLC_InFinish; |
| | | _unitOfWorkManage.BeginTran(); |
| | | BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.èªå¨å®æ : OperateTypeEnum.äººå·¥å®æ); |
| | | _unitOfWorkManage.CommitTran(); |
| | | return content.OK($"è¾é线任å¡å·²åé¦è³ä¸æ¸¸ï¼ä»»å¡å·ï¼{task.TaskId},æçç¼å·ï¼{task.PalletCode}"); |
| | | } |
| | | else |
| | | { |
| | | return content.Error("ä¸ä¼ MES失败ï¼åå ï¼" + mES_PCLParameter.ResultMsg); |
| | | } |
| | | } |
| | | case 2: |
| | | string Resultsc = MesInTaskStatusEnum.å
¥åºå®æ.GetDescription(); |
| | | //䏿¥MESä»»å¡å®æ |
| | | MES_parameter mES_Parameter = InStoreDocCallback(task.TaskNum, Resultsc, "æä½æå", task.PalletCode, task.TargetAddress); |
| | | if (mES_Parameter.Result == "Y") |
| | | { |
| | | Dt_StockInfo dt_Stockowc = _stockInfoService.Repository.QueryData(x => x.PalletCode == task.PalletCode).FirstOrDefault(); |
| | | Dt_LocationInfo dt_LocationInfo=_locationInfoService.Repository.QueryData(x => x.LocationCode == dt_Stockowc.LocationCode).FirstOrDefault(); |
| | | |
| | | dt_Stockowc.StockStatus = (int)StockStatusEmun.å·²å
¥åº; |
| | | dt_LocationInfo.LocationStatus = (int)LocationStatusEnum.InStock; |
| | | task.TaskStatus = (int)InTaskStatusEnum.InFinish; |
| | | |
| | | _unitOfWorkManage.BeginTran(); |
| | | _stockInfoService.UpdateData(dt_Stockowc); |
| | | _locationInfoService.UpdateData(dt_LocationInfo); |
| | | BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.èªå¨å®æ : OperateTypeEnum.äººå·¥å®æ); |
| | | _unitOfWorkManage.CommitTran(); |
| | | return content.OK($"å·²æ¥æ¶å
¥åºå åæºå®æä¿¡æ¯ï¼ä»»å¡å·ï¼{task.TaskId},æçç¼å·ï¼{task.PalletCode}"); |
| | | } |
| | | else |
| | | { |
| | | return content.Error("ä¸ä¼ MES失败ï¼åå ï¼" + mES_Parameter.ResultMsg); |
| | | } |
| | | default: |
| | | return content.Error($"WCS䏿¥ç±»åé误ï¼{wcsTaskType}"); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return content.Error($"WCSä»»å¡å®ææ¥å£æ
éï¼åå ï¼{ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | private WebResponseContent HandleOutboundTask(Dt_Task task, int wcsTaskType) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | switch (wcsTaskType) |
| | | try |
| | | { |
| | | case 1: |
| | | //䏿¥MESä»»å¡å®æ |
| | | MES_parameter mES_Parameter = OutStoreDocCallback(task.TaskNum, "Finish", "æä½æå"); |
| | | if (mES_Parameter.Result == "Y") |
| | | { |
| | | task.TaskStatus = (int)OutTaskStatusEnum.PLC_OutFinish; |
| | | BaseDal.DeleteData(task); |
| | | return content.OK($"å·²æ¥æ¶åºåºè¾éçº¿å®æä¿¡æ¯ï¼ä»»å¡å·ï¼{task.TaskId},æçç¼å·ï¼{task.PalletCode}"); |
| | | } |
| | | else |
| | | { |
| | | return content.Error("ä¸ä¼ MES失败ï¼åå ï¼" + mES_Parameter.ResultMsg); |
| | | } |
| | | case 2: |
| | | //è·å对åºPLCç«å°ä¿¡æ¯ |
| | | Dt_roadwayinfo _Roadwayinfo = _roadWayinfoService.QbtainPlatform(task.Roadway); |
| | | task.CurrentAddress = _Roadwayinfo.OutStationCode; |
| | | task.NextAddress = task.TargetAddress; |
| | | task.TaskStatus = (int)OutTaskStatusEnum.SC_OutFinish; |
| | | BaseDal.UpdateData(task); |
| | | return content.OK($"å·²æ¥æ¶åºåºå åæºå®æä¿¡æ¯ï¼ä»»å¡å·ï¼{task.TaskId},æçç¼å·ï¼{task.PalletCode}"); |
| | | default: |
| | | return content.Error($"WCS䏿¥ç±»åé误ï¼{wcsTaskType}"); |
| | | switch (wcsTaskType) |
| | | { |
| | | case 1: |
| | | string Resultplc = MesOutTaskStatusEnum.å°è¾¾ç®çå°.GetDescription(); |
| | | //䏿¥MESä»»å¡å®æ |
| | | MES_parameter mES_Parameter = OutStoreDocCallback(task.TaskNum, Resultplc, "æä½æå"); |
| | | if (mES_Parameter.Result == "Y") |
| | | { |
| | | task.TaskStatus = (int)OutTaskStatusEnum.PLC_OutFinish; |
| | | BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.èªå¨å®æ : OperateTypeEnum.äººå·¥å®æ); |
| | | return content.OK($"å·²æ¥æ¶åºåºè¾éçº¿å®æä¿¡æ¯ï¼ä»»å¡å·ï¼{task.TaskId},æçç¼å·ï¼{task.PalletCode}"); |
| | | } |
| | | else |
| | | { |
| | | return content.Error("ä¸ä¼ MES失败ï¼åå ï¼" + mES_Parameter.ResultMsg); |
| | | } |
| | | case 2: |
| | | //è·å对åºPLCç«å°ä¿¡æ¯ |
| | | Dt_roadwayinfo _Roadwayinfo = _roadWayinfoService.QbtainPlatform(task.Roadway); |
| | | task.CurrentAddress = _Roadwayinfo.OutStationCode; |
| | | task.NextAddress = task.TargetAddress; |
| | | task.TaskStatus = (int)OutTaskStatusEnum.SC_OutFinish; |
| | | |
| | | Dt_StockInfo dt_Stockowc = _stockInfoService.Repository.QueryData(x => x.PalletCode == task.PalletCode).FirstOrDefault(); |
| | | Dt_LocationInfo dt_LocationInfo = _locationInfoService.Repository.QueryData(x => x.LocationCode == dt_Stockowc.LocationCode).FirstOrDefault(); |
| | | |
| | | _unitOfWorkManage.BeginTran(); |
| | | _stockInfoService.DeleteData(dt_Stockowc); |
| | | _locationInfoService.DeleteData(dt_LocationInfo); |
| | | BaseDal.UpdateData(task); |
| | | _unitOfWorkManage.CommitTran(); |
| | | |
| | | |
| | | return content.OK($"å·²æ¥æ¶åºåºå åæºå®æä¿¡æ¯ï¼ä»»å¡å·ï¼{task.TaskId},æçç¼å·ï¼{task.PalletCode}"); |
| | | default: |
| | | return content.Error($"WCS䏿¥ç±»åé误ï¼{wcsTaskType}"); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return content.Error($"WCSä»»å¡å®ææ¥å£æ
éï¼åå ï¼{ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | private WebResponseContent HandleRelocationTask(Dt_Task task, int wcsTaskType) |
| | | { |
| | | WebResponseContent responseContent = new WebResponseContent(); |
| | | if (wcsTaskType == 2) |
| | | { |
| | | task.TaskStatus = (int)RelocationTaskStatusEnum.RelocationFinish; |
| | | BaseDal.UpdateData(task); |
| | | return WebResponseContent.Instance.OK($"å·²æ¥æ¶ç§»åºå åæºå®æä¿¡æ¯ï¼ä»»å¡å·ï¼{task.TaskId},æçç¼å·ï¼{task.PalletCode}"); |
| | | //䏿¥MESå åæºç§»åºä»»å¡ |
| | | string Resultplc = MesOutTaskStatusEnum.å°è¾¾ç®çå°.GetDescription(); |
| | | //䏿¥MESä»»å¡å®æ |
| | | MES_parameter mES_Parameter = AbnormalStorageLocation(task.PalletCode, task.SourceAddress, task.TargetAddress); |
| | | if (mES_Parameter.Result == "Y") |
| | | { |
| | | task.TaskStatus = (int)RelocationTaskStatusEnum.RelocationFinish; |
| | | BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.èªå¨å®æ : OperateTypeEnum.äººå·¥å®æ); |
| | | return WebResponseContent.Instance.OK($"å·²æ¥æ¶ç§»åºå åæºå®æä¿¡æ¯ï¼ä»»å¡å·ï¼{task.TaskId},æçç¼å·ï¼{task.PalletCode}"); |
| | | } |
| | | else |
| | | { |
| | | return responseContent.Error("ä¸ä¼ MES失败ï¼åå ï¼" + mES_Parameter.ResultMsg); |
| | | } |
| | | } |
| | | return WebResponseContent.Instance.Error($"WCS䏿¥ç±»åé误ï¼{wcsTaskType}"); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | } |
| | | } |