using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_Core.Enums; using WIDESEA_Core; using WIDESEA_DTO.Stock; using WIDESEA_Model.Models; using WIDESEA_Core.Helper; using Microsoft.AspNetCore.Http; using System.Reflection.Metadata; using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup; using System.Diagnostics; using Newtonsoft.Json; using System.Security.Policy; using static WIDESEA_ITaskInfoService.ITaskService; using MailKit.Search; using WIDESEA_Common.Log; using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime; namespace WIDESEA_TaskInfoService { public partial class TaskService { public string ReceiveWMSTask = WIDESEA_Core.Helper.AppSettings.Configuration["ReceiveWMSTask"]; /// /// 手动生成空托出库 /// /// /// public WebResponseContent EmptyOutbound(SaveModel saveModel) { try { int Materialweight = int.Parse(saveModel.MainData["cacheNo"].ToString()); int stackcount = int.Parse(saveModel.MainData["cachcount"].ToString()); List stockInfo = _stockService.StockInfoService.Repository.QueryData(x => x.Wlstatus == (int)InventoryMaterialStatus.空托).Take(stackcount).ToList(); //拿Materialweight当类型 List dt_Tasks = new List(); foreach (var item in stockInfo) { if (stockInfo == null) { return WebResponseContent.Instance.Error("未找到空托盘库存"); } Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == item.LocationCode); if (locationInfo == null) { return WebResponseContent.Instance.Error("未找到空托盘库存对应的货位信息"); } Dt_Task task = new Dt_Task() { CurrentAddress = item.LocationCode, Grade = 0, NextAddress = "1080", PalletCode = item.PalletCode, Roadway = "1", SourceAddress = item.LocationCode, TargetAddress = "1080", TaskStatus = OutTaskStatusEnum.OutNew.ObjToInt(), TaskType = TaskTypeEnum.Outbound.ObjToInt(), Depth = locationInfo.Depth, TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), Materialweight = item.Materialweight, WagonModel = item.WagonModel, //车号 WagonName = item.WagonName, //部件名称 Wagonnumber = item.Wagonnumber, //车型 Wagongroup = item.Wagongroup, //车组号 }; int beforeStatus = locationInfo.LocationStatus; item.StockStatus = StockStatusEmun.出库锁定.ObjToInt(); locationInfo.LocationStatus = LocationStatusEnum.PalletLock.ObjToInt(); _stockService.StockInfoService.UpdateData(item); _basicService.LocationInfoService.UpdateData(locationInfo); _basicService.LocationInfoService.UpdateLocationLock(locationInfo, task.TaskNum, StockChangeType.Outbound.ObjToInt(), false); _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Outbound.ObjToInt(), "", task.TaskNum); dt_Tasks.Add(task); } _unitOfWorkManage.BeginTran(); var responses = HttpHelper.Post(ReceiveWMSTask, dt_Tasks, "下发任务入库"); BaseDal.AddData(dt_Tasks); _unitOfWorkManage.CommitTran(); return WebResponseContent.Instance.OK("呼叫成功"); } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } /// /// 人工手动出库(删除库存) /// /// /// public WebResponseContent ManualOutboundDeleteinventory(SaveModel saveModel) { WebResponseContent content = new WebResponseContent(); try { List dtstockt = new List(); List locations = new List(); for (int i = 0; i < saveModel.DelKeys.Count; i++) { Dt_StockInfo stockt = _stockService.StockInfoService.Repository.QueryFirst(x => x.PalletCode == saveModel.DelKeys[i].ToString()); if (stockt.StockStatus == (int)StockStatusEmun.已入库) { Dt_LocationInfo locationinfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == stockt.LocationCode); Dt_Task_Hty task_Hty = new Dt_Task_Hty() { TaskNum = 001, PalletCode = stockt.PalletCode, Roadway = locationinfo.RoadwayNo, TaskType = (int)TaskTypeEnum.Outbound, TaskStatus = (int)OutTaskStatusEnum.OutFinish, SourceAddress = locationinfo.LocationCode, TargetAddress = locationinfo.LocationCode, CurrentAddress = locationinfo.LocationCode, NextAddress = locationinfo.LocationCode, Grade = 1, Dispatchertime = DateTime.Now, Creater = App.User.UserName, CreateDate = DateTime.Now, ModifyDate = DateTime.Now, Modifier = App.User.UserName, Remark = "人工出库", PLCTo = 1, PalletCodequantity = 1, MaterialType = 1 }; _taskHtyService.AddData(task_Hty); locationinfo.LocationStatus = LocationStatusEnum.Free.ObjToInt(); dtstockt.Add(stockt); locations.Add(locationinfo); WriteLog.GetLog("人工手动删除库存信息").Write($"托盘条码:{stockt.PalletCode},库位编号:{stockt.LocationCode}", $"人工出库库存"); } else { return content = WebResponseContent.Instance.Error($"出库失败,该库存信息不可进行出库"); } } _unitOfWorkManage.BeginTran(); _stockService.StockInfoService.Repository.DeleteData(dtstockt); _basicService.LocationInfoService.Repository.UpdateData(locations); _unitOfWorkManage.CommitTran(); content = WebResponseContent.Instance.OK("手动出库成功"); return content; } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return content = WebResponseContent.Instance.Error($"手动出库信息失败,报错信息:{ex.Message}"); throw; } } /// /// 任务取消 /// /// /// public WebResponseContent Cancelinventory(int taskNum) { WebResponseContent content = new WebResponseContent(); Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); if(task != null) { if(task.TaskType== (int)TaskTypeEnum.Outbound || task.TaskType == (int)TaskTypeEnum.PalletOutbound || task.TaskType == (int)TaskTypeEnum.PalletMaintenanceout) { //处理出库的逻辑 Dt_LocationInfo locationinfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress); if (locationinfo.LocationStatus == LocationStatusEnum.Lock.ObjToInt()) { locationinfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt(); } if (locationinfo.LocationStatus == LocationStatusEnum.PalletLock.ObjToInt()) { locationinfo.LocationStatus = LocationStatusEnum.Pallet.ObjToInt(); } _basicService.LocationInfoService.Repository.UpdateData(locationinfo); Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.QueryFirst(x => x.PalletCode == task.PalletCode); stockInfo.StockStatus = (int)StockStatusEmun.已入库; _stockService.StockInfoService.Repository.UpdateData(stockInfo); BaseDal.DeleteData(task); BaseDal.DeleteAndMoveIntoHty(task, OperateType.人工删除); WriteLog.GetLog("任务日志").Write($"出库任务取消成功,托盘条码:{task.PalletCode}", $"任务取消"); WebResponseContent webResponseContent = HttpHelper.Post(ReceiveWCSTask, task.TaskNum, "任务删除"); return content = WebResponseContent.Instance.Error($"出库任务取消成功"); } else if(task.TaskType == (int)TaskTypeEnum.Inbound || task.TaskType == (int)TaskTypeEnum.PalletInbound /*|| task.TaskType == (int)TaskTypeEnum.PalletMaintenancein*/) { //处理出库的逻辑 Dt_LocationInfo locationinfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress); if (locationinfo.LocationStatus == LocationStatusEnum.Lock.ObjToInt() || locationinfo.LocationStatus == LocationStatusEnum.PalletLock.ObjToInt()) { locationinfo.LocationStatus = LocationStatusEnum.Free.ObjToInt(); } _basicService.LocationInfoService.Repository.UpdateData(locationinfo); Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.QueryFirst(x => x.PalletCode == task.PalletCode); _stockService.StockInfoService.Repository.DeleteData(stockInfo); BaseDal.DeleteData(task); BaseDal.DeleteAndMoveIntoHty(task, OperateType.人工删除); WriteLog.GetLog("任务日志").Write($"入库任务取消成功,托盘条码:{task.PalletCode}", $"任务取消"); WebResponseContent webResponseContent = HttpHelper.Post(ReceiveWCSTask, task.TaskNum, "任务删除"); return content = WebResponseContent.Instance.Error($"入库任务取消成功"); } else if (task.TaskType == (int)TaskTypeEnum.RelocationIn) //库内移库 { //处理出库的逻辑 Dt_LocationInfo locationinfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress); if (locationinfo.LocationStatus == LocationStatusEnum.Lock.ObjToInt() || locationinfo.LocationStatus == LocationStatusEnum.PalletLock.ObjToInt()) { locationinfo.LocationStatus = LocationStatusEnum.Free.ObjToInt(); } _basicService.LocationInfoService.Repository.UpdateData(locationinfo); Dt_LocationInfo locationinfo2 = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress); if (locationinfo2.LocationStatus == LocationStatusEnum.Lock.ObjToInt()) { locationinfo2.LocationStatus = LocationStatusEnum.InStock.ObjToInt(); } if (locationinfo2.LocationStatus == LocationStatusEnum.PalletLock.ObjToInt()) { locationinfo2.LocationStatus = LocationStatusEnum.Pallet.ObjToInt(); } _basicService.LocationInfoService.Repository.UpdateData(locationinfo2); Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.QueryFirst(x => x.PalletCode == task.PalletCode); stockInfo.StockStatus = (int)StockStatusEmun.已入库; _stockService.StockInfoService.Repository.UpdateData(stockInfo); Dt_StockInfoDetail stocktdetail = _stockService.StockInfoDetailService.Repository.QueryFirst(x => x.StockId == stockInfo.Id); if (stocktdetail != null) { stocktdetail.Status = (int)StockStatusEmun.已入库; _stockService.StockInfoDetailService.Repository.UpdateData(stocktdetail); } BaseDal.DeleteData(task); BaseDal.DeleteAndMoveIntoHty(task, OperateType.人工删除); WriteLog.GetLog("任务日志").Write($"入库任务取消成功,托盘条码:{task.PalletCode}", $"任务取消"); WebResponseContent webResponseContent = HttpHelper.Post(ReceiveWCSTask, task.TaskNum, "任务删除"); return content = WebResponseContent.Instance.Error($"入库任务取消成功"); } else { return content = WebResponseContent.Instance.Error($"该任务的任务类型异常,取消失败"); } } else { return content = WebResponseContent.Instance.Error($"未找到任务号"); } } /// /// 检修出库方法 /// /// /// public WebResponseContent ManualOutbound(SaveModel saveModel) { WebResponseContent content = new WebResponseContent(); try { List dtstockt = new List(); List locations = new List(); List taskdt = new List(); List stocktData = _stockService.StockInfoService.Repository.QueryData(x => x.StockStatus == (int)StockStatusEmun.已入库); List locationinfoData = _basicService.LocationInfoService.Repository.QueryData(x => x.LocationStatus == LocationStatusEnum.InStock.ObjToInt()); string json = saveModel.DelKeys[0].ToString(); List palletCodes = JsonConvert.DeserializeObject>(json); int crttask= _sys_CreateTask.QtCreatea(saveModel.DelKeys[1].ToString()); if (crttask == 2) { return content = WebResponseContent.Instance.Error($"该站台出入任务已满,不可出库"); } if (palletCodes.Count >2) { return content = WebResponseContent.Instance.Error($"最多一个站台只可出库两个"); } foreach (var palletCode in palletCodes) { Dt_StockInfo stockt = stocktData.FirstOrDefault(x => x.PalletCode == palletCode); if (stockt != null) { if (stockt.StockStatus == (int)StockStatusEmun.已入库 && (stockt.Wlstatus == (int)InventoryMaterialStatus.半检修 || stockt.Wlstatus == (int)InventoryMaterialStatus.待修)) { Dt_LocationInfo locationinfo = locationinfoData.FirstOrDefault(x => x.LocationCode == stockt.LocationCode); if (locationinfo != null) { stockt.StockStatus = (int)StockStatusEmun.检修出库锁定; if (locationinfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt()) { locationinfo.LocationStatus = LocationStatusEnum.Lock.ObjToInt(); } //添加检修任务观看 Sys_CreateTask sys_Create = new Sys_CreateTask() { Current_PalletCode= stockt.PalletCode, Current_Carset= stockt.Wagongroup, Current_Models = stockt.Wagonnumber, Current_Parts = stockt.WagonName, Current_count = stockt.Materialweight, Current_Vehiclenumber = stockt.WagonModel, Current_Static = (int)StockStatusEmun.检修出库锁定, Creater = App.User.UserName, CreateDate = DateTime.Now, CreateSta= saveModel.DelKeys[1].ToString(), }; //添加进行维修记录 Dt_Repair dt_Repair = new Dt_Repair() { Current_PalletCode = stockt.PalletCode, Current_Carset = stockt.Wagongroup, Current_Models = stockt.Wagonnumber, Current_Parts = stockt.WagonName, Current_count = stockt.Materialweight, Current_Vehiclenumber = stockt.WagonModel, Current_Static = (int)StockStatusEmun.检修出库锁定, Creater = App.User.UserName, CreateDate = DateTime.Now, CreateSta = saveModel.DelKeys[1].ToString(), }; Dt_Task dt_Task = new() { PalletCode = stockt.PalletCode, TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), Roadway = locationinfo.RoadwayNo, TaskType = TaskTypeEnum.PalletMaintenanceout.ObjToInt(), TaskStatus = AGVTaskStatusEnum.AGVout_Executing.ObjToInt(), SourceAddress = locationinfo.LocationCode, TargetAddress = saveModel.DelKeys[1].ToString(), CurrentAddress = locationinfo.LocationCode, NextAddress = saveModel.DelKeys[1].ToString(), Grade = 1, Creater = App.User.UserName, Depth = locationinfo.Depth, CreateDate = DateTime.Now, PLCTo = int.Parse(saveModel.DelKeys[1].ToString()), MaterialType = stockt.MaterialType, Materialweight = stockt.Materialweight, WagonModel = stockt.WagonModel, //车号 WagonName = stockt.WagonName, //部件名称 Wagonnumber = stockt.Wagonnumber, //车型 Wagongroup = stockt.Wagongroup //车组号 }; _sys_CreateTask.AddData(sys_Create); _dtRepair.AddData(dt_Repair); dtstockt.Add(stockt); locations.Add(locationinfo); taskdt.Add(dt_Task); } else { return content = WebResponseContent.Instance.Error($"出库失败,未找到对应的库位信息,请核对!!!,出库条码:{palletCode}"); } } else { return content = WebResponseContent.Instance.Error($"出库失败,请选择已入库且(待修或半检修)的物料出库!!!,出库条码:{palletCode}"); } } else { return content = WebResponseContent.Instance.Error($"出库失败,未找到对应条码的库存信息,出库条码:{palletCode}"); } } _unitOfWorkManage.BeginTran(); if (dtstockt.Count > 0) { _stockService.StockInfoService.Repository.UpdateData(dtstockt); _basicService.LocationInfoService.Repository.UpdateData(locations); BaseDal.AddData(taskdt); } _unitOfWorkManage.CommitTran(); var responses = HttpHelper.Post(ReceiveWMSTask, taskdt, "下发任务入库"); content = WebResponseContent.Instance.OK($"出库成功,出库总数:{palletCodes.Count},成功数量:{dtstockt.Count}"); return content; } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return content = WebResponseContent.Instance.Error($"出库失败,报错信息:{ex.Message}"); throw; } } public WebResponseContent ManualOutbound2(SaveModel saveModel) { WebResponseContent content = new WebResponseContent(); try { List dtstockt = new List(); List locations = new List(); List taskdt = new List(); List stocktData = _stockService.StockInfoService.Repository.QueryData(x => x.StockStatus == (int)StockStatusEmun.已入库); List locationinfoData = _basicService.LocationInfoService.Repository.QueryData(x => x.LocationStatus == LocationStatusEnum.InStock.ObjToInt()); string json = saveModel.DelKeys[0].ToString(); if (!json.StartsWith("[") && !json.EndsWith("]")) { json = $"[{json}]"; } List palletCodes = JsonConvert.DeserializeObject>(json); foreach (var palletCode in palletCodes) { Dt_StockInfo stockt = stocktData.FirstOrDefault(x => x.PalletCode == palletCode); if (stockt != null) { if (stockt.StockStatus == (int)StockStatusEmun.已入库 && (stockt.Wlstatus == (int)InventoryMaterialStatus.已修 || stockt.Wlstatus == (int)InventoryMaterialStatus.合格)) { Dt_LocationInfo locationinfo = locationinfoData.FirstOrDefault(x => x.LocationCode == stockt.LocationCode); if (locationinfo != null) { stockt.StockStatus = (int)StockStatusEmun.出库锁定; if (locationinfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt()) { locationinfo.LocationStatus = LocationStatusEnum.Lock.ObjToInt(); } Dt_Task dt_Task = new() { PalletCode = stockt.PalletCode, TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), Roadway = locationinfo.RoadwayNo, TaskType = TaskTypeEnum.Outbound.ObjToInt(), TaskStatus = InTaskStatusEnum.InNew.ObjToInt(), SourceAddress = locationinfo.LocationCode, TargetAddress = "1070", CurrentAddress = locationinfo.LocationCode, NextAddress = "1070", Grade = 1, Creater = App.User.UserName, Depth = locationinfo.Depth, CreateDate = DateTime.Now, PLCTo = 1, MaterialType = stockt.MaterialType, Materialweight = stockt.Materialweight, WagonModel = stockt.WagonModel, //车号 WagonName = stockt.WagonName, //部件名称 Wagonnumber = stockt.Wagonnumber, //车型 Wagongroup = stockt.Wagongroup //车组号 }; dtstockt.Add(stockt); locations.Add(locationinfo); taskdt.Add(dt_Task); } else { return content = WebResponseContent.Instance.Error($"出库失败,未找到对应的库位信息,请核对!!!,出库条码:{palletCode}"); } } else { return content = WebResponseContent.Instance.Error($"出库失败,请选择已入库且(待修或半检修)的物料出库!!!,出库条码:{palletCode}"); } } else { return content = WebResponseContent.Instance.Error($"出库失败,未找到对应条码的库存信息,出库条码:{palletCode}"); } } _unitOfWorkManage.BeginTran(); if (dtstockt.Count > 0) { _stockService.StockInfoService.Repository.UpdateData(dtstockt); _basicService.LocationInfoService.Repository.UpdateData(locations); BaseDal.AddData(taskdt); } _unitOfWorkManage.CommitTran(); var responses = HttpHelper.Post(ReceiveWMSTask, taskdt, "下发任务入库"); content = WebResponseContent.Instance.OK($"出库成功,出库总数:{palletCodes.Count},成功数量:{dtstockt.Count}"); return content; } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return content = WebResponseContent.Instance.Error($"出库失败,报错信息:{ex.Message}"); throw; } } } }